参加一系列免费在线讲座,学习知识和经验,拓展在 Google Play 上的业务。立即报名

确保您的应用支持 64 位设备

2019 年 8 月 1 日开始,您在 Google Play 上发布的应用必须支持 64 位架构。64 位 CPU 能够为您的用户提供更快、更丰富的体验。添加 64 位的应用版本不仅可以提升性能、为未来创新创造条件,还能针对仅支持 64 位架构的设备做好准备。

本指南介绍了如何确保 32 位应用为支持 64 位设备做好准备,供您随时采用。

评估您的应用

如果您的应用仅使用以 Java 编程语言或 Kotlin 编写的代码(包括任何库或 SDK),那么就表示该应用已经支持 64 位设备。如果您的应用使用了任何原生代码,或者您不确定自己的应用是否使用了这类代码,那么您需要评估应用并相应采取措施。

您的应用是否使用了原生代码?

首先需要检查您的应用是否使用了任何原生代码。如果您的应用符合以下情况,便是使用了原生代码:

  • 使用了任何 C/C++(原生)代码。
  • 与任何第三方原生库关联。
  • 通过使用原生库的第三方应用构建程序构建而成。

您的应用是否包含 64 位库?

要确定应用是否包含 64 位库,最简单的方法就是检查 APK 文件的结构。在编译时,APK 会与应用所需的所有原生库打包在一起。原生库会根据 ABI 而存储在不同的文件夹中。您的应用无需支持所有 64 位架构,但对于您支持的每种原生 32 位架构,则应用都必须包含相应的 64 位架构。

对于 ARM 架构,32 位库位于 armeabi-v7a 中。对应的 64 位库位于 arm64-v8a 中。

对于 x86 架构,请查找 x86(32 位)和 x86_64(64 位)。

首先要确保这两个文件夹中都有原生库。总结如下:

平台 32 位库文件夹 64 位库文件夹
ARM lib/armeabi-v7a lib/arm64-v8a
x86 lib/x86 lib/x86_64

请注意,每个文件夹中的一套库可能完全相同,也可能不完全相同,这取决于您的应用。您应达到的目标是确保您的应用能够在仅支持 64 位架构的环境中正常运行。

通常情况下,同时针对 32 位和 64 位架构编译的 APK 或软件包会具有这两种 ABI 的文件夹,每个文件夹中都有一套相应的原生库。如果您的应用不支持 64 位架构,那么您很可能会看到 32 位 ABI 文件夹,但不会看到 64 位文件夹。

使用 APK 分析器查找原生库

APK 分析器是可用来对所编译的 APK 进行各方面评估的工具。针对我们目前所讨论的情况,我们将使用该工具查找原生库,以确定是否具备 64 位库。

  1. 打开 Android Studio,然后打开任一项目
  2. 从菜单中依次选择 Build > Analyze APK…

启动 APK 分析器

  1. 选择您要评估的 APK。
  2. 查看 lib 文件夹,您可以在其中找到所有“.so”文件。如果在您的应用中找不到任何“.so”文件,则说明该应用已经准备好相应的库,您无需采取进一步措施。如果您看到 armeabi-v7ax86,则说明您有 32 位库。

  3. 检查是否在 arm64-v8ax86_64 文件夹中也有类似的“.so”文件。

    启动 APK 分析器

  4. 如果您没有任何 arm64-v8ax86_64 库,则需要更新编译流程以开始在 APK 中编译并打包相应工件。

  5. 如果您看到 32 位和 64 位的库均已打包到软件包中,则可以跳至在 64 位设备上测试应用

在解压缩的 APK 中查找原生库

APK 文件的结构类似于 zip 文件,可以像 zip 文件一样解压缩。如果您更喜欢使用命令行或任何其他解压缩工具,也可以采用解压缩 APK 的方法。

只需解压缩 APK 文件(根据您使用的解压缩工具,您可能需要将其重命名为 .zip),然后按照上文中的指南浏览解压缩后的文件,即可确定您的应用是否已经为支持 64 位设备做好准备了。

例如,您可以从命令行中运行如下命令:

:: Command Line
    > zipinfo -1 YOUR_APK_FILE.apk | grep \.so$
    lib/armeabi-v7a/libmain.so
    lib/armeabi-v7a/libmono.so
    lib/armeabi-v7a/libunity.so
    lib/arm64-v8a/libmain.so
    lib/arm64-v8a/libmono.so
    lib/arm64-v8a/libunity.so
    

请注意,此示例中存在 armeabi-v7a 库和 arm64-v8a 库,这表明该应用支持 64 位架构。

使用 64 位库编译应用

下面针对编译 64 位库做出了相关的说明。不过,需要指出的是,以下内容仅介绍了如何编译在源代码的基础上可编译的代码和库。

如果您使用任何外部 SDK 或库,请确保按照上文所述的步骤使用 64 位版本。如果没有 64 位版本可用,请与相应 SDK 或库的所有者联系,并在规划支持 64 位设备的方案时将这一点考虑在内。

使用 Android Studio 或 Gradle 进行编译

大多数 Android Studio 项目都使用 Gradle 作为底层编译系统,因此本部分适用于使用这两种工具进行编译的情况。针对原生代码进行编译很简单,只需将 arm64-v8a 和/或 x86_64(取决于您要支持的架构)添加到应用的“build.gradle”文件中的 ndk.abiFilters 设置:

