天天看点

[android]MonkeyRunner-andrec实现思路

1.使用apktool.jar反编译某个apk 命令为:java -jar apktool.jar d -d -f testrecord.apk /tmp/tmpvpjytg 

2.分析androidmanifest.xml文件得到apk的mainactivity名 

2-3中间会分析smali目录下的r$id.smali文件,获取到apk的包名,并且可以拼到com.example/.testrecordactivity类似的monkeyrunner所需要的启动包名称,还可以获取到所有的静态在xml中的layout元素id以及name的map关系 

3.使用java -jar apktool.jar b -d -f /tmp/tmpvpjytg /tmp/tmpvpjytg/out.apk重新打包apk,输出out.apk文件 

4.给out.apk重新签名,jarsigner -verbose -keystore debug.keystore -storepass andrec -keypass andrec /tmp/tmpvpjytg/out.apk andrecdebugkey 

5.重新优化apk提高apk与android系统的交互效率/home/eamon/android-sdk/android-sdk-linux_x86/tools/zipalign -v -f 4 /tmp/tmpvpjytg/out.apk /tmp/tmpvpjytg/out-aligned.apk,优化后得到out-aligned.apk文件 

6.开启debug主activity,使用命令:/home/eamon/android-sdk/android-sdk-linux_x86/platform-tools/adb shell am start -d -w -n com.example/.testrecordactivity(这里通过分离文件得到文件内相应的方法来获取如何debug某一个方法例如onclick)此命令可以启动某一个activity 

6-7之间需要知道的adb jdwp获取手机内testrecord应用的pid,此时再利用adb shell ps 以及刚刚获取到得apk包名,确认这个pid 

7.链接远程debug手机端android虚拟机 

connecting debugger... 

debug:root:/home/eamon/android-sdk/android-sdk-linux_x86/platform-tools/adb forward tcp:3977 jdwp:632 

其中adb forward实现原理为socket通信,虚拟机内debug信息会通信给本机3977端口 

下面解析record是如何制作的: 

record的制作是借取了adb shell am 的debug方法,加之jdb的远程调试,见我的android栏中的jdb相关文章 

andrec实现中遇到的断点debug中采用的是http://blog.csdn.net/ariesjzj/article/details/7393573文章中的第二种方法来实现的。

继续阅读