Skip to content

Unity游戏工程支持Android 15+的16KB页面大小 #44

@Checkson

Description

@Checkson

背景

假设你已经知道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

Image

这张图里面说得很清楚,如果项目里面依赖的第三方库不支持16KB,需要自己自行处理。

我们工程是依赖xlua的,但是xlua目前似乎还没明确怎么支持,于是借助cursor和自行研究,找到了解决方案。

  • 下载自己用的对应版本的xlua工程。
  • 源码工程根目录下的build目录下面,找到luajit-2.1.0b2luajit-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(这个是目前最新稳定版本)来编译,就大功告成了。

用检测脚本可以看出:

Image

官方已经解释了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+.的警告了

Image

检查.so文件是否符合16KB

请参考这里

补充

有些项目可能升级Unity成本太高了,或者太懒了,社区也有分享不升级Unity兼容16KB页面大小,有兴趣可以参考这个链接

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions