在了解Android打包流程之前,我建议您可以先查看一个apk包内容,可以知道它里面都有哪些文件组成:
- AndroidManifest.xml 程序全局配置文件
- classes.dex Dalvik字节码
- resources.arsc 资源索引表, 解压缩resources.ap_就能看到
- res\ 该目录存放资源文件(图片,文本,xml布局)
- assets\ 该目录可以存放一些配置文件
- src\ java源码文件
- libs\ 存放应用程序所依赖的库
- gen\ 编译器根据资源文件生成的java文件
- bin\ 由编译器生成的apk文件和各种依赖的资源
- META-INF\ 该目录下存放的是签名信息
知道了apk包体的内容,我们应该会更好的理解Android打包流程:
以上流程中我们可以看到:
- 编译器将源代码转换成 DEX(Dalvik Executable) 文件(其中包括 Android 设备上运行的字节码),将所有其他内容转换成已编译资源。
- APK 打包器将 DEX 文件和已编译资源合并成单个 APK。 不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上
- APK 打包器使用调试或发布密钥库签署APK。
注意:
1、如果我们构建的是debug版本的应用,打包器会使用调试密钥库签署应用。 Android Studio 自动使用调试密钥库配置新项目。
2、如果构建的是打算向外发布的发布版本应用,打包器会使用发布密钥库签署应用。
3、在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时占用的内存。
重点:
如上面的流程所示,是典型 Android 应用模块的构建流程,但如果看的更细致一点它的流程应该如下:
- AAPT(Android Asset Packaging Tool)工具,Android资源打包工具。会打包资源文件(res文件夹下的文件),并生成R.java和resources.arsc文件。
- AIDL工具会将所有的.aidl文件编译成.java文件。
- JAVAC工具将R.java、AIDL接口生成的java文件、应用代码java文件编译成.class文件。
- dex脚本将很多.class文件转换打包成一个.dex文件。
- apkbuilder脚本将资源文件和.dex文件生成未签名的.apk文件。
- jarsigner对apk进行签名。
这些构建中使用的工具或者脚本,在SDK的build-tools或者tools下可以找到
详细的流程图如下: