首页
社区
课程
招聘
[原创]安卓代码跟踪方式学习笔记
发表于: 2014-12-4 13:49 35986

[原创]安卓代码跟踪方式学习笔记

2014-12-4 13:49
35986

分享一下学习过程中的心得,主要献给和我一样起步晚又对安卓产生浓烈兴趣的童鞋们!

一、代码跟踪的介绍&使用工具

代码跟踪常用于调试程序中,跟踪并了解程序的执行轨迹和执行逻辑。这样来说,对Java这样的高级语言来说,我们容易理解也容易调试。但是像一些低级语言,例如ASM、Smali来说难度就很大了,因为反汇编这样的语言,我们需要一次性记住很多乱七八糟的关键词才能成功,因而代码跟踪的技术就诞生了,并且在一些大程序中的运用更为广泛,同时也是现在逆向一些大而复杂的Android -app极为重要的一种手段。
相信很多人都玩过PC端,对OD的动态调试也应该特别熟悉。OD很强大,其中的F2(断点),F8(单步走)使得调试程序事半功倍,我相信用过得没有说不好的吧。而Android-app与PC software的性质是不同的。在Android-app里是把Apk文件Dump成字节码,分析,修改,再重新编译。有一个很大的不同点就是Android-app但是正是由于开源,使得Dump出来的字节码是“死”的,这是Java的一个特性。幸运的是,Apktool很好的解决了这个问题,它的出现使得Android-app的调试得到了转机,受益的是大家。
既然不能进行完全的调试,想到的办法是用系统的log函数来呈现程序运行到关键时候的关键信息来达到相应的效果。比如说,你想知道程序运行到某个时候某个变量里装的是什么,就可以用log的方式显示。
获取Android程序的log信息一共有几种方式。最好的选择当时是用DDMS,因为它和Android SDK是一伙的!它可以显示很多系统的log信息以及一些其他的乱七八糟的信息。同时,可以设置过滤器来进行标签过滤、log等级(error,warning,info,debug,verbose)过滤、进程过滤,也能结束进程。相当强大。如图:

二、跟踪方法

1.Logging大法
因为Apps没有控制台所以它们只能通过Android 的API中的log函数来进行输出。
关于android/util/Log的介绍如下:
Log extends Object
一共有5个方法:Log.v() Log.d() Log.i() Log.w() and Log.e(),它们分别对应:
int        ASSERT        Priority constant for the println method.
int        DEBUG        Priority constant for the println method; use Log.d.
int        ERROR        Priority constant for the println method; use Log.e.
int        INFO        Priority constant for the println method; use Log.i.
int        VERBOSE        Priority constant for the println method; use Log.v.
int        WARN        Priority constant for the println method; use Log.w
Log.d一般来说是用的最多的。(本来log.v是最多的,但是log.v并不参加编译)
写一个测试类来分析Java代码如下:

public class Log {
	public Log() {}
	
	public static void Log(String msg)
	{
		Log(msg, "Log");
	}
	
	public static void Log(Object XX)
	{
		Log("Log", XX.toString());
	}
	
	public static void Log(Object XX, String tag)
	{
		Log(tag, XX.toString());
	}
	
	public static void Log(String tag, String msg)
	{
		Log.d(tag, msg);
	}
	
	public static void ToastLog(Context contx, String msg, int duration)
	{
		Toast.makeText(contx, msg, duration).show();
	}
}
# direct methods
.method public constructor <init>()V
    .registers 1

    .prologue
    .line 8
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static Log(Ljava/lang/Object;)V
    .registers 3
    .parameter "XX"

    .prologue
    .line 17
    const-string v0, "Log"

    invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-static {v0, v1}, Lcom/Ericky/Log;->Log(Ljava/lang/String;Ljava/lang/String;)V

    .line 18
    return-void
.end method

.method public static Log(Ljava/lang/Object;Ljava/lang/String;)V
    .registers 3
    .parameter "XX"
    .parameter "tag"

    .prologue
    .line 22
    invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {p1, v0}, Lcom/Ericky/Log;->Log(Ljava/lang/String;Ljava/lang/String;)V

    .line 23
    return-void
.end method

