升级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'
2. gradle升级
下载gradle-7.5-bin.zip,打开unity安装目录applications/unity/hub/editor/2021.3.36/playbackengines/androidplayer,把刚下载的gradle压缩包拷贝到androidplayer目录下, 解压替换原来的**/gradle**文件夹
3. r8升级
打开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")
ps:unity2021.3.11版本里是没有这一行的,需要手动添加整个pluginmanagement,代码如下:
pluginmanagement {
buildscript {
repositories {
mavencentral()
google()
}
dependencies {
classpath("com.android.tools:r8:8.3.37")
}
}
}
include ':launcher', ':unitylibrary'
**includes**
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
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
发表评论