您的当前位置:首页正文

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

2024-10-23 来源:个人技术集锦

升级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升级

打开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里勾选上就有了。

2. Gradle升级

3. R8升级

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

原始:

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

Top