前言
大家平时开发Android项目时一般都是点击AS run按钮,这样apk会自动安装到手机上,这整个过程到底发生来什么呢?
今天就来梳理下整个流程gradle做了什么,讲解前先来熟悉下apk整体构建流程
apk 构建流程
官方新图
如图 1 所示,典型 Android 应用模块的构建流程通常按照以下步骤执行:
- 编译器将您的源代码转换成 DEX 文件(Dalvik 可执行文件,其中包括在 Android 设备上运行的字节码),并将其他所有内容转换成编译后的资源。
- APK 打包器将 DEX 文件和编译后的资源合并到一个 APK 中。不过,在将应用安装并部署到 Android 设备之前,必须先为 APK 签名。
- APK 打包器使用调试或发布**库为 APK 签名:
- 如果您构建的是调试版应用(即专用于测试和分析的应用),则打包器会使用调试**库为应用签名。Android Studio 会自动使用调试**库配置新项目。
- 如果您构建的是打算对外发布的发布版应用,则打包器会使用发布**库为应用签名。如需创建发布**库,请参阅在 Android Studio 中为应用签名。
- 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,以减少其在设备上运行时所占用的内存。
构建流程结束时,您将获得应用的调试版 APK 或发布版 APK,以用于部署、测试或发布给外部用户。
上面是官方新图,感觉没有????旧图详细
从上图可以看出APK打包流程主要分以下几个步骤
- aapt工具处理app res文件,生成R.java 、resources.arsc(资源映射关系表)、res文件
- aidl工具处理aidl文件,生成对应的java文件
- javac 对上述二个步骤中生成的java文件和项目中源代码文件进行编译,生成字节码文件(.class)
- dex工具接受步骤3中的.class文件、第三方库的.class文件处理生成dex文件
- apkbuilder工具将aapt生成的resources.arsc、res文件、dex文件一起打包生成apk
- 使用Jarsigner工具对apk进行签名
- 对步骤6的产物进行zipalign操作(减少运行应用时消耗的 RAM 容量)
参考文献
- https://developer.android.com/studio/build/index.html?hl=zh-cn#build-config
- https://developer.android.com/studio/command-line/aapt2
- https://developer.android.com/studio/command-line/zipalign.html