dex2jar
dex2jar的最新版下载地址http://sourceforge.net/projects/dex2jar/,这里使用的是2.0版本。
dex2jar是一款开源工具,主要用于把dex转换为jar,同样的,也可以把jar转换为dex。
下面命令可把classes.dex转换为tmp.jar:
1 | $DEX2JAR_PATH/d2j-dex2jar.sh -f classes.dex -o tmp.jar |
注意$DEX2JAR_PATH指的是dex2jar的根目录,这里用的是.sh,在windows下改为.bat即可。其中-f代表输入,-o代表输入。
下面命令可把tmp.jar转换为classes.dex:
1 | $DEX2JAR_PATH/d2j-jar2dex.sh -o classes.dex -f tmp.jar |
aapt
aapt工具可用来打包或解析apk中的资源文件,android应用打包成apk的过程中,需要使用到aapt。该工具位于$ANDROID_SDK/build-tools/android-
注意$ANDROID_SDK指的是android sdk的根目录,
由于aapt的用法较多,这里只介绍一个简单的用法,具体请参考aapt帮助信息。
有些情况下,我们希望能够很方便地得到某apk的包名、版本号、启动activity等信息,这时可以使用下面命令来得到:
1 | aapt d badging <apk path> |
例如这里我想得到qqpim.apk(手机管家应用)的包名:
1 | aapt d badging qqpim.apk | grep package |
输出结果:
1 | package: name='com.tencent.qqpimsecure' versionCode='1011' versionName='5.3.0' |
其中,d为decode的意思
apktool
apktool用来反编译或重打包apk,在需要修改apk文件时非常有用。
下载地址:http://code.google.com/p/android-apktool/downloads/list
apktool中使用aapt工具来解析或打包资源文件,使用smali/baksmali库(将在2.3章介绍)来编译或反编译dex。
使用下面命令可以把qqpim.apk反编译到tmp目录下:
1 | apktool d qqpim.apk tmp |
使用下面命令可以把tmp目录重新打包成tmp.apk:
1 | apktool b tmp tmp.apk |
其中,d为decode的意思,b为build的意思
zipalign
zipalign能够对apk文件进行对齐优化,使得apk在android系统中运行得更快。
zipalign位于aapt所在目录下,一般会在重打包apk后使用,命令如下:
1 | zipalign -f 4 old.apk new.apk |
其中-f代表如果存在,则覆盖。4代表按4字节对齐,一般用于32位系统。
javap
javap工具是java自带反编译工具,位于$JAVA_HOME/bin/目录下。
假设我们需要反汇编cn.nover.Test这个类,注意,此时Test.class应该在./cn/nover/下。这里我们输入以下命令,即可反汇编出Test类的所有bytecode:
1 | javap -c -p cn.nover.Test |
其中-c代表对代码进行反编译,-p代表显示所有方法和成员。
另外还可以使用-s选项得到方法的签名,如
1 | javap -s cn.nover.Test |
另外反编译还可以使用像jd-gui这类工具,直接反编译出相应的java代码,当然jd-gui对于很多复杂的代码也是无能为力的,这里只能自己分析字节码了。
bytecode插件
在eclipse和android studio等都有一款ASM bytecode online插件,可以很方便的研究bytecode与ASM(将在下一章中介绍)。
eclipse下的ASM bytecode online插件
我们看到,只要光标在相应的代码上,bytecode插件就会自动定位到相应的bytecode代码中,很方便吧~
另外还看到有个ASM的选项,选中后会显示对应的ASM代码。如下图所示:
android studio下的ASM bytecode online插件
ASM代码看不懂没关系,我会在2.3章中详细介绍。
android-ndk
NDK是用来开发JNI的一套工具集,开发语言为C/C++。
如何编译JNI程序请自行到网上查资料,这里我说一下如何通过JNI Crash时报的日志来定位出错行号:
1、使用NDK根目录下有一个ndk-stack工具:
1 | adb shell logcat | ndk-stack -sym $PROJECT_PATH/obj/local/armeabi |
或
1 | adb shell logcat > 1.log && ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump 1.log |
2、使用toolchains工具集中相应的addr2line工具:
1 | $NDK_PATH/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-addr2line -e $PROJECT_PATH/obj/local/armeabi/xx.so 000014d5 |
其中xx.so是对应的so文件,000014d5是报错的地址。
arm-linux-androideabi-4.8与linux-x86_64这两个目录都是与系统相关的,Windows平台的童鞋请选择相应的Windows目录。