gradle及AGP升级问题记录

0 阅读4分钟

1. edgetoedge问题解决

在页面style文件中添加下面代码 关闭此功能

 <item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>

2. ProGuard/R8 的混淆行为导致部分类找不到

背景

  1. R8 优化更激进 AGP 8.x 默认启用 R8 的完整优化模式(包括代码缩减、混淆、优化)

  2. 相比旧版 ProGuard,R8 的以下行为可能导致问题:

  • 更彻底的代码移除:未通过显式规则保护的反射/JNI调用类会被删除

  • 字段/方法名混淆强度提升:尤其是非公开的成员,可能被重命名为短无意义字符(如 a.b()

  • 内联和合并优化:R8 可能将多个小类合并或内联方法,破坏原有逻辑

  • 默认规则变化 AGP 8.4.2 的默认配置文件 proguard-android-optimize.txt 更新了保留规则,例如:

    • 对 AndroidX、Kotlin 协程等库的保留规则更严格

    • 旧版中隐式保留的类(如 Activity)可能需要显式声明 -keep

  • Java/Kotlin 新版本兼容问题 Gradle 8.9 默认支持 Java 17+,若项目中使用新语言特性(如 recordsealed class),旧混淆规则可能失效

解法

临时禁用优化定位问题 在 gradle.properties 中关闭 R8 优化:

android.enableR8.fullMode=false

3. compileOnly限制增强

背景

  1. **compileOnly的限制增强 AGP 8.4.2加强了对compileOnly依赖的检查,若该依赖包含Android组件(如Activity、Service等)或资源文件**,则必须使用implementationapi,否则会导致编译或运行时崩溃

  2. 依赖内容分析 com.miui:system:dev-SNAPSHOT可能包含以下内容:

    • Android组件或资源:如布局文件、资源ID等。

    • AIDL接口或JNI库:这些需要打包到APK中。

    • 运行时必需的类:例如com.milink.api.v1包下的重复类(此前问题可能被旧版本AGP忽略)

  3. AGP 7.x与8.x的差异 AGP 7.x对compileOnly的检查较宽松,允许部分运行时依赖声明为compileOnly,但AGP 8.x(尤其是8.4+)会严格校验此类配置

4. 资源引用无法使用switch-case

背景

  1. AGP 8.0+ 的资源 ID 非 final 化

    • 在 AGP 8.0 之前,应用模块(Application Module) 生成的 R.java 文件中的资源 ID 是 public static final int,可在 switch-case 中作为常量使用

    • AGP 8.0 及更高版本(包括 8.4.2)中,为了优化构建性能和包体积,应用模块的资源 ID 也变为 非 final(public static int

    • 由于 switch-casecase 标签要求表达式必须是编译时常量(final),因此会触发编译错误:case expressions must be constant expressions

修改

android.nonFinalResIds=false

5. enableFeaturePreview("VERSION_CATALOGS")

旧版 Gradle(7.4 之前):Version Catalog 是实验性功能,需通过 enableFeaturePreview("VERSION_CATALOGS") 显式启用,否则无法使用
Gradle 7.4+:Version Catalog 功能已稳定,无需手动启用(但部分文档仍建议保留该配置以确保兼容性)
Gradle 8.0+:该功能完全集成到 Gradle 核心中,enableFeaturePreview 调用已无意义,可删除

6. android.bundle.enableUncompressedNativeLibs=false

  • 在项目的build.gradle文件中找到以下配置并删除
android {
    bundle {
        enableUncompressedNativeLibs = false // 删除这行
    }
}
  • 在gradle.properties中确保没有以下配置
android.bundle.enableUncompressedNativeLibs=false

该选项原本用于控制APK中native库是否压缩,自AGP 4.0起默认启用压缩,但Android App Bundle格式要求不压缩。AGP 8.1移除了该选项,现在强制使用未压缩的native库以适配新的应用分发格式要求

7. 升级gradle java版本需配置17

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':BaiduSearchBridge:compileDebugKotlin'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:293)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
        at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
Caused by: org.gradle.api.GradleException: 'compileDebugJavaWithJavac' task (current target is 1.8) and 'compileDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.
Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain

8. 自定义BuildConfig字段在gradle8.0中被禁用

问题描述

* What went wrong:
A problem occurred configuring project ':Browser'.
> defaultConfig contains custom BuildConfig fields, but the feature is disabled.
  To enable the feature, add the following to your module-level build.gradle:
  `android.buildFeatures.buildConfig true`

解决

在模块级build.gradle文件的android{}块内添加以下配置:

android {
    buildFeatures {
        buildConfig true // 强制启用BuildConfig生成[9,11](@ref)
    }
}

错误提示明确指出你的:Browser模块在defaultConfig中定义了自定义BuildConfig字段,但该功能当前被禁用。该问题主要与Gradle 8+版本的默认配置变更有关

9. 缺少namespace字段

与AndroidManifest.xml中的package保持一致

有时也可使用自动化工具 AGP Upgrade Assistant

下面两种方法打开都可以

选择Set namespace from AndroidManifest 有时候因为AGP版本已经更新,这个选项可能不存在了,需要手动适配

10. aidl目录默认不开启

需在build.gradle文件中开启

android {
    buildFeatures {
        aidl true
    }
}

11.不建议在AndroidManifest.xml中写package

Incorrect package="com.android.browser" found in source AndroidManifest.xml: D:\com\android\mibrowser\plugin\src\main\AndroidManifest.xml.
Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported.
Recommendation: remove package="com.android.browser" from the source AndroidManifest.xml: D:\com\android\mibrowser\plugin\src\main\AndroidManifest.xml.

如果模块中build.gradle中的namespace和AndroidManifest.xml中的package命名不一致,则会报这个错误 gradle及AGP升级问题记录