// Your app's build.gradle
    apply plugin: 'com.android.app'

    android {
       compileSdkVersion 27
       defaultConfig {
           appId "com.google.example.64bit"
           minSdkVersion 15
           targetSdkVersion 28
           versionCode 1
           versionName "1.0"
           ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
    // ...
    

使用 CMake 进行编译

如果您的应用是使用 CMake 编译的,则可以通过将 arm64-v8a 传递到“-DANDROID_ABI”参数来编译 64 位 ABI:

:: Command Line
    > cmake -DANDROID_ABI=arm64-v8a … or
    > cmake -DANDROID_ABI=x86_64 …
    

在使用 externalNativeBuild 时,此方法无效。请参阅使用 Gradle 进行编译部分。

使用 ndk-build 进行编译

如果您的应用是使用 ndk-build 编译的,则可以通过 APP_ABI 变量修改“app.mk”文件,从而编译 64 位 ABI:

APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
    

在使用 externalNativeBuild 时,此方法无效。请参阅使用 Gradle 进行编译部分。

利用 Android App Bundle 减小大小增加量

为您的应用添加 64 位架构支持可能会导致 APK 的大小增加。我们强烈建议您利用 Android APP Bundle 功能,以尽量减小因在同一 APK 中同时包含 32 位和 64 位原生代码而对 APK 大小产生的影响。

实际上,让应用改用 Android App Bundle 不仅能够降低 APK 大小,甚至能让其变得比现在更小。

游戏开发者

我们知道,迁移第三方游戏引擎是一个耗费人力的过程,并且需要很长的准备时间。庆幸的是,三大最常用的引擎目前都支持 64 位架构:

  • Unreal(自 2015 年起)
  • Cocos2d(自 2015 年起)
  • Unity(自 2018 年起)

Unity 开发者

升级到支持的版本

Unity 自版本 2018.22017.4.16 开始提供 64 位支持。

如果您发现自己使用的 Unity 版本不支持 64 位架构,请确定要升级到的版本,并按照 Unity 提供的指南迁移您的环境,确保将您的应用升级到可编译 64 位库的版本。Unity 建议您升级到该编辑器的最新 LTS 版本,以获取最新的功能和更新。

下面的图表概述了 Unity 的各个版本以及您应该采取的措施:

Unity 版本 版本是否支持 64 位架构? 建议采取的措施

2018.4 (LTS)

✔️

(待发布)确保您的编译设置能够输出 64 位库。

2018.3

✔️

确保您的编译设置能够输出 64 位库。

2018.2

✔️

确保您的编译设置能够输出 64 位库。

2018.1

提供实验性的 64 位支持。

2017.4 (LTS)

✔️

2017.4.16 起支持 64 位架构。确保您的编译设置能够输出 64 位库。

2017.3

✖️

升级到支持 64 位架构的版本。

2017.2

✖️

升级到支持 64 位架构的版本。

2017.1

✖️

升级到支持 64 位架构的版本。

<=5.6

✖️

升级到支持 64 位架构的版本。

确保编译设置能够输出 64 位库

如果您使用的 Unity 版本支持 64 位 Android 库,则可以通过调整编译设置来生成 64 位版本的应用。您还需要使用 IL2CPP 后端作为 Scripting Backend(详见此处)。要为编译 64 位架构而设置 Unity 项目,请执行以下操作:

  1. 转到 Build Settings,然后确认 Unity 标志是否显示在 Android 平台旁边,以确保您是在针对 Android 进行编译。**
    1. 如果 Unity 标志未显示在 Android 平台旁边,请选择 Android,然后点击 Switch Platform
  2. 点击 Player Settings

    Unity 中的“Player settings”

  3. 依次转到 Player Settings Panel > Settings for Android > Other Settings > Configuration

  4. Scripting Backend 设为 IL2CPP

  5. 依次选择**“Target Architectures”> ARM64 复选框。

    在 Unity 中设置“Target Architectures”

  6. 照常进行编译!

请注意,在编译 ARM64 架构时,您需要专门针对该平台编译您的所有资源。请按照 Unity 的指南来缩减 APK 大小,同时考虑利用 Android APP Bundle 功能来减小大小增加量。

在 64 位硬件上测试应用

64 位版本的应用应提供与 32 位版本相同的质量和功能集。请对您的应用进行测试,以确保使用最新的 64 位设备的用户能够在您的应用中获得优质的体验。

要开始测试您的应用,您要有支持 64 位架构的设备。时下有很多支持 64 位架构的热门设备,例如 Google 的 Pixel 以及其他旗舰设备。

要测试您的 APK,最简单的方法就是使用 adb 安装该应用。大多数情况下,您可以提供 --abi 参数,用以指示要将哪些库安装到设备上。这样在设备上安装该应用时便会仅包含 64 位库。

:: Command Line
    # A successful install:
    > adb install --abi armeabi-v7a YOUR_APK_FILE.apk
    Success

    # If your APK does not have the 64-bit libraries:
    > adb install --abi arm64-v8a YOUR_APK_FILE.apk
    adb: failed to install YOUR_APK_FILE.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]

    # If your device does not support 64-bit, an emulator, for example:
    > adb install --abi arm64-v8a YOUR_APK_FILE.apk
    ABI arm64-v8a not supported on this device
    

安装成功后,请照常对应用进行测试,以确保其质量与 32 位版本相同。

发布

如果您觉得应用已准备妥当,请照常发布。与往常一样,请遵循部署应用的最佳做法。我们建议利用封闭式测试轨道向有限数量的用户发布应用,以测试应用的质量是否稳定。

在发布重大更新时,也务必要先在支持 64 位架构的设备上进行全面测试,然后再面向更广泛的受众群体发布。