• 面试:Android应用编译打包流程


    先来一张 Android 配置构建 官网上的一张图:

    从上面的流程图,我可以看出 APK 构建流程可以分为以下七步:

    1. 通过 aapt 打包 res 资源文件,生成 R.java、resources.arsc 和 res 文件(二进制和非二进制如 res/raw 和 pic 保持原样)
    2. 处理 .aidl 文件,生成对应的 Java 接口文件
    3. 通过 Java Compiler 编译 R.java、Java 接口文件、Java 源文件,生成 .class 文件
    4. 通过 dx/d8 工具,将 .class 文件和第三方库中的 .class 文件处理生成 classes.dex
    5. 通过 apkbuilder 工具,将 aapt 生成的 resources.arsc 和 res 文件、assets 文件和 classes.dex 一起打包生成 apk
    6. 通过 Jarsigner 工具,对上面的 apk 进行 debug 或 release 签名
    7. 通过 zipalign 工具,对签名后的 apk 进行对齐处理

    第一步:aapt

    aapt(Android Asset Packaging Tool),用于打包资源文件,生成 R.java 和编译后的资源。aapt 的源码位于 frameworks/base/tools/aapt2 目录下。

    第二步:aidl

    用于处理 aidl 文件,源码位于 frameworks/base/tools/aidl。输入 aidl 后缀的文件,输出可用于进程通信的 C/S 端 Java 代码,位于 build/generated/source/aidl。

    第三步:Java 源码编译

    有了 R.java 和 aidl 生成的 Java 文件,再加上工程的源代码,现在就可以使用 javac 进行正常的 java 编译生成 class 文件了。

    输入:java source 的文件夹(另外还包括了 build/generated 下的:R.java,aidl 生成的 Java 文件以及 BuildConfig.java)

    输出:对于 gradle 编译,可以在 build/intermediates/classes 里,看到输出的 class 文件。

    第四步:dex

    使用 dx/d8 工具将 class 文件转化为 dex 文件,生成常量池,消除冗余数据等。

    第五步:apkbuilder

    打包生成 APK 文件,现在都已经通过 sdklib.jar 的 ApkBuilder 类进行打包了,输入为我们之前生成的包含 resources.arsc 的 .ap_ 文件,上一步生成的 dex 文件,以及其他资源如 jni、jar 包内的资源。

    第六步:Jarsigner

    对 apk 文件进行签名,APK 需要签名才能在设备上进行安装。现在不仅可以使用 jarsigner,还可以使用 apksigner。

    第七步:zipalign

    对签名后的 apk 文件进行对齐处理,使得 apk 中所有资源文件距离文件起始偏移为四个字节的整数倍,从而在通过内存映射访问 apk 文件时会更快。

    需要注意的,使用不同的签名工具对对齐是有影响的。如果使用 jarsigner,则只能在 APK 文件签名后执行 zipalign;如果使用 apksigner,则只能在 APK 文件签名之前执行 zipalign。详见官网描述:zipalign

    Android-Notes/APK 构建流程.md at master · Omooo/Android-Notes · GitHub

  • 相关阅读:
    「降本」有可能,「增效」不确定
    企业为什么要数字化转型?数字化转型成功的案例有哪些?
    go test, go bench & go examples
    测试架构工程师需要具备哪些能力 ?
    STM32——触摸屏实验-电阻型触摸屏-M4
    Linux Ext2/3/4文件系统
    zabbix部署和简单使用
    pytorch-05.用pytorch实现线性回归
    点云从入门到精通技术详解100篇-面向三维测量的光栅结构光 图像去噪(续)
    Unity9 路径权限、场景的加载、异步加载、场景跳转
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/127836089