升级Android的API Level,是上架Google Play的App每年至少经历的一劫,今年的要求是2024年8月31号后,新应用和应用更新必须以 Android 14(API 级别 34)为目标平台,才能提交到 Google Play。Google Play 应用在目标 API 级别方面需满足的要求
经过几天的摸索,梳理了要修改的地方。
考虑到每台设备构建环境都不一样,所以我的方案不一定能覆盖所有情况。当按照以下配置改完各个工具的版本后,如果打包还是报错的话。最好是把项目导出成Android工程,用Android Studio打开。AS能帮你检测不合理的配置并给出修改建议,而且AS在构建失败时的提示信息也比Unity更详细。按照AS的提示反复修改,直到构建通过,就得到了最适合你项目的gradle配置。最后按照你的测试结果来修改Unity中的各个gralde文件就可以了。
工具 | 版本 |
---|---|
Unity | Unity2021.3.36 LTS |
AGP | 7.4.2 |
Gradle | gradle-7.5-bin.zip |
OpenJDK | 11 |
R8 | 8.3.37 |
打开baseProjectTemplate.gradle,修改版本AGP版本。
原始:
classpath 'com.android.tools.build:gradle:4.2.2'
改为:
classpath 'com.android.tools.build:gradle:7.4.2'
*没baseProjectTemplat的在ProjectSettings/Player/PublishingSettings里勾选上就有了。
PS:Unity2021.3.11版本里是没有这一行的,需要手动添加整个pluginManagement,代码如下:
pluginManagement {
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath("com.android.tools:r8:8.3.37")
}
}
}
include ':launcher', ':unityLibrary'
**INCLUDES**
原始:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
改为:
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
打开gradleTemplate.properties,声明自定义OpenJDK的路径
org.gradle.java.home=/Library/OpenJDK11
我用的是Mac环境,把OpenJDK11文件夹拷贝到了公共资源库下面,所以是/Library/OpenJDK11。Windows需要自己查一下路径怎么写。
编译打包后,发现Apk内的AndroidManifest.xml里多了三个权限,分别是:
uses-permission#android.permission.WRITE_EXTERNAL_STORAGE
uses-permission#android.permission.READ_PHONE_STATE
uses-permission#android.permission.READ_EXTERNAL_STORAGE
初步断定是com.google.firebase导致的,几年前网上也有人反映类似的情况(issuetracker)。考虑到这三个权限现在基本废弃,而且在实际使用中还需要进行动态申请,所以不如直接将它们移除。
具体做法是在Assets/Plugins/Android/AndroidManifest.xml里加上remove属性:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
这次把Android的Target API Level从33升级到34,过程比去年32升33更麻烦,因为内置的构建工具已经无法支持最新的Android环境,要改动的地方太多了。按照Google一年一升的规律,明年从34升35的话,对老版引擎来说会更加困难。从这里也能看出,Unity2021确实是个老版本了,官方马上也要停止维护。不过至少还可以自定义gradle,掌握Android的基本知识+搜索引擎+GPT,一切都不是问题。
Unity官方论坛关于升级Android14的讨论
Unity在7月23号发布了新的版本-Unity 2021.3.41,升级了内置Gralde的版本,跟我的方案基本一致,条件允许的话可以通过直接升级Unity版本来解决。Unity 2021.3.41 Release Note