如何构建符合 Google Play 64 位要求的应用程序?

Posted

技术标签:

【中文标题】如何构建符合 Google Play 64 位要求的应用程序?【英文标题】:How to build app compliant with Google Play 64-bit requirement? 【发布时间】:2019-09-22 18:40:11 【问题描述】:

在我将 APK 上传到 Play 商店后,我收到了以下警告。为了满足 64 位要求,我应该进行哪些更改才能使用 Flutter SDK 发布 APK 构建?

警告信息:

【问题讨论】:

flutter 团队现已提供解决方案(版本 > 1.7.12)。请看下面我的回答。 ***.com/a/56817004/3567888 【参考方案1】:

Edit/Update:Google 已经在稳定频道发布了 Flutter 1.7.8+hotfix.3,可以轻松构建发布应用。

现在您有两个构建选项:

    应用程序包(首选) APK

生成应用程序包

运行flutter build appbundle

这将创建<app dir>/build/app/outputs/bundle/release/app.aab T app bundle 包含你的 Dart 代码和为 armeabi-v7a (32-bit)arm64-v8a (64-bit) 编译的 Flutter 运行时。

现在您可以将此应用程序包上传到 Google Play。

构建一个 APK

flutter build apk --split-per-abi

此命令会生成两个 APK 文件:

<app dir>/build/app/outputs/apk/release/app-armeabi-v7a-release.apk
<app dir>/build/app/outputs/apk/release/app-arm64-v8a-release.apk

删除 --split-per-abi 标志会生成一个胖 APK,其中包含为所有目标 ABI 编译的代码。此类 APK 的大小比拆分后的版本大,导致用户下载不适用于其设备架构的原生二进制文件。

如果你还没有升级到 Flutter 1.7 下面的解决方案应该仍然 工作。

您需要构建两个 apk 并将它们一起上传。一个用于 32 位,另一个用于 64 位。

这对我有用,我在 Flutter v1.5.4-hotfix.2 上

首先,运行flutter build apk --release并上传apk文件

然后在pubspec.yml文件中增加版本号和内部版本号并运行

flutter build apk --release --target-platform=android-arm64

上传这个新的 apk 并开始部署。

祝你好运

【讨论】:

【参考方案2】:

伙计们,他们更改了 64-bit 架构的新政策。所以请把这段代码放在你的gradle中

ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'

例如

android 
    compileSdkVersion 28
    defaultConfig 
        applicationId "com.test.test"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    

【讨论】:

@Stefan 你遇到了什么问题? 我将这一行添加到配置中并运行flutter build apk 并将apk 上传到google play。谷歌播放控制台出现了同样的错误...... 只有在切换到颤振主频道后才对我有用。 有没有不使用flutter的解决方案?【参考方案3】:

对我有用的是

flutter build appbundle --release 

上传 appbundle 文件

然后在pubspec.yml文件中增加版本号和内部版本号并运行

flutter build appbundle --release --target-platform=android-arm64

同时上传这个新的 appbundle。

然后Play商店接受了我的发布

【讨论】:

【参考方案4】:

我终于能够通过将它添加到 build.gradle 来解决这个问题

 ndk 
        abiFilters  "armeabi-v7a", "arm64-v8a"
    


splits 
    abi 
        include  "armeabi-v7a", "arm64-v8a"
    
 
 applicationVariants.all  variant ->
    variant.outputs.each  output ->
        // For each separate APK per architecture, set a unique version code as described here:
        // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
        def versionCodes = ["armeabi-v7a":1, "arm64-v8a":2]
        def abi = output.getFilter(OutputFile.ABI)
        if (abi != null)   // null for the universal-debug, universal-release variants
            output.versionCodeOverride =
                    versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
        
    
 

这方面没有很多明确的文档,我在网上搜索时碰巧遇到了这个。

【讨论】:

【参考方案5】:

现在 futter 团队提供了一个新的更好的解决方案。 您需要使用新的 flutter 版本 1.7.12。 (我的设置)

Flutter 1.7.12-pre.40 • channel master • https://github.com/flutter/flutter.git
Framework • revision 3badcf51a4 (13 hours ago) • 2019-06-28 15:14:03 -0700
Engine • revision e96900df2f
Tools • Dart 2.4.0

然后您可以使用此命令为 x86 和 x64 构建您的(单个)应用程序包。flutter build appbundle

您可以添加--release --target-platform android-arm,android-arm64。但这可能会导致应用损坏...

【讨论】:

【参考方案6】:

使用最新的 Flutter 主通道。 flutter build apk 将生成一个胖 APK,同时支持 32 位和 64 位。

要分别创建 32 位和 64 位 APK,请使用 flutter build apk --split-per-abi 命令

【讨论】:

只有在切换到颤振主频道后才对我有用。【参考方案7】:

Flutter 1.5.4-hotfix.2 appbundle 当前以 android-arm 为目标,它只构建 32 位原生代码 (flutter build appbundle -h)。要更改此运行 flutter build appbundle --target-platform=android-arm64 以更改默认目标。

【讨论】:

在稳定通道上使用 Flutter 1.7.8+hotfix.3,如果我现在构建应用程序包,它将同时具有 32 位和 64 位,还是只需要使用主通道构建它?【参考方案8】:

我用这段代码构建了我的,我仍然得到错误。

flutter build appbundle --target-platform=android-arm64

【讨论】:

为什么不直接使用flutter构建appbundle? 我已经尝试了所有可能的命令,包括那个,同样的错误【参考方案9】:

如果您使用 Android Studio

上传到 google play 时,只需转到 Build -> Flutter -> Build App Bundle 将其替换为 apk

【讨论】:

【参考方案10】:

将此行添加到您的 android/app/build.gradle 文件中

ndk abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86','x86_64'

【讨论】:

【参考方案11】:

我尝试了所有答案,但它的停留显示相同的问题。

我尝试将此行添加为最多的答案:

ndk 
        abiFilters 'x86', 'x86_64',  'armeabi-v7a', 'arm64-v8a'
    

但没有解决。

什么 解决了 我的 问题?

只需在最后一个代码中添加“armeabi”即可:

ndk 
        abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
    

这个解决方案节省了我的时间,我成功上传了我的 app bundle!

【讨论】:

以上是关于如何构建符合 Google Play 64 位要求的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

此版本符合 Google Play 64 位要求本机应用程序

错误记录Google Play 上架报错 ( 此版本不符合 Google Play 关于提供 64 位版本应用的要求 )

Delphi 10.1 - Google Play Console - 查看和发布错误“此版本不符合 Google Play 64 位要求。”

Xamarin - 此版本不符合 Google Play 64 位要求

错误记录Google Play 上架报错 ( 此版本不符合 Google Play 关于提供 64 位版本应用的要求。| 如果提供 x86 架构动态库则必须提供 x86_64 架构的动态库 )

此版本不符合 Google Play 64 位要求。本机 Java 应用程序的所有 .so 都已存在