aapt2 是 Android 构建系统中取代 aapt 的现代资源处理工具,先将 XML 资源编译为 .flat 二进制文件,再通过 link 步骤聚合生成 resources.arsc 和 R 类;需指定 android.jar、清单文件,注意资源 ID 冲突、限定符格式及平台 jar 版本问题。
aapt2 是 Android 构建系统中用于处理资源(如 XML 布局、values、drawable 引用等)的现代工具,取代了旧版 aapt。它将资源编译(compile)为二进制格式(.flat),再通过链接(link)步骤生成最终的 resources.arsc 和 R.java(或 R.txt / R class in AAR/JAR)。以下是关键步骤和实用说明:
对每个 XML 资源文件(如 layout/activity_main.xml、values/strings.xml),aapt2 需单独编译成二进制 flat 格式:
aapt2 compile -o res/compiled/ res/layout/activity_main.xml
res/compiled/),aapt2 自动命名输出为 activity_main.xml.flat
--dir 参数(如 aapt2 compile --dir res/values/ -o res/compiled/)AndroidManifest.xml 不参与 compile 步骤,它只在 link 阶段被读取link 步骤聚合所有 .flat 文件、AndroidManifest.xml、库依赖的资源、版本/配置限定符(如 -zh-rCN、-v21),并解析引用、分配资源 ID、生成最终资源表:
aapt2 link -o app.apk -I $ANDROID_HOME/platforms/android-34/android.jar res/compiled/*.flat --manifest AndroidManifest.xml
-I 指定 Android 平台 SDK 的 android.jar(提供系统资源如 @android:drawable/ic_menu_add)--manifest 必须显式传入清单文件;若项目含库模块,需用 --package-id 或 --shared-lib 协调资源 ID 分配--java src/main/java/;如用 Android Gradle Plugin 8.0+,默认生成 R.txt 或直接生成 R class,不再输出 Java 源码实际使用中容易出错的地方:
android.useAndroidX=true 和 android.enableJetifier=false(旧项目)可能导致 link 失败;推荐统一使用 AndroidX 并确保各 module package name 不同
attr/xxx not found” 通常是因为 -I 指向的 android.jar 版本过低或路径错误values-zh_CN 应为 values-zh-rCN)会导致该配置资源被忽略,但不会报错,仅静默跳过手动调用 aapt2 易出错,日常开发建议依托 AGP(Android Gradle Plugin):
merge*Resources 和 process*Resources 任务中自动调用 aapt2 compile/link./gradlew --info :app:processDebugResources 查看真实执行的 aapt2 命令build/intermediates/merged_res/(合并后资源)和 build/intermediates/incremental/processDebugResources/(flat 文件位置)