美文网首页
APK构建流程

APK构建流程

作者: 瑜小贤 | 来源:发表于2020-03-04 15:45 被阅读0次

    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 该目录可以存放一些配置或资源文件

    相关文章

      网友评论

          本文标题:APK构建流程

          本文链接:https://www.haomeiwen.com/subject/rvrvlhtx.html