一、APK编译打包生成过程
第一步:打包资源文件,生成R.java文件
【输入】Resource文件(就是工程中res中的文件)、Assets文件(相当于另外一种资源,这种资源Android系统并不像对res中的文件那样优化它)、AndroidManifest.xml文件(包名就是从这里读取的,因为生成R.java文件需要包名)、Android基础类库(Android.jar文件)
【输出】打包好的资源(一般在Android工程的bin目录可以看到一个叫resources.ap_的文件就是它了)、R.java文件(在gen目录中,大家应该很熟悉了)
【工具】aapt工具,它的路径在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系统,按惯例路径应该这样写:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。
第二步:处理AIDL文件,生成对应的.java文件(当然,有很多工程没有用到AIDL,那这个过程就可以省了)
【输入】源码文件、aidl文件、framework.aidl文件
【输出】对应的.java文件
【工具】aidl工具
第三步:编译Java文件,生成对应的.class文件
【输入】源码文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件)
【输出】.class文件
【工具】javac工具
第四步:把.class文件转化成Davik VM支持的.dex文件
【输入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),库文件(.jar文件)
【输出】.dex文件
【工具】javac工具
第五步:打包生成未签名的.apk文件
【输入】打包后的资源文件、打包后类文件(.dex文件)、libs文件(包括.so文件,当然很多工程都没有这样的文件,如果你不使用C/C++开发的话)
【输出】未签名的.apk文件
【工具】apkbuilder工具
第六步:对未签名.apk文件进行签名
【输入】未签名的.apk文件
【输出】签名的.apk文件
【工具】jarsigner
第七步:对签名后的.apk文件进行对齐处理(不进行对齐处理是不能发布到 Google Market 的)
【输入】签名后的.apk文件
【输出】对齐后的.apk文件
【工具】zipalign工具
二、名词解释
虽然 Android 程序由 Java 编写,但是不是运行在 Java 虚拟机上,而是运行在 Dalvik 虚拟机上。
传统的 Java 程序经过编译,生成 Java 字节码保存在 class 文件中,Java 虚拟机通过解码 class 文件中的内容来运行程序。而 Dalvik 虚拟机运行的是 Dalvik 字节码,所有的 Dalvik 字节码由 Java 字节码转换而来,并被打包到一个 DEX 可执行文件中。Dalvik 虚拟机通过解释 DEX 文件来执行这些字节码。
class 文件是 Java 文件编译后生成的可以执行的 Java 字节码文件,是 Java 虚拟机的可执行文件。
dex 文件是 Android 字节码文件(机器语言),是 Dalvik 虚拟机可执行文件,对比 class 文件由 Java 虚拟机执行。(目标程序)
smali文件(语言) 是将 Android 字节码用可阅读的字符串形式表现出来的一种语言,可以称之为 Android 字节码的反汇编语言。使用 baksmali或 apktool 可以将 Android 应用程序包(apk 或 jar)反汇编为 smali 代码。文件里面存放的是 smali 汇编代码。(汇编代码)
反汇编就是输入二进制文件或可执行文件输出汇编代码的过程,反编译通常是输出高级语言。
逆向过程
方法一、APK 解压生成 dex 文件,用 dex2jar 得到 jar 文件,用 jd-gui 查看 jar 文件源代码。
方法二、用 Apktool 反编译 APK 得到 smali 文件,修改 smali 代码,重新打包成 APK。
学好 smali 这门汇编语言是逆向的基础.