升级target34 不升级 gradle和agp 报错 200 解决

1,090 阅读4分钟

当你仅升级 targetSdkVersion 到 34,而不升级 Gradle 和 Android Gradle Plugin (AGP) 版本时,可能会遇到以下错误:

Caused by: java.io.IOException: AAPT2 process unexpectedly exit. Error output:
aapt2 W 06-26 09:56:23 8280 8280 LoadedArsc.cpp:682] Unknown chunk type200’.

这个错误的根本原因是 AAPT2 版本不兼容。下面详细分析原因并提供解决方案。

在Android开发中,AAPT2(Android Asset Packaging Tool 2)是用于处理资源文件的工具,负责编译和打包资源(如XML布局、图片等)。随着Android SDK的更新,AAPT2也会不断改进,以支持新的功能和优化。

当你将targetSdkVersion升级到34时,可能需要使用更新版本的AAPT2来确保资源处理与新的API级别兼容。通常情况下,升级targetSdkVersion会伴随着Gradle插件和Android SDK工具的升级。然而,如果你不想升级Gradle版本,仍然可以通过手动指定AAPT2版本来实现兼容性。


错误原因分析

  1. AAPT2 版本问题

    • targetSdkVersion 34 需要使用更新版本的 AAPT2,因为新版本的 AAPT2 支持新的资源格式或特性。
    • 如果你没有升级 Gradle 和 AGP,默认使用的 AAPT2 版本可能较旧,无法正确处理 targetSdkVersion 34 的资源文件,导致解析资源时出现 Unknown chunk type ‘200’ 的错误。
  2. 资源格式变化

    • 随着 Android SDK 的更新,资源文件的格式可能会发生变化。Unknown chunk type ‘200’ 表明旧版本的 AAPT2 无法识别新版本 SDK 引入的资源块类型。
  3. Gradle 和 AGP 的版本绑定

    • Gradle 和 AGP 的版本通常与特定版本的 AAPT2 绑定。如果你不升级 Gradle 和 AGP,AAPT2 的版本也不会自动更新。

解决方案

方案 1:升级 Gradle 和 AGP 版本(推荐)

这是最直接和官方推荐的解决方案。升级 Gradle 和 AGP 版本会自动使用兼容 targetSdkVersion 34 的 AAPT2 版本。

  1. 打开项目根目录下的 build.gradle 文件,更新 AGP 版本:

    dependencies {
        classpath 'com.android.tools.build:gradle:8.0.0' // 或更高版本
    }
    
  2. 打开 gradle-wrapper.properties 文件,更新 Gradle 版本:

    distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
    
  3. 同步项目并重新构建。


方案 2:手动指定 AAPT2 版本(其它解决方案)

如果你暂时无法升级 Gradle 和 AGP,可以通过手动指定 AAPT2 版本来解决兼容性问题。

  1. 下载新版本的 AAPT2

  2. 解压并获取 AAPT2 可执行文件

    • 下载的通常是 JAR 文件,解压后找到 aapt2 可执行文件。
  3. 配置 gradle.properties

    • 打开项目根目录下的 gradle.properties 文件,添加以下配置:
      android.aapt2FromMavenOverride=/path/to/your/aapt2
      
    • /path/to/your/aapt2 替换为你解压后的 aapt2 可执行文件的路径。
  4. 重新构建项目

    • 运行 ./gradlew build,Gradle 会使用你指定的 AAPT2 版本。

原理分析

  1. AAPT2的作用

    • AAPT2负责编译资源文件(如XML、图片等),并将它们打包到APK中。
    • 不同版本的AAPT2可能支持不同的资源处理方式或优化策略,尤其是在新的targetSdkVersion下,可能需要新版本的AAPT2来处理新的资源特性或修复旧版本的bug。
  2. Gradle与AAPT2的关系

    • Gradle通过Android Gradle插件(AGP)调用AAPT2来处理资源。
    • 默认情况下,AGP会使用与Gradle插件版本绑定的AAPT2版本。如果你不升级Gradle插件,AGP会继续使用旧版本的AAPT2
  3. 手动指定AAPT2版本

    • 通过设置android.aapt2FromMavenOverride属性,你可以覆盖AGP默认使用的AAPT2版本,强制使用你指定的AAPT2版本。
    • 这样做的目的是在不升级Gradle插件的情况下,使用更新版本的AAPT2来处理资源。

注意事项

  1. 手动指定 AAPT2 的风险
    • 手动指定 AAPT2 版本可能会导致其他兼容性问题,尤其是当 AGP 和 AAPT2 版本不匹配时。
    • 这种方法只是一个临时解决方案,长期来看,升级 Gradle 和 AGP 是更好的选择。
  2. 测试
    • 无论选择哪种方案,都需要彻底测试应用,确保资源文件正确处理,应用功能正常。

总结

  • 推荐方案:升级 Gradle 和 AGP 版本,以使用兼容 targetSdkVersion 34 的工具链。
  • 临时方案:手动指定 AAPT2 版本,但需要注意兼容性问题。
  • 不推荐方案:降级 targetSdkVersion,因为这可能违反 Google Play 的要求。

根据你的项目需求和限制,选择最适合的解决方案。