APK构建流程

1.总述 apk打包总体流程

apk打包流程

2.工具列表

工具 描述
aapt Android资源打包工具
aidl Android接口描述语言转化为跨进程通信.java文件的工具
javac Java编译器
proguard 代码混淆工具
dx/d8 转化.class文件为Dalvik VM能识别的.dex文件
apkbuilder 打包生成apk包
jarsigner 签名工具
zipalign 字节码对齐优化工具

3.资源文件编译

aapt:Android Asset Packaging Tool
资源合并流程
资源文件编译

生成res资源,AndroidManifest文件,assets资源

  • 生成R.java文件。赋予每一个非assets资源一个ID值,以常量的形式定义于R.java文件中
public final class R {
    private R()

    public static final class anim{...}
    public static final class attr{...}
    public static final class bool{...}
    public static final class color{...}
    public static final class dimen{...}
    public static final class drawable{...}
    public static final class id{...}
    public static final class integer{...}
    public static final class layout{...}
    public static final class string{...}
    public static final class style{...}
}
例
R.string.appname = 0x7f07006b
package_id(资源包) -- 0x7f
style_id(String类型) -- 07
index_id(当前类型中的序号) -- 006b
  • 生成resources.arsc文件,用来描述那些具有ID值的资源的配置信息,它的内容就相当于是一个资源索引表。包含了所有的id值的数据集合。在该文件中,如果某个id对应的是string,那么该文件会直接包含该值,如果id对应的资源是某个layout或者drawable资源,那么该文件会存入对应资源的路径。
    可以通过Analyze apk功能查看resource.arsc的文件结构:


    resource.arsc文件结构

4. aidl文件编译

  • aidl工具解析接口定义文件,然后生成响应的Java代码接口供程序调用。如果在项目没有使用到aidl文件,则可以跳过这一步。
  • 输入:aidl后缀的文件,位于工程src/main/aidl目录
  • 输出:可用于进程通信的C/S端java代码,位于build/generated/source/aidl/

5. java源码编译

  • R.java和aidl生成的java文件,再加上工程的源代码,使用javac编译生成class文件
  • 输入:java源码文件夹(另外还包括了aapt生成的R.java,aidl生成的java文件,以及BuildConfig.java)
  • 输出:对于gradle编译,生成的class文件保存在build/intermediates/classes/

6. proguard代码混淆

  • javac完成代码编译后,一般还会对源码进行混淆,类似于加密,目的是增加反编译的难度,同时也将代码名称进行缩短,减少代码占用体积
  • 输入:编译后的.class文件,混淆规则配置文件proguard-rules.pro
  • 输出:被混淆后的.class文件,混淆前后的映射文件

7. 转换为DEX文件

  • dx工具生成可供Android系统虚拟机可以执行的classes.dex文件。dx会将class转换为Dalvik字节码,生成常量池,消除冗余数据等
  • 输入:所有的.class文件
  • 输出:classes.dex文件


    dex输入输出图示

8.打包apk文件

  • 打包生成apk文件。旧的apkbuilder脚本已经废弃,现在通过sdklib.jar的ApkBuilder类进行打包
  • 输入:.ap_资源包文件,class.dex文件,未变异的资源文件(asset资源等),libs等文件
  • 输出:apk文件

9.签名apk文件

  • 对apk文件进行签名,签名后才能在设备上进行安装
  • 输入:上一步中生成的.apk文件、签名文件(Debug or Release Keystore)
  • 输出:签名后的apk文件

10.zipalign优化

  • zipalign对签名后的apk文件进行对齐处理,使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而在通过内存映射访问apk文件时会更快,同事也减少了在设备上运行时的内存消耗
  • 输入:签名后的apk文件
  • 输出:对齐优化的apk文件

APK典型文件包含

  • AndroidManifest.xml 程序全局配置文件
  • classes.dex Dalvik字节码
  • resources.arsc 资源索引表
  • META-INF 该目录下存放的是签名信息
  • res 该目录存放资源文件
  • assets 该目录可以存放一些配置或资源文件
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容