写在伊始
大家都知道,每年Google Play都会要求所有上架海外的App在8月(新包)及11月(在架包)进行新系统版本的适配,今年,我们苦逼的海外开发者又必须要适配Android 14了,晚干不如早干,近期我们公司也是将Android 14适配提上了日程!
以下Android 14 实战所遇问题仅适用于我司项目,如果您所遇问题不同,欢迎留言或私信一起讨论。
开始集成Android 14
我司目前项目环境如下:
Java version :11.0.18
Android version :API 33, Android 13
Installation platform & version :Gradle 6.1.1
AGP :4.0.1
首先,我们将compileSdkVersion以及targetSdkVersion升级为34,开始Build
android {
compileSdkVersion 34
defaultConfig {
minSdkVersion 23
targetSdkVersion 34
}
}
不出意外,一堆报错。下面我们一一来看:
(1)非空类型不匹配
报错如下:
我们发现,在Android 34源码中,View的 onDraw 方法中,参数Canvas添加了注解NotNull :
/**
* Implement this to do your drawing.
*
* @param canvas the canvas on which the background will be drawn
*/
protected void onDraw(@NonNull Canvas canvas) {
}
如果项目中使用了kotlin并且覆写的onDraw 方法有空安全运算符 ?,导致了上面的报错
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
}
修改方式也比较简单,我们去掉空安全运算符 ?即可
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
}
(2)AAPT2异常终止
AAPT2 报错的具体原因在日志里面没有详细的信息的,在gradle 社区上找到如下回答,告知我这应该是Android 独有的问题,跟Gradle构建工具无关。
Google 搜索相关的问题,找到了如下的回答
以此为线索,我们Demo验证,创建新的项目将targetSdkVersion 升级到34,项目是可以正常打包的,但是引入了facebook-android-sdk后就会出现aapt2异常终止报错。按照上图所示去掉legacy-support-v4就又可以正常打包。
基于上述定位到的具体原因,我们傻瓜式的排查了项目所有的引用库,发现androidx.legacy:legacy-support-v4,androidx.core:core-splashscreen两个库会引发aapt2异常终止问题。移除这2个库重新构建项目就可以正常打包运行了。
但是,移除库还是会影响app的部分功能,例如splashscreen库(Android 12闪屏适配)。所以我们再次研究了Android 14适配的官方文档,该文档上提到了AGP 7.0.0以上的版本适配,虽然官方没有说适配14必须将AGP升到7.0+,但是我们抱着试试的态度进行了尝试环境配置如下。经过升级后项目可以正常打包了,也没有影响splashscreen库(Android 12闪屏适配)功能。适配后环境如下:
Java version :11.0.18
Android version :API 34, Android 14
Installation platform & version :Gradle 7.5
AGP :7.4.2
升级AGP步骤
1.使用 Android Gradle 插件升级助理
google 官方文档 : 使用 Android Gradle 插件升级助理
打开Tools > AGP Upgrade Assistant ,随即出现的工具窗口中会显示默认升级的详细信息,其中包括项目的当前版本 AGP 以及此版本 Android Studio 所支持的AGP下拉列表,选择7.4.2版本后点击Run selected steps。
经过上面的步骤,项目的build.gradle文件以及gradle-wrapper.properties文件会发生变更如下
gradle版本:7.5
gradle plugin版本:7.4.2
kotlin版本:1.6.21
2.修改项目build.gradle文件
修改前:
buildscript {
ext.kotlin_version = '1.6.21'
repositories {
maven {
url "xxx"
}
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
...
}
}
allprojects {
repositories {
maven {
url "xxx"
}
google()
mavenCentral()
}
}
修改后:
buildscript {
ext.kotlin_version = &#