0x00 前言
通常一个团队都会有一个人专门负责打包,对于其他同学并不需要关注具体打包的细节。然而,我们存在的意义不是为了仅仅满足工作的需求,而是要让自己掌握的东西更多、不断成长。
关于打包序列文字,我的计划分成几篇文章来介绍:
- 打包流程梳理
- 多渠道打包
- 多渠道快速打包
- 自动化构建
本文介绍基本打包流程。
通常有2种打包方式:
- Android Studio图形界面 点击run按钮
- 命令行方式 gradlew assembleDebug, gradlew assembleRelease
方式1使用自动生成的debug keystore签名;方式2如果是Release包使用release keystore签名,如果是Debug包则使用debug keystore签名。
下面讲下从一堆源代码到产生apk文件的过程。
0x01 基本流程
上图是Android官方提供的打包简略流程图。清晰地展示了一个Android Project经过编译和打包后生成apk文件,然后再经过签名,就可以安装到设备上。
我们将一个实际的apk文件后缀改为zip并解压后,得到的内容如下:
和上图的描述一致。apk包内容包括:
- classes.dex…
- resources.arsc
- assets
- res
- AndroidManifest.xml
- META-INF
其中:
- res中图片和raw文件下内容保持原样,res中其他xml文件内容均转化为二进制形式;assets文件内容保持原样
- res中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类
0x02 详细流程
下面这张图是官网提供的详细流程图。
我们可以将整个打包过程概括为以下几步:
- 通过aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)
- 处理.aidl文件,生成对应的Java接口文件
- 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件
- 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex
- 通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk
- 通过Jarsigner工具,对上面的apk进行debug或release签名
- 通过zipalign工具,将签名后的apk进行对齐处理。
以上步骤均为必须,否则不能在设备上安装。
关于zipalign工具,根据名字就知道是个zip文件对齐的工具。使得apk中的资源文件偏离文件起始位置4个字节,从而可以通过mmap()直接访问,从而减少RAM占用。
更详细的流程,可以看下图。
0x03 参考文档
- https://developer.android.com/studio/build/index.html?hl=zh-cn#build-config
- https://developer.android.com/studio/command-line/zipalign.html
原文
http://mouxuejie.com/blog/2016-08-04/build-and-package-flow-introduction/