升级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 |
1. AGP升级
打开mainTemplate.gradle,修改版本AGP版本。
原始:classpath 'com.android.tools.build:gradle:4.2.2'
改为:classpath 'com.android.tools.build:gradle:7.4.2'
AGP升级会附带一些gradle语法的变化,具体参考Android14 SDK官方指南
2. Gradle升级
下载gradle-7.5-bin.zip,打开Unity安装目录Applications/Unity/Hub/Editor/2021.3.36/PlaybackEngines/AndroidPlayer,把刚下载的gradle压缩包拷贝到AndroidPlayer目录下, 解压替换原来的**/gradle**文件夹
3. R8升级(2021.3的低版本可能没有,可以忽略)
打开Unity安装目录Applications/Unity/Hub/Editor/2021.3.36/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates,修改settingsTemplate.gradle文件中r8的版本。
原始:classpath ("com.android.tools:r8:4.0.48")
改为:classpath ("com.android.tools:r8:8.3.37")
4. OpenJDK
Unity2021.3内置的是Java8,但是这里要使用Java11,正好Unity2022.3内置的是Java11,直接从里面拷贝一份,放到一个不常修改的目录下就可以了。虽然Unity的设置支持自定义JDK路径,但是只支持Java8的,如果自定义的JDK是高于Java8的,Unity编辑器会提示不支持,所以还是要通过改gradle来绕过Unity编辑器的检测。
- 打开mainTemplate.gradle,修改JDK的版本。
原始:
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需要自己查一下路径怎么写。
5. 后续问题
编译打包后,发现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,一切都不是问题。
2024-07-25 更新
Unity在7月23号发布了新的版本-Unity 2021.3.41,升级了内置Gralde的版本,跟我的方案基本一致,条件允许的话可以通过直接升级Unity版本来解决。Unity 2021.3.41 Release Note