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文件时的速度会更快。


更多相关文章

  1. Android(安卓)入门第四讲04-小结-RecyclerView(回顾)+Context(介绍
  2. Android(安卓)ListView学习(一)--ListView With ArrayAdapter
  3. 从底层看android5.0系统的启动过程
  4. React-Native系列Android——Javascript文件加载过程分析
  5. soot实现Android(安卓)Apps插桩(一)
  6. Android项目中打jar包 和 使用
  7. android kernel控制台初始化过程
  8. Android的Binder的起源-android学习之旅(100)
  9. android 上传项目到Github

随机推荐

  1. android memory tips
  2. 安卓 简易版音乐播放器——初稿
  3. VelocityTracker 注释
  4. FindViewById
  5. Android从APP启动第三方地图导航
  6. 获取麦克风音量
  7. Android(安卓)CheckBox事件setOnCheckedC
  8. Android获得相机的所有信息
  9. 使用Retrofit Https请求
  10. GLSurfaceView使用-入门之HelloWorld--画