Google推出AS已经有一段时间,官方文档中也已经开始推荐使用AndroidStudio。不过,从eclipse转向AndroidStudio似乎并没有那么容易,最近开始尝试用AndroidStudio进行开发,各种问题层出不穷。其中,AS中使用Gradle进行构建,使用DSL语言进行配置脚本编写是最难理解的地方。下面是从官网找到的apk程序构建打包的详细说明,补充一下这些知识点或许可以更好地理解何为构建,对AS中的Gradle也会更容易接受。
构建系统概况
新的Android SDK构建系统
Android构建是用于构建测试运行和打包应用程序的工具套件。 这个构建是一个综合的工具,可以从as的菜单栏或者从命令行独立运行。这个构建系统可以完成如下工作:
- 定制,配置,和继承构建过程
- 使用相同的项目和模块,通过不同的特征创建多个apk
- 重复使用资源集中代码和资源
Android构建系统的灵活性,使你可以完成上面的工作,而不用修改你的核心资源文件。
构建过程详解
在生成.apk的构建过程中涉及到很多工具和步骤,各个步骤会生成对应的中间文件,如果使用AS的话,完整的构建过程在每次运行项目(project)或者模块(module)的task任务时都会发生。 构架过程非常灵活, 需要理解的是各个阶段所发生的事情都是可配置和可扩展的。下图描述了在一次构建过程中涉及到的不同的工具和过程。
典型的构建过程如下所示,构建系统会合并来自配置文件中的所有资源,如flavors, build types, dependencies等节点下的内容, 如果不同的文件夹包含具有相同名字和设置的资源,则覆盖优先级顺序是:dependencies 覆盖build types, build type 覆盖 flavors, flavors覆盖主要资源目录。
Android Asset Package Tool(aapt)会获取所有的应用程序资源文件,并进行编译,如AndroidManifest.xml, R文件会在此阶段生成,使你可以从java代码中引用。
aidl工具转换所有的.aidl接口,所有的R文件和.aidl文件被编译,并输出.class文件。
dex工具将所有的.class文件转换成dalvik字节码,module中包含的所有第三方库和.class文件也会被转换成.dex文件,以使他们能够被打包进.apk文件中。
所有没有编译过的资源(如图片),编译过的资源,以及.dex文件会被发送到apkbuilder工具中被打包进.apk文件中。
一旦.apk文件被构建完成,就使用debug模式或者release模式的签名key进行签名,然后安装进设备中。最后,如果程序使用release模式签名的,则必须通过zipalign工具进行排列。排列最终的.apk文件会在程序运行时节省内存。
注: App有64k的方法引用限制,如果app达到这个限制,构建过程就会输出下面的错误信息:
Unable to execute dex: method ID notin[0,0xffff]:65536.
要避免这个错误,可以查看Building Apps with Over 65K Methods.
如果对上面的内容还是不太理解的话,可以再看看《Android软件安全与逆向分析》中第四章第一节,对这个过程的详细分析,基本概念如下,七个步骤(参考图与上图一样):
第一步: 打包资源文件生成R文件。这个过程由sdk\platform-tools下的aapt工具完成。反编译过app的同学应该知道,反编译出来会有个resources.arsc文件,这个文件也是在这个生成的。
第二步: 处理aidl文件,生成相应的java文件。这个过程由sdk\platform-tools下的aidl工具完成。
第三步: 编译工程源代码,生成相应的class文件。这一步由javac编译src目录下的所有java代码,如果需要的话,NDK中的本地代码也是在这一步中被编译的。
第四步: 转换所有的class文件,生成classes.dex文件。使用到的工具为sdk\platform中的dx。
第五步: 打包生成apk文件。打包工具为apkbuilder。
第六步: 对apk进行签名。
第七步: 对签名后的apk文件进行对齐处理。需要用到的工具为zipalign。对其的原理为,使apk中的所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。