商道如狼道 发表于 2024-11-1 07:28:05

Unity2020升级安卓14

Unity 2020 适配Android14(兼容方案)
记载 Unity版本:2020.3.48f1c1 升级兼容安卓14的流程步调
(条件允许可以升级2021.3.34以后的版本,不需要改原生代码)
一.修改打包情况
1.下载openjdk11
https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html
2.下载gradle
https://services.gradle.org/distributions/gradle-7.4.1-all.zip
3.打包方案: 自定义打包模板文件
https://i-blog.csdnimg.cn/direct/e8f29516ae9142ca858c9493c5bd847b.png
4.修改模板文件 compileSdkVersion 34 以及 jdk版本 JavaVersion.VERSION_11
▪launcherTemplate.gradle
https://i-blog.csdnimg.cn/direct/917b2abae30d4729b4868d9b1642f58b.png
▪mainTemplate.gradle
https://i-blog.csdnimg.cn/direct/ca22803ed95048ba99f32a5a52374c85.png
5.修改模板文件 baseProjectTemplate.gradle gradle版本和google-service版本
classpath ‘com.android.tools.build:gradle:7.3.1’
classpath ‘com.google.gms:google-services:4.3.0’
https://i-blog.csdnimg.cn/direct/90ae15bdc45e49328fee619afa65a99f.png
6.修改模板文件 gradleTemplate.properties 修改jdk路径以及注释 enableR8
org.gradle.java.home=第一步下载并解压之后的jdk路径 (bin目次的上层文件夹)
https://i-blog.csdnimg.cn/direct/77dfe0d8ee974ca2b7f873b16afaae4c.png
7.指定Unity gradle版本
https://i-blog.csdnimg.cn/direct/4714f6c8ddc14c0098ea4598b1731967.png
二.原生代码兼容修改

[*]游戏主Activity重载无flag参数的registerReceiver方法,针对安卓14版本补齐默认参数
(留意: 默认参数需要跟Activity声明的exported属性划一)
https://i-blog.csdnimg.cn/direct/b7a1068f9e214214b1ae30abfba748cd.png
@Override
public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
return super.registerReceiver(receiver, filter,android.content.Context.RECEIVER_EXPORTED);
return super.registerReceiver(receiver, filter);
}
@Override
public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
return super.registerReceiver(receiver, filter, broadcastPermission, scheduler,android.content.Context.RECEIVER_EXPORTED);
return super.registerReceiver(receiver, filter, broadcastPermission, scheduler);
}
2. Unity2020 jar内置原生代码替换 (这一步仅Untiy2020需要处理)
引擎dex路径: (留意游戏是mono还是il2cpp)
2020.3.48f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes\classes.dex
i.预备工具:
1.dex2jar 和 dsmali 以及 jar2dex
a.下载地址:https://github.com/pxb1988/dex2jar
2.jd 检察jar内class
a.下载地址:https://java-decompiler.github.io/
ii.检察unity2020的classes.jar: 发现unity自带的class引用了旧的tasks包 需要解包替换重新生成对应的jar
https://i-blog.csdnimg.cn/direct/1c42d7d0ffe64d4f98b2548f06b60691.png
iii.解包Dex d2j-baksmali classes.dex
1.打开解包出来的文件夹并替换依赖包路径:
a.com/google/android/play/core/tasks ->com/google/android/gms/tasks
https://i-blog.csdnimg.cn/direct/24b587e751564d4386679bc6afe8f7ab.png
2.重新打包成dex d2j-smali classes-out
3.检察修改是否生效 jd检察out.dex文件
https://i-blog.csdnimg.cn/direct/00ed678100094449a6965df45b0c3558.png
4.生成对应的jar d2j-dex2jar out.dex
a.这里有两种方式覆盖引擎的classes.jar
i.新建一个aar 包含修改后的classes.jar, 然后gradle文件过滤掉unity-classes.jar (我们目前采取的是这个方案)
https://i-blog.csdnimg.cn/direct/43e15273474a46b2b8031e32bb047f4a.png
ii.直接覆盖归去,把引擎的classes.jar 和 dex文件都覆盖 (覆盖之前记得备份一个,以防玩脱)

[*]修改gradle依赖 (替换 com.google.android.play:core:1.10.0)
(这一步2021.3.34f1以后的版本也不需要处理)
https://i-blog.csdnimg.cn/direct/0c2d300e19af48c6ac3994ef67836af7.png
i.方式1: 打包前的预处理回调可以通过脚本替换依赖,(这个方式我们没走通,主要是依赖下载不下来)
ii.方式2:把aar下载下来 , 直接修改gradle文件,改成本地依赖
https://i-blog.csdnimg.cn/direct/8aac97ad580c4f52bae85deabca92715.png
//替换google依赖
implementation(name: 'asset-delivery-2.2.2', ext:'aar')
implementation(name: 'app-update-2.1.0', ext:'aar')
implementation(name: 'play-services-tasks-18.2.0', ext:'aar')
implementation(name: 'core-common-2.0.4', ext:'aar')
下载地址:https://maven.google.com/web/index.html
或者 https://mvnrepository.com/artifact/com.google.android.play

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Unity2020升级安卓14