如何制作支持32位和64位架构的Android应用程序?

Jor*_*mVF 24 64-bit android 32-bit android-ndk google-play

我刚收到并阅读了Google Play的时事通讯,提到从明年开始,该商店"将要求使用原生库的新应用和应用更新提供除32位版本之外的64位版本".

对于尚未阅读的人,它说:

2019年的64位支持要求

Android 5.0中引入了对64位体系结构的平台支持.今天,超过40%的在线Android设备具有64位支持,同时仍保持32位兼容性.对于使用本机库的应用程序,64位代码通常提供更好的性能,附加寄存器和新指令.

由于预计未来仅支持64位代码的Android设备,Play控制台将要求使用本机库的新应用和应用更新除了提供32位版本之外还提供64位版本.这可以在单个APK内,也可以作为发布的多个APK中的一个.

我们没有删除32位支持.Google Play将继续支持32位应用和设备.不包含本机代码的应用程序不受影响.

此更改将于2019年8月生效.我们今天提前通知,以便为尚未支持64位的开发人员提供充足的时间来规划转换.请继续关注未来的帖子,我们将深入了解Android上64位本机库的性能优势,并查看NDK的CPU和架构指南以获取更多信息.

在适用的情况下,我们需要做出哪些实际的改变才能完全符合这一新要求?

Jor*_*mVF 19

根据Google Play团队发送的官方电子邮件,所需的操作是:

如果您还没有,我们建议您尽快开始满足64位要求.许多应用程序完全使用非本机代码(例如Java编程语言或Kotlin)编写,不需要更改代码.

请注意,我们不会对32位支持的政策进行更改.Google Play将继续向32位设备提供具有32位本机代码的应用.该要求意味着这些应用程序也需要具有64位版本.

为了帮助您进行转换,我们准备了有关如何检查您的应用是否已支持64位以及如何成为64位兼容的文档.

我们还在下面提供了一个高级时间表.

因此,链接的文档说明:

如果您的应用程序仅使用用Java编程语言或Kotlin编写的代码,包括任何库或SDK,那么您的应用程序已经为64位设备做好了准备.如果您的应用使用任何本机代码,或者您不确定它是否存在,则需要评估您的应用并采取相应措施.

[...]

检查64位库的最简单方法是检查APK文件的结构.构建时,APK将与应用程序所需的任何本机库打包在一起.本机库基于ABI存储在各种文件夹中.它不需要支持每个64位体系结构,但对于您支持的每个本机32位体系结构,您必须包含相应的64位体系结构.

对于ARM体系结构,32位库位于armeabi-v7a中.64位的等价物是arm64-v8a.

对于x86架构,请查找32位的x86和64位的x86_64.

首先要做的是确保在这两个文件夹中都有本机库.[...]

而且,要构建64位库,您基本上需要按照以下说明操作:

大多数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'
// ...
Run Code Online (Sandbox Code Playgroud)

最后,快速说明:

64位版本的应用程序应提供与32位版本相同的质量和功能集.


Nic*_*cue 9

如果您没有本机(NDK)代码,那就是您只编写Java/Dex代码,那么您不需要做任何事情.

如果您有本机代码(或库),则需要提供其64位版本.

  • 如果我的应用程序中有ndk,我如何提供64位版本? (2认同)

sag*_*van 6

如果您的 Android APK 不包括 64 位支持,您无需担心。在 Android Studio 中转到 Build -> Analyze APK。您可以看到 APK 结构。在 lib 下,如果您看到armeabi-v7a库并且没有任何arm64-v8a或x86_64库,那么您的 APK 不支持 64 位架构。

只需转到应用程序级别build.gradle并添加如下abiFiltersNDK defaultConfig:

ndk {
    abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
}
Run Code Online (Sandbox Code Playgroud)


Irf*_*Haq 5

根据此处的文档,如果您的应用使用的是本机代码或外部库,例如基于本机的领域(如下图所示),则应提供对64位的支持。如果您的应用程序中使用任何C / C ++(本机)的任何外部库均应同时支持32位和64位体系结构,否则应与库所有者联系。在Android Studio中,我们可以通过Build> Analyze APK检查两种架构的版本是否可用,并显示以下窗口:

Android Studio标签显示可用的架构

如果您正在使用NDK并创建本机代码,则应通过在gradle中将它们注册为以下内容来提供对这两种体系结构的支持:

defaultConfig {  
   ndk.abiFilters = 'armeabi-v7a' 'arm64-v8a' 'x86' 'x86_64'
   }
Run Code Online (Sandbox Code Playgroud)

  • 我已经添加了此内容,但是当我分析时,我只看到armeabi-v7a和x86而没有看到其他内容。有什么建议么? (3认同)
  • 您好,是的,我深入研究了一下,发现第三方库之一(在我的情况下为Here Maps)没有更新。该库没有64位支持。一旦将其更新为最新版本,它就可以工作。因此,请确保所有第三方库都已更新到最新版本,然后重试。 (2认同)
  • @TusharGogna是否可以快速检查哪些不支持64位的库?我有点混淆检查.. :) (2认同)