项目停留在AGP 4.0.1很长一段时间。最近打算升级到AGP 7.0,为了避免版本跨度过大,出现问题不好解决,可以一步一步来,先把AGP升到7.0之前的最后一个版本4.2.2,然后才是AGP 7.0

总体来讲还算顺利,只是有些废弃的api,并且表示在7.0会被移除,为了避免升级7.0的时候万一没有提示不知道该怎么解决,趁着现在还有提示,可以先都给改正了。

1. android.dataBinding.enabled -> android.buildFeatures.dataBinding

// 4.0.x
dataBinding { 
	enabled true 
}

// 4.2.x
buildFeatures { 
	dataBinding true 
}

2. android.lintOptions.check -> android.lintOptions.checkOnly


// 4.0.x
lintOptions {
    check xxxx
}

// 4.2.x
lintOptions {
    checkOnly xxxx
}

3. variant.getXXX() -> variant.getXXXProvider()

API ‘variant.getAssemble()’ is obsolete and has been replaced with ‘variant.getAssembleProvider()’. It will be removed in version 7.0 of the Android Gradle plugin.

API ‘variant.getMergeResources()’ is obsolete and has been replaced with ‘variant.getMergeResourcesProvider()’. It will be removed in version 7.0 of the Android Gradle plugin.

类似这样的提示,getXXX()XXX是任务类型,可以用variant.getXXXProvider()来替代,通常出现在类似下面的场合跟doLast一起使用:

android.applicationVariants.all { variant ->
    variant.assemble.doLast {
        ...
    }
}

改成variant.getXXXProvider(),返回的是TaskProvider类型,没有doLast方法,则需要:

//一般的做法
android.applicationVariants.all { variant ->
    variant.assembleProvider.get().doLast {
        ...
    }
}

//或者更安全的做法
android.applicationVariants.all { variant ->
    variant.assembleProvider.getOrNull()?.doLast {
        ...
    }
}

另外如果改完了自己脚本里面的,还有这样的提示,那就是使用了第三方插件带来的,可以通过-Pandroid.debug.obsoleteApi=true,来寻找具体是哪个第三方插件导致的。

4. The option setting ‘android.enableR8=true’ is deprecated.

删除android.enableR8=true即可

5. 移除buildToolsVersion

如果还在用老板本Android SDK Build Tools,则可能会出现下面的提示:

The specified Android SDK Build Tools version (28.0.3) is ignored, as it is below the minimum supported version (30.0.2) for Android Gradle Plugin 4.2.2. Android SDK Build Tools 30.0.2 will be used. To suppress this warning, remove “buildToolsVersion ‘28.0.3’” from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.

buildToolsVersion已经由AGP指定,去掉即可

6. 废弃BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE

AGP 4.1之后就正式废弃了BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE,如果代码中有使用到,可以改成从PackageManager中获取

7. manifestPlaceholders对UnitTest失效,导致UnitTest编译失败

编译UnitTest的时候processDebugUnitTestManifest任务失败,合并Manifest失败,具体是一些占位符没有被正确赋值,例如:

Attribute uses-permission#${APPLICATION_ID}.theme.permission@name at manifestMerger11362786960320997376.xml requires a placeholder substitution but no value for is provided.

发生这个问题的模块,脚本中都有这样的设置:

testOptions.unitTests.includeAndroidResources true

这个设置会在编译UnitTest的时候,产生Android资源文件,就会涉及Manifest的合并,但不知道什么原因,通过manifestPlaceholders来替换占位符在编UnitTest的时候失效,官方文档没有明确说明。

那就只能在src/test/下创建AndroidManifest.xml,并在里面把需要替换的标签给移除,例如:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  package="xxxx">
    <permission tools:node="removeAll"/>
    <uses-permission tools:node="removeAll"/>
    <application
        android:allowBackup="false"
        tools:replace="android:allowBackup">
        <meta-data tools:node="removeAll"/>
        <provider tools:node="removeAll"/>
    </application>

</manifest>

8. tinker编译报错:failed reading stable ID file.

参考https://github.com/BuglyDevTeam/Bugly-Android-Demo/issues/323

9. 资源丢失

编译出来的release包,连桌面图标都没了,解开apk发现丢失很多资源,原因是跟AndResGuard冲突,解决方法:

# 关闭 AGP 4.2 开始自带的资源优化功能,防止其使 AndResGuard 无法正常工作
android.enableResourceOptimizations=false