-
Notifications
You must be signed in to change notification settings - Fork 3
Description
背景
假设你已经知道2025年11月份后,Google商店要强制所有需要更新的应用都需要支持16KB页面大小。假如你不清楚,建议阅读官网,我就不累赘了。
对于游戏开发者来说,最头疼就是老项目的Unity版本是否支持Google这个所谓的16KB页面标准了,不知道自己的Unity版本是否支持16KB页面的,可以查看这个地址,上面详细罗列了哪些Unity版本系列,从哪个版本分支开始支持16KB页面标准。什么,你的Unity还是5.x、6.x、2017、2018、2019、2020的?那真是个大冤种了!不好意思,除非你有Unity源码,不然通通都要升级Unity版本。
我有两个旧项目需要升级,涉及到海外N个地区,被Google搞这么一出,一个头两个大。至于选择升级到哪个Unity版本来支持16KB的,我的建议是:如果你的Unity大版本<= Unity2021的,那就升级到Unity2021.3.48+版本。因为Unity2022开始,无论从打包资源加载还是一些API、安全机制等,都有比较大的迭代和修改,到时候你的工作量很可能大部分会花在引擎本身的兼容性上,对于老项目来说,升级到Unity2021版本性价比是最高的。
至于怎么升级Unity,这个就不展开讨论了,总结就是用新的Unity版本加载旧的项目时,有什么报错就解决什么报错,兵来将挡,水来土掩。
Android打包
这里我们只讨论Android打包里面涉及到的插件问题。你如果旧项目的Unity版本太旧的话,新版本的Unity是需要依赖Gradle的,这个需要提醒一下,打包Android APK时候要保持网络畅通,并且能访问国外的一些网站,不然Gradle打包的时候,就会报类似
* Where:
Build file 'E:\android_project\client\game\Library\Bee\Android\Prj\IL2CPP\Gradle\build.gradle' line: 6
* What went wrong:
Plugin [id: '[com.android.application', version: '7.4.2', apply: false] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'com.android.application:com.android.application.gradle.plugin:7.4.2')
Searched in the following repositories:
Gradle Central Plugin Repository
Google
MavenRepo
就拿我用的Unity2021.3.50f1版本来说:
- JDK 11
- NDK r21d(21.3.6528147)
- SDK
- SDK Build tools version 34.0.0
- SDK Command-line tools version 6.0
- SDK Platform tools version 30.0.4
- Gradle 7.5.1
不清楚自己Unity版本需要下载哪些版本的Android插件的,可以参考Unity Android SDK依赖和Gradle依赖。
在Unity的”Edit/Preferences/External Tools“里面设置,各个版本需要一一对应,当然,如果你不是内网状态的话,可以用Unity Hub来下载这些插件,就不需要折腾一步了。
libxlua.so支持16KB
这张图里面说得很清楚,如果项目里面依赖的第三方库不支持16KB,需要自己自行处理。
我们工程是依赖xlua的,但是xlua目前似乎还没明确怎么支持,于是借助cursor和自行研究,找到了解决方案。
- 下载自己用的对应版本的xlua工程。
- 源码工程根目录下的
build目录下面,找到luajit-2.1.0b2和luajit-2.1.0b3目录。 - 这两个目录下面
src目录下都有一个同名文件lj_arch.h。 - 修改代码
// 旧代码
#ifndef LJ_PAGESIZE
#define LJ_PAGESIZE 4096
#endif
// 修改为
#ifndef LJ_PAGESIZE
#ifdef __ANDROID__
#define LJ_PAGESIZE 16384
#else
#define LJ_PAGESIZE 4096
#endif
#endif- 然后修改
make_android_lua53.sh(我是用的是5.3版本,mac机来编译的,按照自己的版本和编译环境修改)
# 旧
build android-16 armeabi-v7a arm-linux-androideabi-4.9
build android-16 arm64-v8a arm-linux-androideabi-clang
build android-16 x86 x86-4.9
# 新
build android-35 armeabi-v7a arm-linux-androideabi-4.9
build android-35 arm64-v8a arm-linux-androideabi-clang
build android-35 x86 x86-4.9- 最后NDK用
r28c(这个是目前最新稳定版本)来编译,就大功告成了。
用检测脚本可以看出:
官方已经解释了2**14也满足标准,编译APK的时候,libxlua.so也不会有Plugin 'Assets/Plugins/Android/libs/arm64-v8a/libxlua.so' is not 16KB-aligned. This may cause issues on ARM64 devices running Android 15+.的警告了
检查.so文件是否符合16KB
补充
有些项目可能升级Unity成本太高了,或者太懒了,社区也有分享不升级Unity兼容16KB页面大小,有兴趣可以参考这个链接。