.method public static Log(Ljava/lang/String;)V
    .registers 2
    .parameter "msg"

    .prologue
    .line 12
    const-string v0, "Log"

    invoke-static {v0, p0}, Lcom/Ericky/Log;->Log(Ljava/lang/String;Ljava/lang/String;)V

    .line 13
    return-void
.end method

.method public static Log(Ljava/lang/String;Ljava/lang/String;)V
    .registers 2
    .parameter "tag"
    .parameter "msg"

    .prologue
    .line 28
    invoke-static {p0, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 29
    return-void
.end method

.method public static ToastLog(Landroid/content/Context;Ljava/lang/String;)V
    .registers 3
    .parameter "contx"
    .parameter "msg"

    .prologue
    .line 33
    const/4 v0, 0x5

    invoke-static {p0, p1, v0}, Lcom/Ericky/Log;->ToastLog(Landroid/content/Context;Ljava/lang/String;I)V

    .line 34
    return-void
.end method

.method public static ToastLog(Landroid/content/Context;Ljava/lang/String;I)V
    .registers 4
    .parameter "contx"
    .parameter "msg"
    .parameter "duration"

    .prologue
    .line 40
    invoke-virtual {p0}, Landroid/content/Context;->getApplicationContext()Landroid/content/Context;

    .line 41
    invoke-static {p0, p1, p2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/Toast;->show()V

    .line 42
    return-void
.end method
.method public static Log(Ljava/lang/Object;)V
    .registers 3
.parameter "XX"

    .prologue
    .line 17
    const-string v0, "Log"

    invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-static {v0, v1}, Lcom/Ericky/Log;->Log(Ljava/lang/String;Ljava/lang/String;)V

    .line 18
    return-void
.end method

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (21)
雪    币: 349
活跃值: (125)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
感谢分享、收藏了
2014-12-4 14:03
0
雪    币: 1185
活跃值: (458)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
3
不客气  一起学习~
2014-12-4 14:17
0
雪    币: 22
活跃值: (199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
写的很详细,学习了,收藏一下!
2014-12-4 16:51
0
雪    币: 1185
活跃值: (458)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
5
一起学习~共同进步
2014-12-4 17:03
0
雪    币: 4687
活跃值: (253)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
又来入门新帖,支持!!!!!
2014-12-5 09:28
0
雪    币: 1185
活跃值: (458)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
7
因为准备入门~嘿嘿
2014-12-5 12:33
0
雪    币: 24
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看了完全在云里雾里,不明白
2014-12-5 13:40
0
雪    币: 1185
活跃值: (458)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
9
可以先看看入门的那本书
2014-12-5 13:58
0
雪    币: 24
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学这个应该要懂JAVA吧?
2014-12-11 10:03
0
雪    币: 1185
活跃值: (458)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
11
不一定 C++也可以
2014-12-11 11:11
0
雪    币: 184
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
很详细,学习了
2014-12-11 17:47
0
雪    币: 110
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我是突然看到的。。。。。。。。。。。
2014-12-12 22:58
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
欢迎入坑
2014-12-18 15:48
0
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主写的很不错,多谢分享。
2014-12-18 18:54
0
雪    币: 144
活跃值: (178)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
多谢分享,很有用
2015-1-26 11:13
0
雪    币: 8
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢谢楼主分享
2015-3-10 15:48
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习了,这个工具我用过,不过还没那么深入了解
2015-3-13 15:02
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
多想楼主,学习了
2016-3-5 14:57
0
雪    币: 1110
活跃值: (569)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
20
大神,关于栈跟踪方面有一点不懂,我知道了栈可以显示一些信息,但是不知道怎么使用栈
2017-12-27 08:49
0
雪    币: 1185
活跃值: (458)
能力值: ( LV13,RANK:360 )
在线值:
发帖
回帖
粉丝
21
wx_晴天下的雨 大神,关于栈跟踪方面有一点不懂,我知道了栈可以显示一些信息,但是不知道怎么使用栈
具体的问题?Printstack?
2018-1-24 14:42
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
多线程容易导致断点失效
2020-3-27 06:41
0
游客
登录 | 注册 方可回帖
返回
//