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的根目录,指的是对应的android版本。

由于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目录。