确保您的 Android 游戏已准备好支持 64 位





1.00/5 (1投票)
在本文中,我们将探讨一些您必须更新 32 位应用的常见情况,例如:需要将旧的安卓项目更新到更高的 API 级别、在 Unity 等游戏引擎中工作,以及在使用了 Cocos2d-x 等原生库的安卓项目中工作。
如果您一直关注安卓开发,那么您很可能听说过谷歌应用商店关于 64 位应用程序的政策变更。
如果您没有一直关注安卓开发,那么您可能会想:“我在说什么?”谷歌已在一篇博文中宣布,现在要求所有新的原生移动应用都必须包含 64 位支持。该博文提到了您必须为应用提供 64 位版本的具体时间表。
从 2019 年 8 月开始
- 所有包含原生代码的新应用和应用更新在发布到 Google Play 时,除了 32 位版本外,还必须提供 64 位版本。
- 延期:对于使用 Unity 5.6 或更早版本构建的现有游戏,Google Play 将继续接受仅支持 32 位的更新,直至 2021 年 8 月。
从 2021 年 8 月开始
- Google Play 将停止在支持 64 位的设备上提供没有 64 位版本的应用,这意味着这些应用将不再出现在这些设备的 Play 商店中。
- 这将包括使用 Unity 5.6 或更早版本构建的游戏。
2017 年 12 月,谷歌发表了一篇博文,公布了他们支持 64 位应用的推出计划,所以对于一直关注安卓博客的开发者来说,这应该不算完全的意外。无论如何,如果您还没有准备好,也不用担心,情况并没有您想象的那么糟!
64 位应用的优势
您可能想知道的第一件事是,为什么我们必须将应用更新以支持 64 位?简短的回答是,因为谷歌是这么规定的,如果您希望您的应用能在他们的商店上架,就必须遵守他们的规则。
如果您想知道谷歌为什么这么规定,那是因为我们手机硬件性能的提升。因此,谷歌开始要求开发者构建能够利用新型 64 位硬件的应用。
迁移到 64 位架构的一些好处是手机可以:
- 支持更多内存。32 位手机最多只能支持 4GB 内存 (2^32),而理论上 64 位手机可以支持 16 EB 内存 (2^64)。
- Arm 的 64 位架构将寄存器数量从 16 个增加到了 32 个。这意味着更多的循环展开和更少的堆栈溢出,这可以带来不错的性能提升。
- 借助 64 位指针,Arm 能够添加提高您手机安全性的功能——如果您感兴趣,可以在此处阅读更多信息。
通过更新您的应用以利用 64 位手机,谷歌正在鼓励其生态系统中的性能和安全优化。
什么是“为 64 位做好准备”?
现在,假设您和我一样,直到谷歌发出最新警告之前什么都没做。您该怎么办?首先,不要惊慌!您的应用很有可能已经为 64 位做好了准备!
64 位支持是在 2014 年 11 月 12 日发布的 Android 5.0 Lollipop 中正式添加的。Android 5.0 相当于 API 级别 21。
对于安卓应用,您可以设置 2 个设置来指定您的 API 级别:
- 最低 SDK 级别 (Minimum SDK Level) - 您的应用所支持的最低 API 级别。任何 API 版本低于此级别的手机都无法运行您的应用。此设置还将您的应用可用的功能限制为最低 SDK 级别可用的功能。
- 目标 SDK 级别 (Target SDK Level) - 您的应用所针对的 API 级别。低于此级别的设备将运行安卓的兼容性代码,为不支持目标 SDK 级别的手机提供类似的体验。
从让应用支持 64 位的角度来看,我们需要确保我们的目标 SDK 级别至少为 21,以允许 Android Studio 支持 64 位架构。不过,展望未来,这还不够。
如前所述,如果您要向 Play 商店添加新应用或更新现有应用,则必须将目标 API 级别设为 26 (Android 8.0) 或更高。正如谷歌在最近的一篇博文中概述的那样,从 2019 年 8 月开始,新应用将需要将目标 API 级别设为 28 (Android 9.0)。
如果您正在更新现有应用,则从 2019 年 11 月开始,您必须将目标 API 级别设为 28。谷歌整理了一份重要变更列表,您在升级时应予以注意。
过去,每当安卓发布新的 API 级别时,都建议开发者将目标 SDK 级别更改为与最新级别匹配,并保持最低 SDK 级别不变。
我们现在处于什么阶段?如果我们查看安卓的分布仪表板:
您可以看到,在撰写本文时,如果我们选择使用 API 级别 21 作为最低标准,我们将只错过总安卓市场的 11.1%。换句话说,当今正在使用的 88.9% 的安卓设备都运行着支持 64 位的安卓版本。
如果您的应用完全用 Java 编写,并且目标 API 级别为 21 或更高,那么您的应用几乎已经为 64 位做好了准备!请记住,在利用新的安卓功能的同时,继续支持旧的 API 级别可能会很困难。
实际上,您需要将最低 API 级别设定为尽可能高的水平。尽管仍有相当一部分人使用旧的安卓版本,但您应用的目标受众可能并非如此。
谁会遇到最多问题?
那么,如果您不是上面提到的幸运儿之一呢?如果您使用像 Unity 这样的游戏引擎来开发应用,或者您的应用是为较低的 API 版本开发的,该怎么办?
如果您的应用符合以下情况,您可能需要对其进行一些升级:
- 目标 SDK 级别为 25 或更低
- 使用像 Unity 这样的游戏引擎来构建移动游戏
- 使用原生 C/C++ 代码
幸运的是,即使您在此列表上,创建 64 位应用也并不太难。
安卓目标 SDK 级别为 27 或更低
如果您当前项目的目标 API 级别为 27 或更低,那么是时候将您的应用更新到目标 API 级别 28 了,因为从 2019 年 8 月开始,这将是新应用的最低 API 目标,正如我们所见,这也是添加 64 位要求的同一时间。
我不会对此进行过多详细说明,但要支持 API 级别 28,需要完成两件事:
- 更新您模块的 build.gradle 文件中的 targetSdkVersion 和 compileSdkVersion,使其至少为 28。CompileSdkVersion 是用于构建我们应用程序的 API 级别版本。这个数字通常与 targetSdkVersion 相同。
- 更新并修复您在更新 API 级别时会遇到的任何编译器和运行时错误。再次强调,这里是谷歌关于升级到较新 API 级别的说明。
通过这些更改,您的应用将为 64 位做好准备。
游戏引擎(如 Unity)中的 64 位支持
开发移动安卓游戏的另一个流行平台是通过游戏引擎,如 Unity 和 Unreal Engine。创建 64 位应用的能力取决于开发团队决定添加该支持的版本。
如果您使用的是旧版游戏引擎,您别无选择,只能将项目升级到支持 64 位的版本,并重构任何已弃用或更改的代码。
唯一的例外是,如果您的应用是使用 Unity 5.6 或更早版本构建的。那里的规则是“对于使用 Unity 5.6 或更早版本构建的现有游戏,Google Play 将继续接受仅支持 32 位的更新,直至 2021 年 8 月。”
不更新您的 Unity 版本只会推迟不可避免的事情,幸运的是,更新过程不必缓慢而混乱。Unity 文档提供了有关升级到特定 Unity 版本的详细信息,可在此处找到。
项目中的原生代码
现在来到今天的主题!如果我们有一个使用原生 C/C++ 库的安卓项目怎么办?就像上面提到的两种情况一样,我们必须将库更新到支持 64 位的版本。
除了将您的原生依赖项升级以支持 64 位外,我们还需要对安卓 NDK 设置项目进行配置,以构建支持 64 位的 APK。
安卓 NDK 是一套工具,可让您的安卓 Java 应用与原生代码(特别是 C 和 C++)协同工作。
具体来说,在我们的 gradle 文件中,我们需要为 abiFilters 设置一个选项,以包含我们希望为原生代码构建的特定 CPU 架构。具体来说,四大架构是:
- armeabi-v7a
- arm64-v8a
- x86
- x86_64
我们需要构建 64 位应用的架构是 arm64-v8a 和/或 x86_64。在我们的示例中稍后会详细介绍。
使用 Cocos2d-x 项目设置示例
为了演示如何使用原生代码构建 64 位安卓应用,我将使用一个名为 Cocos2d-x 的原生跨平台游戏引擎构建一个示例项目。
我最初打算下载不支持 64 位的 Cocos2d-x 2.2.6,并展示如何将其转换为 64 位应用。我想展示我们如何可以更新 Cocos2d-x 中的依赖项以支持 64 位,从而构建一个 64 位应用,或者将现有的 Cocos2d-x 2.x 应用迁移到最新版本。
在这两种情况下,所需的工作量都远远超出了本文的范围。旧版 Cocos2d-x 在引擎中包含了与 64 位不兼容的汇编语言部分。新版 Cocos2d-x 发生了巨大变化,需要大量工作才能将现有代码移植到新版引擎。
这凸显了一个重要观点。尽管如果您的所有依赖项都有现成的 64 位版本,那么让您的游戏兼容 64 位会很容易,但情况并非总是如此。您可能需要为您所依赖的库创建自定义的 64 位兼容构建。或者,您可能必须修改游戏代码以适应新版本的库和游戏引擎。无论哪种方式,您都可能面临大量工作。这就是为什么如果您还没有开始,现在就应该开始确保您的游戏为 64 位做好准备。
在尝试了更新 Cocos2d-x 2.x 和移植到 3.x,并发现这两种方法都至少需要一整篇文章来阐述后,我决定跳过这一步,直接使用已经支持创建 64 位应用的 Cocos2d-x 3.17.1 开始一个新的示例项目,并展示我们如何从一个 32 位应用开始,并添加 64 位支持。
安装和设置 Cocos2d-x 项目
要让 Cocos2d-x 正常工作需要做不少工作,但让我们开始吧。我假设我们已经安装了可用的 Android Studio 以获取一些必备文件。尽管截图是在 Windows 上截取的,但这些说明在 MacOS 和 Linux 上应该也能正常工作。
- 从网站下载 Cocos2d-x 3.17.1 压缩包并解压文件。
- 下载并安装 python 2.7.x,确保选择将 python 添加到您的 PATH 的选项,以便我们可以在命令提示符中引用它。
- 打开您的命令提示符/终端,并导航到您解压 Cocos2d-x 的目录,然后运行命令 python setup.py。这将安装使用 Cocos2d-x 所需的所有依赖项。
- 运行安装程序时,系统会提示您添加 NDK_ROOT (Windows 上为 C:\Users\<用户名>\AppData\Local\Android\sdk\ndk-bundle) 和 ANDROID_SDK_ROOT (Windows 上为 C:\Users\<用户名>\AppData\Local\Android\sdk)。
- 安装完成后,是时候创建一个新项目了。通过运行:cocos new MyCppGame -l cpp 来完成此操作,这将创建一个名为 MyCppGame 并支持 C++ 的游戏。目录结构如下:
对我们来说重要的两个文件夹是位于 proj.android 的安卓项目和位于 Classes 的 C++ 代码。
- 使用 Android Studio,我们可以在 Android Studio 欢迎页面选择打开现有 Android Studio 项目,然后选择我们的 proj.android 文件夹来打开生成的项目。
构建并生成我们演示项目的安卓 APK
此时,我们会遇到 gradle 的问题,我们的项目将无法正常构建。
事实证明,这是一个 Cocos2d-x 特有的问题。在我们能使用 Android Studio 编辑项目之前,我们需要先编译我们的项目!
在修复项目之前,我们需要从 SDK 管理器 (可以通过 Android Studio 中的 工具 > SDK 管理器 访问) 安装三个工具来帮助构建我们的项目:
- LLDB – Android Studio 用于调试原生代码的调试器。对于本示例,LLDB 不是必需的,但拥有一个可用的调试工具总是好的!
- CMake – 一个构建工具,在 Gradle 中用于构建我们的原生库。
- NDK – 安卓原生开发工具包是一套工具集,允许安卓在我们的项目中构建和编译原生代码。
在此之后,我们需要安装 Cocos2d-x 用来编译项目的构建系统。这个项目叫做 Ninja。
- 下载 Ninja
- Ninja 以 zip 压缩包形式提供。解压它并将其放在您系统上的某个文件夹中。
- 最后,我们需要将 Ninja 所在的文件夹添加到环境变量的 PATH 中。在 Windows 上,您可以通过右键单击“我的电脑” > “属性” > “高级系统设置” > “高级” > “环境变量”来编辑环境变量。在 Linux 或 MacOS 上,将目录添加到 PATH 的方法取决于您使用的 shell。
- 关闭您的命令提示符/终端,然后重新打开,以便我们添加的更改生效。
现在我们已经具备了所有必要条件,我们终于可以编译我们的安卓项目了!
- 在您的命令提示符/终端中,导航回 MyCppGame 文件夹保存的位置。
- 是时候编译我们的安卓项目了!运行:cocos compile -p android。该命令将构建并编译我们的安卓项目,同时为我们的安卓设备生成一个调试版的 APK。需要注意的是,每当我们做出更改时,都必须运行相同的命令来重新构建您的项目。
- 回顾我们的 MyCppGame 文件夹,我们会看到多了一个 bin 文件夹。如果您打开所有文件夹,您会发现 Cocos2d-x 为我们构建了一个调试模式的 APK!
如何判断您的应用是否是 64 位
太棒了!我们终于有了一个可以提交到 Google Play 商店的游戏 APK!
但是,在我们这么做之前,我们如何确认我们的应用真的是一个 64 位应用?有几种方法可以做到这一点,正如谷歌所概述的。我将使用 Android Studio 的APK 分析器工具来验证我们的应用。
- 在 Android Studio 中,转到构建 > 分析 APK… 并选择我们用 Cocos2d-x 创建的 APK。
您会看到类似这样的界面:
通过查看 lib 文件夹,您可以判断您的应用是支持 32 位还是 64 位。
lib 文件夹包含了我们的应用使用的 CPU 架构。如您所见,我们的应用使用了 armeabi-v7a。谷歌为我们提供了一个表格,显示了哪种架构支持哪种位数:
如您所见,我们当前的应用是一个 32 位应用。这可不好,谷歌不会接受我们的应用进入 Play 商店!
将我们的安卓应用转换为 64 位
正如我们发现的,我们的应用不支持 64 位!幸运的是,这个问题可以相当容易地解决。
- 在 Android Studio 中打开我们的项目
- 将我们的项目视图更改为项目视图
根据我们构建项目的方式,有几种方法可以为我们的应用添加 64 位支持。
- 如果我们使用 CMake,我们只需运行命令 cmake -DANDROID_ABI=arm64-v8a 来构建一个 64 位应用。
- 如果我们使用 NDK,我们会打开我们的 makefile:Application.mk,并将我们的 APP_ABI 更改为 APP_ABI := armeabi-v7a:arm64-v8a,这样它就会同时编译 32 位的 armeabi-v7a 架构和 64 位的 arm64-v8a 架构。
- 如果我们使用 gradle(我们正在使用),在我们的 build.gradle 文件中,在 android > defaultConfig 下,我们会将我们的 ndk.abiFilters 设置为使用 'armeabi-v7a' 'arm64-v8a'。
在 Cocos2d-x 的情况下,我们的设置有点不同。
在我们的 build.gradle 文件中,我们有以下内容:
如您所见,我们从 PROP_APP_ABI 获取 ndk.abiFilters,该变量位于我们的 gradle.properties 文件中。
我将 arm64-v8a 添加到了 PROP_APP_ABI,这将使我们的应用支持 64 位!
- 构建您在 gradle.properties 中所做的更改,并确保我们不会遇到构建问题。
- 回到我们的命令提示符,运行 cocos compile -p android,等待我们的应用完成编译并生成新的 APK。
注意:一个有趣的事情是,您可以将 PROP_COMPILE_SDK_VERSION 和 PROP_TARGET_SDK_VERSION 更改为 19,然后尝试在 Android Studio 中重新构建,您会收到一条消息,说不支持 64 位架构。
验证我们的应用现在支持 64 位
就像我们之前做的那样,让我们用 APK 分析器打开我们新的 APK。
这是我们会看到的:
成功!我们的 APK 现在支持 arm64-v8a,这是 libMyGame.so 的一个 64 位 CPU 架构!这样一来,我们的应用现在同时支持 32 位和 64 位移动设备,我们准备好将它提交到 Google Play 商店了!
构建一个发布版的 APK
到目前为止,我们用 Cocos2d-x 构建的 APK 都是调试版的。虽然这很好,因为它允许我们添加特定的调试代码来帮助我们在生产环境中测试代码,但对于发布版本,我们不需要这些额外的开销。
当您准备好创建并在 Play 商店上发布您的应用时,您需要创建用于分发的 APK。
要做到这一点,请前往 Android Studio
- 转到 构建 > 生成已签名的 Bundle / APK…
- 在弹出的向导中,选择 APK 并点击下一步。
- 点击新建… 来创建一个新的 密钥库 (KeyStore)。
- 填写您的信息,并将您的 .jks 文件保存在一个您能记住的位置,然后点击确定。这个文件在您以后提交应用时会很重要,所以请妥善保管!
- 点击下一步进入向导的最后一步
- 最后,在向导的最后一步,选择您想要保存 APK 的位置,创建一个发布 (release) 版的 APK,选择 V2 签名版本,然后点击完成来创建您的发布版 APK!
APK 将被放置在您设置 APK 目录下的一个 release 文件夹中。
现在为了证明这个新的发布版 APK 支持 64 位,我再次用 APK 分析器打开了它,结果如下:
如您所见,我们有 arm64-v8a,这意味着我们支持 64 位!
至此,我们终于有了一个经过发布优化并支持 64 位的 APK,可以提交到 Google Play 商店了!恭喜!
结论
谷歌的八月截止日期可能还有 6 个月,但如果您希望确保您的应用能进入 Google Play 商店,您必须确保您的应用能够支持日益增多的 64 位移动设备。尽早更新您的应用也更好,这样您就有时间发现并解决可能出现的兼容性问题。
在本文中,我们探讨了您必须更新 32 位应用的常见情况,包括但不限于:
- 有一个需要更新到更高 API 级别的旧安卓项目
- 在像 Unity 这样的游戏引擎中工作
- 在一个使用像 Cocos2d-x 这样的原生库的安卓项目中工作。
希望在阅读完本文并通过 Cocos2d-x 将一个示例项目转换为 64 位应用后,您现在已经掌握了配置安卓项目以构建 64 位应用所需的知识。
如果您想更深入地了解如何让您的应用支持 64 位设备,谷歌提供了关于该主题的优秀文档。我建议阅读他们关于确保您的应用支持 64 位设备以及如何向您的项目添加 C 和 C++ 代码的指南。