[Unity] Unity Android14 适配 Android targetSdkVersion升级34(基于Unity2021.3LTS)

avatar
作者
猴君
阅读量:0

升级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文件就可以了。

构建工具使用版本

工具版本
UnityUnity2021.3.36 LTS
AGP7.4.2
Gradlegradle-7.5-bin.zip
OpenJDK11
R88.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编辑器的检测。

  1. 打开mainTemplate.gradle,修改JDK的版本。

原始:

compileOptions {     sourceCompatibility JavaVersion.VERSION_1_8     targetCompatibility JavaVersion.VERSION_1_8 } 

改为:

compileOptions {     sourceCompatibility JavaVersion.VERSION_11     targetCompatibility JavaVersion.VERSION_11 } 
  1. 打开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,一切都不是问题。

Unity官方论坛关于升级Android14的讨论


2024-07-25 更新

Unity在7月23号发布了新的版本-Unity 2021.3.41,升级了内置Gralde的版本,跟我的方案基本一致,条件允许的话可以通过直接升级Unity版本来解决。Unity 2021.3.41 Release Note

在这里插入图片描述

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!