关于Android 构建流程解析的一些问题

简单说下一个 apk 的组成有哪些部分?

一个 APK 文件(Android 应用程序包)主要由以下几个部分组成:

  1. AndroidManifest.xml:这是 APK 的核心文件,包含了应用的基本配置信息,如应用的权限声明、组件(Activity、Service、BroadcastReceiver、ContentProvider)的声明、应用的入口等。
  2. classes.dex:包含了应用的编译代码。DEX(Dalvik Executable)文件格式是 Android 程序的字节码格式,Android 系统会加载这些字节码文件来运行应用。
  3. resources.arsc:包含了应用的所有资源的索引(例如字符串、颜色、样式等)。这个文件是一个二进制文件,包含了资源文件的访问路径和对应的资源值。
  4. res/ :该文件夹包含了应用的所有资源文件,如布局文件(XML)、图片文件(PNG、JPEG 等)、动画文件、音频文件等。
  5. assets/ :存放应用中的原始文件,通常这些文件是没有经过修改的,可以是任何类型的文件。与 res/ 文件夹不同,assets/ 中的文件不会被 Android 系统处理,而是作为原始数据提供给应用使用。
  6. META-INF/ :这个文件夹包含了 APK 的元数据,例如签名证书(.RSA 文件)和其他相关信息。它确保应用包没有被篡改,并且可以确认应用的发布者。
  7. lib/ :包含了应用使用的本地库(如 .so 文件)。这些文件通常是为特定平台架构(如 ARM、x86)编译的本地代码,Android 会根据设备架构选择合适的库来加载。

这些部分共同组成了一个完整的 APK 文件,确保应用能够在 Android 设备上正确安装和运行。

简单说下 Apk 构建的过程,这些过程分别用到了哪些工具?

  1. 代码编译

    • 工具:Javac / Kotlin Compiler
    • 开发者编写的 Java 或 Kotlin 代码会被编译成字节码(.class 文件),然后通过 dxD8 工具转化为 .dex 文件(Dalvik Executable),使得代码可以在 Android 设备上运行。
  2. 资源编译

    • 工具:aapt (Android Asset Packaging Tool)
    • aapt 工具将 res/ 文件夹中的资源(如布局、字符串、图片)编译为二进制格式并打包到 resources.arsc 文件中。这些资源文件会被 APK 打包时使用。
  3. 生成 AndroidManifest.xml 文件

    • 工具:aapt
    • 在构建过程中,AndroidManifest.xml 文件中的配置信息会被验证、处理并包含到 APK 中。
  4. 打包和签名

    • 工具:apktool、jarsigner、zipalign
    • APK 文件的最终打包过程包括将 .dex 文件、资源文件、库文件以及 AndroidManifest.xml 合并成一个 .apk 文件。
    • 需要使用 jarsigner 工具对 APK 进行签名,确保应用的安全性和完整性。
    • 使用 zipalign 工具对 APK 进行优化,确保它能够更高效地在设备上运行。
  5. 调试和优化

    • 工具:ProGuard / R8
    • 在发布之前,开发者可能会使用 ProGuardR8 工具对代码进行混淆和优化,以减小 APK 大小并提高应用的安全性。
  6. 生成 APK

    • 最后,构建工具(如 Gradle)会将所有文件打包成一个 APK 文件,准备好进行发布或安装。

简单说下 aapt 和 aapt2 之间有什么不同?

  • aapt:不支持增量编译,每次构建都会重新处理所有资源文件。

  • aapt2:支持增量编译,仅在资源文件发生变化时才进行处理,这使得构建过程更加高效。

aapt2 是对 aapt 的改进,具备了更高的性能、更好的错误处理、更高效的增量构建和更强的稳定性,推荐在现代 Android 开发中使用 aapt2

手动打包一个可以运行的 apk,让这个 apk 体积尽可能小

步骤 2:编译和生成 .dex 文件

  1. 编译源代码 : 使用 javac(或者如果使用 Kotlin 的话使用 kotlinc)编译源代码文件:

    js 复制代码
    javac -d out/ src/com/example/myapp/MainActivity.java
  2. .class 文件转为 .dex 文件 : 使用 dxd8 工具将 .class 文件转为 .dex 格式:

    js 复制代码
    dx --dex --output=out/classes.dex out/

步骤 3:编译资源文件

  1. 处理资源文件 : 使用 aapt2 来编译 res/ 文件夹中的资源:

    js 复制代码
    aapt2 compile res/ -o out/
  2. 打包资源文件 : 使用 aapt2 将资源文件和 .dex 文件打包成 APK:

    js 复制代码
    aapt2 link -o out/myapp.apk --manifest AndroidManifest.xml -I /path/to/android.jar out/*.flat

步骤 4:签名 APK

  1. 生成签名证书 : 使用 keytool 生成一个新的签名证书:

    js 复制代码
    keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key
  2. 使用 jarsigner 签名 APK : 使用 jarsigner 对 APK 进行签名:

    js 复制代码
    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA-1 -keystore my-release-key.jks out/myapp.apk my-key

步骤 5:优化 APK 体积

  1. 去除未使用的资源

    • 使用 ProGuardR8 进行代码混淆和优化,去除未使用的类和资源,从而减小 APK 大小。
    • 可以通过 Gradle 配置启用 R8 或 ProGuard,例如在 build.gradle 文件中启用混淆:
    js 复制代码
    android {
        buildTypes {
            release {
                minifyEnabled true  // 启用代码压缩
                shrinkResources true // 去除未使用的资源
            }
        }
    }
  2. 使用 zipalign 优化 APK 文件 : 使用 zipalign 工具优化 APK 文件,使得它在设备上加载时更高效:

    js 复制代码
    zipalign -v 4 out/myapp.apk out/myapp-aligned.apk

步骤 6:最终 APK

现在,APK 文件已经构建完成,并且尽可能小。你可以使用 adb install 命令将它安装到设备上:

js 复制代码
adb install out/myapp-aligned.apk

小结

  • 在手动打包 APK 时,关键的步骤包括编译源代码、处理资源、签名和优化。
  • 为了减小 APK 的体积,最重要的是去除未使用的资源和代码,使用混淆工具(如 ProGuard 或 R8)来进一步压缩。
  • 使用 zipalign 可以优化 APK 体积和运行效率。
相关推荐
花楸树17 分钟前
前端搭建 MCP Client(Web版)+ Server + Agent 实践
前端·人工智能
wuaro17 分钟前
RBAC权限控制具体实现
前端·javascript·vue
专业抄代码选手22 分钟前
【JS】instanceof 和 typeof 的使用
前端·javascript·面试
用户00798136209722 分钟前
6000 字+6 个案例:写给普通人的 MCP 入门指南
前端
用户876128290737427 分钟前
前端ai对话框架semi-design-vue
前端·人工智能
干就完了130 分钟前
项目中遇到浏览器跨域前端和后端解决方案以及大概过程
前端
我是福福大王32 分钟前
前后端SM2加密交互问题解析与解决方案
前端·后端
实习生小黄35 分钟前
echarts 实现环形渐变
前端·echarts
_未知_开摆43 分钟前
uniapp APP端在线升级(简版)
开发语言·前端·javascript·vue.js·uni-app
sen_shan1 小时前
Vue3+Vite+TypeScript+Element Plus开发-02.Element Plus安装与配置
前端·javascript·typescript·vue3·element·element plus