Flutter: 支持包含 32 位和 64 位二进制文​​件的 APK

创建于 2018-06-15  ·  286评论  ·  资料来源: flutter/flutter

使用flutter build apk --release --flavor pro制作 apk 文件,但 arm64-v8a 不包含 libflutter.so 文件。所以应用程序启动失败。
当我添加--target-platform=android-arm64 : flutter build apk --release --flavor pro --target-platform=android-arm64 ,apk 文件包含如此苍蝇。 但是应用程序在 32 位 CPU 上启动失败。
我能做什么,apk 文件可以在 64 和 32 cpu @mravn-google 上运行

/System.err(15263): java.lang.UnsatisfiedLinkError: Couldn't load flutter from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.jianzhibao.ka.enterprise-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.jianzhibao.ka.enterprise-1, /vendor/lib, /system/lib]]]: findLibrary returned null

我创建新项目,调试或发布,运行良好。 与我的项目的新项目的不同之处在于我添加了第三方so文件

image

哪里有问题 ?

crowd platform-android new feature gradle tool waiting for PR to land (fixed)

最有用的评论

我有同样的问题,为 32 位构建将排除 64 位设备,但它可以在它们上运行。 通过指定--target-platform android-arm64为 64 构建适用于 64 位设备,但在 32 位设备上崩溃。 此外,谷歌将在 2019 年将 apk 的上传限制为 64 位。

Flutter 团队,请解决这个基本问题!

所有286条评论

AFAIK,目前,Flutter 只会将 libflutter.so 添加到发布 APK 中的一个选定平台文件夹中。 对我有用的解决方法是强制 build.gradle 只做 32 位(不包括所有 64 位库 + 英特尔)

release {

    ...
            ndk{
                abiFilters "armeabi-v7a"
            }
}

抄送@Hixie

@swavkulinski您将如何将

有同样的问题 - 但 flutter.so 未包含在“armeabi-v7a 文件夹中。
只有 x86 和 armeabi-v7a 的第三方库 - 但没有 arm64。
只想为“armeabi-v7a with
ndk{
abiFilters "armeabi-v7a" // 也不起作用 "armeabi", "x86",
}
并按照@mravn-google 向android-arm 的建议设置为目标平台。

没有指定 arch 且不包含库的 APK
screen shot 2018-07-26 at 21 06 53

带有库但没有 arm 规范的 APK
screen shot 2018-07-26 at 21 10 30

具有指定 arch 和包含库的 APK
screen shot 2018-07-26 at 21 12 58

任何建议如何调试进一步的步骤?

@xxseabxx我有同样的问题

我有同样的问题,为 32 位构建将排除 64 位设备,但它可以在它们上运行。 通过指定--target-platform android-arm64为 64 构建适用于 64 位设备,但在 32 位设备上崩溃。 此外,谷歌将在 2019 年将 apk 的上传限制为 64 位。

Flutter 团队,请解决这个基本问题!

Flutter 团队,请解决这个基本问题!

那么我说 flutter 只能支持 32 位或 64 位的发布 apk,而不是两者都支持,我错了吗?

这里有什么运气吗?

我认为 xxseabxx 的评论可能有用,但我还没有尝试过......

我也有同样的问题。

在我的所有依赖项中,我隔离了至少一个导致问题的包,我相应地填写了一个错误报告: https :

为了隔离问题,对于我的每个依赖项/插件:

1)创建一个空的flutter项目

2) 将 main.dart 替换为

包示例代码(例如:https://pub.dartlang.org/packages/flutter_html_view#-example-tab-)

3) 相应地更新 pubspec.yaml

4)运行

$ flutter build apk

结果发现创建的是flutter_mlkit。

我希望能够同时针对 32 位和 64 位架构。

有同样的问题。 --target-platform=android-arm64 对我有用,但我想支持 32 位,直到谷歌拔掉 32 位的插头

Flutter 团队,请解决这个基本问题!

很多第三个 SDK 无法正常工作,我认为这很紧急

将 Mapbox 添加到 android 应用程序时,我可以重现这一点。

我也有同样的问题。我在我的项目中使用baiduMap,bebug模型没问题,发布崩溃。
user flutter build apk --release --target-platform=android-arm64 in my phone 没问题,但32位手机会崩溃。Flutter团队,请尽快解决这个问题。

类似于https://github.com/azihsoyn/flutter_mlkit/issues/36 ,它对我有用,apk 可以在 32 位和 64 位手机上运行。 @peace2knowledge

这应该是发布 apk 的非常重要的问题

这个问题有解决方法吗?

  1. $<FLUTTER>/bin/cache/artifacts/engine/android-arm-release/flutter.jar提取lib/armeabi-v7a/libflutter.so $<FLUTTER>/bin/cache/artifacts/engine/android-arm-release/flutter.jar
  2. 将文件armeabi-v7a/libflutter.so复制到$<project>/android/jniLibs/armeabi-v7a/
  3. 修改$<project>/android/app/build.gradle如下:
android {
...
    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
            ndk {
                abiFilters "arm"
            }
        }
        debug {
            ndk {
                abiFilters "arm"
            }
        }
}
    }

对于 NDK,64 位工具链需要 minSdkVersion >= 21。

这使我畅通无阻(设置了适当的 minSdkVersion):

minSdkVersion=16

flutter build apk --release --target-platform=android-arm
flutter run --release --target-platform=android-arm

minSdkVersion=21

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

删除所有 abiFilters,它对我有用。

@zoechi @Hixie温柔的撞击。 在尝试与现有应用程序集成时,我也遇到了这个问题,这是我们目前最重要的用例。

mindsdk=21,但还没有更新目标平台

@neiljaywarner对最初的评论竖起大拇指会更有效地提高优先级

  1. $<FLUTTER>/bin/cache/artifacts/engine/android-arm-release/flutter.jar提取lib/armeabi-v7a/libflutter.so $<FLUTTER>/bin/cache/artifacts/engine/android-arm-release/flutter.jar
  2. 将文件armeabi-v7a/libflutter.so复制到$<project>/android/jniLibs/armeabi-v7a/
  3. 修改$<project>/android/app/build.gradle如下:
android {
...
    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
            ndk {
                abiFilters "arm"
            }
        }
        debug {
            ndk {
                abiFilters "arm"
            }
        }
}
    }

这对我不起作用——它生成了一个缺少 lib 文件夹的 APK(因此是我以前的 apk 大小的一半)。

我们还发现,如果我们实施某些人发布的仅 32 位解决方案(例如 https://medium.com/flutterpub/flutter-app-couldnt-find-libflutter-so-c95ad81cbccd),它会导致非- 高性能的应用程序。 特别是在对三星 S6 和 S9 的一项测试中,我们发现在大列表上滚动非常缓慢。

我不认为问题只是缺少 arm64 libflutter.so

我尝试通过构建 arm64 将缺少的库添加到 APK,复制libflutter.so然后重新构建并手动将 arm64 库添加到 APK,重新对齐和重新签名:

flutter build apk --target-platform=android-arm64
mkdir -p tmp/lib/arm64-v8a
cp build/app/intermediates/transforms/mergeJniLibs/release/0/lib/arm64-v8a/libflutter.so tmp/lib/arm64-v8a/
flutter build apk
cp build/app/outputs/apk/release/app-release.apk tmp/
cd tmp
aapt add app-release.apk lib/arm64-v8a/libflutter.so
zipalign 4 app-release.apk app-release-aligned.apk
apksigner sign --ks keystore.jks app-release-aligned.apk

生成的 APK 具有 armeabi-v7a 和 arm64-v8a 的 libflutter.so,但在启动时崩溃并出现以下错误:

12-22 09:53:29.274 7457 7457 F flutter : [FATAL:flutter/runtime/dart_vm.cc(403)] Error while initializing the Dart VM: Snapshot not compatible with the current VM configuration: the snapshot requires 'product no-type_checks no-asserts no-error_on_bad_type sync_async reify_generic_functions arm-eabi softfp' but the VM has 'product no-type_checks no-asserts no-error_on_bad_type sync_async reify_generic_functions arm64-sysv'

我想也需要为每个拱门运送单独的快照资产。 目前,构建两个独立的 APK 是唯一适合我的解决方案。

这是一个非常糟糕的问题,在花时间实际编写 flutter 的前端后,却发现该版本没有正确构建 apk。

一旦我开始使用 iOS,我会遇到同样的问题吗?

什么时候能解决这个问题?

这只是我们的 gradle 文件不知道如何为两者捆绑所有正确的位吗? @jason-simmons @cbracken可能知道?

或者@FaisalAbid可能吗?

这只是我们的 gradle 文件不知道如何为两者捆绑所有正确的位吗? @jason-simmons @cbracken可能知道?

或者@FaisalAbid可能吗?

通过正确的位,我假设你的意思不仅仅是 libflutter.so,根据这个评论: https :

现在我认为唯一的解决方案是构建 32 位 APK,直到有一个修复。 但是请注意,我们已经看到了 32 位的性能问题(尽管具有大列表的非最佳代码)。

构建单独的 64 位和 32 位 APK 并将两者上传到 Google(他们会自动向正确的设备提供正确的 APK)对我来说很好用。

您将abiFilters设置为armeabi-v7a--target-platform=android-arm进行一次构建,上传该 APK,然后将abiFilters设置为arm64-v8a进行另一次构建和--target-platform=android-arm64并上传那个。

请注意,您还需要为每个 APK 使用不同的版本代码,因此在版本代码中包含一些内容以表明它是 64 位或 32 位,与 DPI 或 API 级别相同。

目前最好的选择是从目标平台有条件地设置 abiFilters

        ndk {
            if (project.hasProperty('target-platform') &&
               project.property('target-platform') == 'android-arm64') {
                abiFilters 'arm64-v8a'
            } else {
                abiFilters 'armeabi-v7a'
            }
        }

我的问题是现在我需要上传两个不同版本代码的apk
真正解决这个问题的是能够构建具有多个目标平台的 android 包。 App bundles 目前在 flutter master 中,但我无法让它为此工作

从 8 月 1 日起,Play 商店将需要 64 位。

假设在 8 月 1 日之后仍有 32 位设备想要运行我们的应用程序,如何确保 32 位和 64 位包含在发布版本中?

https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html

_所有包含本机代码的新应用和应用更新在发布到 Google Play 时都需要提供 64 位版本和 32 位版本。_

现在使用 Flutter 应用程序可以轻松满足这一要求,只需构建两个 APK——一个用于 32 位设备,一个用于 64 位设备——并将两者作为同一版本的一部分上传。 Google Play 会自动向适当的设备提供适当的 APK。 我正在这样做,而且效果很好。 我同意其他评论者的看法,这不是 _ideal_,但 IMO 将这部分纳入您的工作流程确实不是什么大问题。

如果能在不久的将来解决这个问题,那就太好了。 多 APK 方法只是一个临时解决方案,直到 Flutter 构建具有多个 .so 架构版本的 APK,就像其他 Android 项目所做的那样。

它需要大量的手动处理(版本代码、构建系统、自动化),加上 Android App Bundle 应该可以减轻开发人员的手动构建步骤。

目前这个问题只提到了32位和64位版本,但也有x86、x64加上国内的一些开发者还在说支持mips。

不应该以最小的 apk 大小来支持 7 种安卓架构中的尽可能多的开箱即用吗?

https://proandroiddev.com/reducing-apk-size-by-using-abi-filters-and-apk-split-74a68a885f4e

@MarcelEdward它应该 - 但是恕我直言,APK 大小并不是最重要的方面,因为 Android 现在完全支持 App Bundles (aab) 并且最终用户无论如何都会为他们的手机下载优化的版本。

对于特定于平台的 APK 的大小,应尽可能优化/小。

在开发过程中,每次更改本机代码时重新安装全尺寸 APK 可能会很痛苦。 一个技巧是使用 abifilters 将调试构建限制为测试手机的架构。 考虑到 Flutter 支持热重载,我不确定这是否与现在相关。

https://github.com/flutter/flutter/issues/17829是关于 aap 应用程序包,但我在编译时只能找到 32 位使用 flutter build apk

因此,当我理解 Richt 时,我们必须构建两个至少 32 和 64 的 serperate 版本,同时上传它们,然后应用程序会奇迹般地构建一个 aap,以便消费者获得针对其特定架构的优化版本

@MarcelEdward Play 商店不构建应用程序包。 它只是根据设备架构为设备提供适当的 APK。 早在 app bundle 出现之前,这已经得到支持,不仅适用于架构,还适用于屏幕尺寸/分辨率、API 级别和其他差异化因素。 您可以在此处阅读更多相关信息。

您可以通过在此处查看Google Maps 的 13 个变体来看到一个很好的示例(请注意,APKMirror 与此功能无关,只是提供了一种获取给定应用的变体列表的简单方法)。 Play 商店会根据您的设备的特征从这些变体中为您的设备提供适当的 APK。

如果您使用了 app bundle,那么您只需上传一次 bundle,而不是上传多个 APK,但我的理解是 Play 商店会为您生成各种 APK 变体,因此最终结果是相似的,但工作量较少让你自己自动化。 (应用程序包也支持新的动态加载模块,但那是另一回事了。)

因此,这里所需的功能似乎是能够使用两个--target-platform参数运行flutter build并让flutter自动将两种架构都放入 APK 中,对吗?

@Hixie不是 libflutter.so 每个颤振版本和发布类型只生成一次? 在这种情况下,您将有 8 个变体(32,64,x86,x86_64)。 我认为应该在构建 flutter 应用程序时简单地选择这些,并根据目标手机或用例进行过滤。 Gradle 可以很好地进行过滤。

手机的架构是相当低级的,我不知道使用我们的应用程序的人的架构是什么。当没有指定架构时,Flutter 编译 32 位,所以我认为 32 位适合所有人。但现在玩商店将在八月需要 64 位,所以当 32 位适合所有并且需要 64 位时,那么这两个应该进入发布版本吗?

我自己还没有 android 手机,所以我假设它在模拟器上运行时会起作用。直到我们的应用程序用户另有说明。

@MarcelEdward2这不仅仅是 32 位与 64 位。 现代 Android NDK 支持四种架构:

  • armeabi-v7a
  • arm64-v8a
  • x86
  • x86_64

目前,Flutter 默认构建一个包含仅为 armeabi-v7a 编译的本机代码的 APK。 这将在 arm64-v8a 上运行良好,尽管与本机为 arm64-v8a 编译的某些内容相比性能有所下降。 但是,假设设备捆绑了一个,它将在 x86 或 x86_64 上的 ARM 模拟器下运行。 如果 x86/x86_64 设备没有 ARM 仿真器,它根本不会运行。

再次重申,August 要求不要求您生成一个包含两种架构的通用 APK 或 AAB。 它只要求您发布的每个版本都包含(至少)一个适用于 64 位设备的 APK。 Flutter 中的修改使构建一个支持多种架构的通用 APK/AAB 成为可能,这在开发人员工作流程方面会很好,但是无论是否进行此类改进,您都可以满足这一要求。

编辑补充:我个人认为一流的 app bundles 支持是改善多架构情况的最佳方式。

appbundle 看起来是未来的解决方案......我想下一步是这样的: #29303

据我了解这个错误,它与将 .aab 作为flutter build的默认输出格式并使该 .aab 包含 32 位和 64 位版本密切相关:
https://developer.android.com/studio/projects/dynamic-delivery

我的理解是其中一些工作可能已经在进行中。 @dnfield可能知道。

/cc @mklim

似乎 .aab 会有所帮助,但可能并不是真正必要的。 问题是否像将 32 位和 64 位 arm 二进制文件添加到 APK 一样简单?

啊我明白了。 这是因为我们可能还需要包括目标拱门的 AOT 快照。 现在我们只是把它放在 assets 下,我们没有把 per-architecture 版本放在libs 。 如果我们可以将 AOT 快照放入可能有效的体系结构特定的 libs 文件夹中,否则我们会出于这个原因想要使用 .aab 格式。

无论如何,我们都希望这样做以支持为 add2app 用例构建 .AAR。 我会戳它。

ndk {
            if (project.hasProperty('target-platform') &&
               project.property('target-platform') == 'android-arm64') {
                abiFilters 'arm64-v8a'
            } else {
                abiFilters 'armeabi-v7a'
            }
        }

经过几天的故障排除后,这对我有用

当我尝试在模拟器上运行应用程序时, @AppleEducate发布的解决方案不起作用。

把它放在发布部分

这是我的解决方案:

  1. app gradle
splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }
  1. 运行flutter build apk --release --target-platform=android-arm

  2. app-armeabi-v7a-release.apk上传到 Play 商店

  3. 增加versionCode

  4. 运行flutter build apk --release --target-platform=android-arm64

  5. app-arm64-v8a-release.apk上传到 Play 商店

Google Play 商店将根据设备架构为 App 提供服务。 32 位设备很高兴,64 位设备很高兴,我很高兴知道我的 APK 大小仍然相对较小,同时仍然可以为两种架构提供服务。

如果我们在同一个 APK 中包含对这两种架构的支持,则您的应用程序的大小预计为 10MB 以上

@edTheGuy00我怀疑上传到 Play 商店的内容有多大是否有趣。 无论如何,Android 手机将要求 125+ 临时可用空间,并且将拒绝使用外部存储进行解包。 这是所有用户都知道的应用程序大小,安装后应用程序使用多少并不重要。 它将要求 125mb+ 的可用空间用于安装。

请尽可能包括所有可能的架构。 我不在乎上传到 Play 商店的大小是否为 250mb。

如果 Flutter 能够使用外部存储上的千兆空间来安装在 Android 手机上,那就太好了。 那就是如果 flutter 会影响在 android 手机上的安装

我认为flutter.gradle脚本应该将所有 ABI 包含到最终 APK(通用 APK)中,然后默认打开拆分 APK。 android 工具将选择正确的 APK 上传到连接的设备,一切正常。 然后可以将最终的通用 APK 上传到 Play-store,或者每个 ABI 的拆分 APK。

同时,作为解决方案,您可以将其添加到android\app目录中build.gradle的底部。

// Include both 32bit and 64bit arm libflutter.so files into your APK
project.afterEvaluate {
    assembleRelease.doLast {
        String src
        if(project.hasProperty('target-platform') &&
            project.property('target-platform') == 'android-arm64') {
            // If we are building the 64bit then we also want to add the 32bit libflutter.so
            src = "$flutterRoot/bin/cache/artifacts/engine/android-arm-release/flutter.jar"
        }else{
            // If we are building the opposite (32bit), we include the 64bit libflutter.so
            src = "$flutterRoot/bin/cache/artifacts/engine/android-arm64-release/flutter.jar"
        }
        copy {
            from zipTree(src)
            include 'lib/*/libflutter.so'
            into "$buildDir/intermediates/jniLibs/release/0/"
        }
    }
}

我还建议将此添加到您的buildTypes > release部分。 这将确保您的发布 APK 包含两个 ABI。

ndk {
    abiFilters 'armeabi-v7a', 'arm64-v8a'
}

在与@slightfoot 合作后,我们想出了这个,但它仍然不太正确,因为您最初必须构建两次以获取插入到您的 src 目录中的库。

project.afterEvaluate {
    assembleRelease.doFirst {

        String src
        if(project.hasProperty('target-platform') &&
                project.property('target-platform') == 'android-arm64') {
            // If we are building the 64bit then we also want to add the 32bit libflutter.so
            src = "$flutterRoot/bin/cache/artifacts/engine/android-arm-release/flutter.jar"
        }else{
            // If we are building the opposite (32bit), we include the 64bit libflutter.so
            src = "$flutterRoot/bin/cache/artifacts/engine/android-arm64-release/flutter.jar"
        }
        copy {
            from zipTree(src)
            include 'lib/*/libflutter.so'
            into "src/main/jniLibs/"
            eachFile {
                it.path = it.path.replaceFirst("lib/", "")
            }
        }
    }
}

更新:尝试在设备上运行此 APK 后失败,因此不是可行的解决方案。 错误是“初始化 Dart VM 时出错:快照与当前的 VM 配置不兼容:
快照需要“产品使用_bare_instructions no-"asserts" causal_async_stacks arm-eabi softfp”
但 VM 有“产品使用_裸机指令没有-“断言”causal_async_stacks arm64-sysv”

啊我明白了。 这是因为我们可能还需要包括目标拱门的 AOT 快照。 现在我们只是把它放在 assets 下,我们没有把 per-architecture 版本放在libs 。 如果我们可以将 AOT 快照放入可能有效的体系结构特定的 libs 文件夹中,否则我们会出于这个原因想要使用 .aab 格式。

无论如何,我们都希望这样做以支持为 add2app 用例构建 .AAR。 我会戳它。

@dnfield你在这方面取得了一些成功吗?

目前正在处理插件。 我们一直在尝试优先解决 Android X 问题的部分内容,但应该会看到更多内容。

@gerryhigh和我自己正在研究这个。 请忽略我上次的回复。 问题只是 libflutter.so 不包含在 64 位中,但对于 AOT,您必须运行构建过程两次,一次用于 32 位,一次用于 64 位。 然后,您将在应用程序资产中获得两组已编译的 Dart 代码以及两个版本的 libflutter.so。 我认为最终的目标是为 Flutter 设置编译任务,以便它运行两个单独的构建步骤并自动设置拆分 APK。

但目前,唯一的解决方案是运行构建两次并将多个 APK 上传到 Play 商店。

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

这可以通过启用拆分 APK 更好地实现。 更多细节可以在这里找到: https :

@slightfoot是的,这是我在上面的评论中提到的最好的解决方案https://github.com/flutter/flutter/issues/18494#issuecomment -477502287

@slightfoot如果我理解正确,将无法构建通用 APK,因为某些代码位于资产文件夹中,该文件夹不允许根据目标架构将文件拆分为 lib 文件夹?

为每个架构构建的快照是不同的。 如果snapshot的架构和flutter引擎的架构不匹配,直接复制引擎libflutter.so会导致snapshot无法加载。
所以目前我们没有办法构建一个包含所有架构的通用apk,除非将快照文件分开并包含每个架构的快照文件。

我有点困惑为什么这甚至是一个问题。

调试版本在 x86_64、x86、armeabi-v7a 和 arm64-v8a 中创建 libflutter.so。

发布版本应该完全相同。

AGP(Android Gradle 插件)已经包含过滤架构的功能,因此如果用户希望为发布版本执行此操作,他们可以修改他们的 build.gradle。

@eseidel @dnfield我真的不认为这是由 Android App Bundles 解决的——它们还不是默认的 Android 输出,当从 IDE 运行时,apks 将使用很长一段时间,但我敢肯定。

AAB 是 Fl​​utter 应该包含 libflutter.so 的所有架构的另一个原因,因为 Play 商店可以过滤出它提供给设备的架构。

@athornz问题不在于libflutter.so而是您的 dart 代码编译成AOT snapshot调试版本包括 Dart VM,因此您所有的 dart 代码都在 VM 上运行JIT ,但发布版本会将您的 dart 代码编译为快照并将该快照放入资产文件夹中。 理想情况下,应该为每个架构编译快照并将其放置在libflutter.so旁边,但目前情况并非如此。 因此,虽然您可以为所有架构包含libflutter.so ,但快照仅适用于为其编译的任何架构。

有计划解决这个问题吗?

Google Play 商店要求开发者在 2019 年 8 月 1 日之后提供 64 位支持。

https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html

64 位要求:对开发人员意味着什么
从 2019 年 8 月 1 日开始:
_所有包含本机代码的新应用和应用更新在发布到 Google Play 时都需要提供 64 位版本和 32 位版本。_
扩展:在 2021 年 8 月之前,Google Play 将继续接受对使用 Unity 5.6.6 或更早版本的现有游戏的仅 32 位更新。
从 2021 年 8 月 1 日开始:
Google Play 将停止在支持 64 位的设备上提供没有 64 位版本的应用,这意味着这些设备上的 Play 商店将不再提供这些应用。
这将包括使用 Unity 5.6.6 或更早版本构建的游戏。

@trevorwang我们已经可以构建 64 位并将它们与 32 位一起上传到 Play 商店。 所以这不是问题。

@slightfoot您的意思是我必须构建另一个 64 位 APK 并将其上传到 Google Play?

如您所知,Google Play 在中国大陆不可用。 我们更喜欢通用 APK 来支持所有平台。

@trevorwang 差不多。 这就是我的做法https://github.com/flutter/flutter/issues/18494#issuecomment -477502287

拆分的东西在 gradfle 文件中不起作用。 您必须对 build.gradle 文件之一执行某些操作,以便 flutter 知道如何编译不同的架构。 否则 google play 会拒绝第二次编译。

谢谢@edTheGuy00

但我们真的需要一个通用的 APK,包括中国市场的所有 abis。

@trevorwang您可以为每个目标构建并明确说明每个 APK 适用于哪种架构。 大多数 APK 镜像站点都是这样做的。

64 位限制只是 Google Play 商店的限制。 您仍然可以仅部署 armeabi-v7a APK,每个人都可以运行您的应用程序。

为每个架构构建单独的 APK 是一种解决方法,绝对不是适合所有人的解决方案。

一旦 Google Play 64 位限制生效,这个问题将影响大多数 Flutter 开发人员,因此我们确实需要一个解决方案,允许在一个 apk/bundle 中支持多个架构。

只是一个快速提醒

Flutter 团队使用 GitHub 问题上的“竖起大拇指”数量作为其优先级的指南。

我认为这个问题应该放在首位。

感谢@gerryhigh@slightfoot的工作

我已将 flutter 添加到现有应用程序中,并通过以下解决方法解决了此问题。
_请将其添加到宿主项目的应用模块中。_

这是Debug模式的脚本,发布时请相应修改。

project.afterEvaluate {
    assembleDebug.doLast {
        def flutterRoot = System.getenv("FLUTTER_HOME")
        def archTypes = ["arm", "arm64"]
        archTypes.forEach { item ->
            copy {
                from zipTree("$flutterRoot/bin/cache/artifacts/engine/android-$item/flutter.jar")
                include 'lib/*/libflutter.so'
                into "$buildDir/intermediates/jniLibs/debug/"
                eachFile {
                    it.path = it.path.replaceFirst("lib/", "")
                }
            }
        }
    }
}

最近有什么进展吗?

我最终做了什么,因为我想要

  • 每个架构都有单独的 apk
  • 不必手动修改 versionCode
  • 运行单个命令来生成 apk
  1. 将此添加到gradle。 它增加了12在的versionCode的端部,所以版本1004变为10041为臂和10042为arm64。
ext.platformCodes = ['android-arm': 1, 'android-arm64' : 2]
android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        int code = 0
        if (project.hasProperty('target-platform')) {
            code = project.ext.platformCodes.get(project.property('target-platform'))
        }
        output.versionCodeOverride = variant.versionCode * 10 + code
    }
}
  1. 为了生成 apk,我使用了更长的终端命令(您可以将其放入脚本中)。 它运行两次构建并在最后创建 apk 的副本:
flutter clean; flutter build apk --release --target-platform=android-arm; mv build/app/outputs/apk/release/app-release.apk build/app/outputs/apk/release/app-release-arm32.apk; flutter build apk --release --target-platform=android-arm64; mv build/app/outputs/apk/release/app-release.apk build/app/outputs/apk/release/app-release-arm64.apk;

希望这可以帮助。

所以这也是我遇到的一个问题。我构建了一个应用程序包而不是一个 apk,当我将它上传到谷歌时,它给了我警告并且不会让我对其进行 alpha 测试。

我一直在使用 codemagic 来做这件事,有没有办法对其进行签名并将其放入一个包中? 或使用 codemagic 来点缀它?

我面临着我认为根本不应该存在的同样问题。

为什么这是里程碑“目标”。

P2:这些是我们认为值得在未来几年解决的任务。 它包括我们发现的可能会阻止完全交付面向消费者的广泛应用程序的问题、正确性问题以及与润色和质量相关的错误。 这个里程碑的日期完全是随意的,只是为了对里程碑进行适当的排序。

这已经是一个关键问题,一旦谷歌强制执行 64 位限制,它将在今年晚些时候成为一个全面的障碍。

我已经在这方面达到了里程碑。 还没有确定的日期。

需要明确的是:今天遵守新准则是可能的,但很困难。 我们想让这更容易。

所以只要我手动构建应用程序, @andreidiaconu方法就对我

但我一直在使用 codemagic 来构建和部署。

所以这是一种浪费,Flutter 需要构建它。

目前我个人并不关心它是否复杂。 如果它很复杂,它将通过脚本自动完成。 问题是是否有可能以及如何因为 Google Play Console 警告我:

此版本不符合 Google Play 64 位要求
以下 APK 或 App Bundle 可用于 64 位设备,但它们只有 32 位本机代码:6.
自 2019 年 8 月 1 日起,所有版本都必须符合 Google Play 64 位要求。
在您的应用中包含 64 位和 32 位本机代码。 使用 Android App Bundle 发布格式自动确保每个设备架构只接收它需要的原生代码。 这可以避免增加应用程序的整体大小。

我不想要一个需要不同版本代码的解决方案,我想要一个适用于 Android App Bundles (AAB) 的解决方案。

警告
此版本不符合 Google Play 64 位要求

以下 APK 或 App Bundle 可用于 64 位设备,但它们只有 32 位本机代码: 3.

有什么解决办法吗?

我已经在这方面达到了里程碑。 还没有确定的日期。

需要明确的是:今天遵守新准则是可能的,但很困难。 我们想让这更容易。

是否应该使用有关如何为 apk 和应用程序包执行此操作的说明更新文档? 到目前为止,我所看到的只是一堆代码和配置,我不确定应该放在哪里。 我可能会通过一些试验和错误来解决这个问题,但它不太理想。

同样的问题

感谢@gerryhigh和@slightfoot 的工作

我已将 flutter 添加到现有应用程序中,并通过以下解决方法解决了此问题。
_请将其添加到宿主项目的应用模块中。_

这是Debug模式的脚本,发布时请相应修改。

project.afterEvaluate {
    assembleDebug.doLast {
        def flutterRoot = System.getenv("FLUTTER_HOME")
        def archTypes = ["arm", "arm64"]
        archTypes.forEach { item ->
            copy {
                from zipTree("$flutterRoot/bin/cache/artifacts/engine/android-$item/flutter.jar")
                include 'lib/*/libflutter.so'
                into "$buildDir/intermediates/jniLibs/debug/"
                eachFile {
                    it.path = it.path.replaceFirst("lib/", "")
                }
            }
        }
    }
}

这个解决方案/解决方法看起来最有希望,谢谢@trevorwang ! 不过,我在现有的颤振项目中确实遇到了这个问题。 你有一个示例 build.gradle 文件或等效的东西来演示这个吗?

请注意,这可能无法解决您的问题 - 见下文

感谢@trevorwang 的回答和@noinskit 的建议,我设法在发布版本中包含了 64 位本机库,并在下面显示的./android/app/build.gradle中添加了一小部分。
您还可以在此处查看整个文件。

afterEvaluate {
    mergeReleaseJniLibFolders.doLast {
        def archTypes = ["arm-release", "arm64-release"]
        archTypes.forEach { item ->
            copy {
                from zipTree("$flutterRoot/bin/cache/artifacts/engine/android-$item/flutter.jar")
                include 'lib/*/libflutter.so'
                into "$buildDir/intermediates/jniLibs/release/"
                eachFile {
                    it.path = it.path.replaceFirst("lib/", "")
                }
            }
        }
    }
}

@SPodjasek谢谢! 我得到了类似的东西。 就我而言,我需要将代码片段中的assembleRelease更改mergeReleaseJniLibFolders ,否则额外的 *.so 文件最终会出现在“中间件/...”下,但不会出现在最终的 apk 中。

@noinskit看来我之前的解决方案容易出错。 运行flutter clean它只生成了 32 位库的 aab。 更换assembleReleasemergeReleaseJniLibFolders似乎清洁构建真正的后还要工作。

@SPodjasek您是否需要调整任何其他选项?

这是我的app.gradle

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

afterEvaluate {
    mergeReleaseJniLibFolders.doLast {
        def archTypes = ["arm-release", "arm64-release"]
        archTypes.forEach { item ->
            copy {
                from zipTree("$flutterRoot/bin/cache/artifacts/engine/android-$item/flutter.jar")
                include 'lib/*/libflutter.so'
                into "$buildDir/intermediates/jniLibs/release/"
                eachFile {
                    it.path = it.path.replaceFirst("lib/", "")
                }
            }
        }
    }
}

我的中间件/jniLibs/release/ arm64-v8aarmeabi-v7a目录都按预期具有libflutter.so ,但最终版本的 APK 在 arm64-v8a 中仍然缺少 libflutter.so。

这是屏幕截图

flutter

@function1983你可以在这里看到我完整的build.gradle
截至我的颤振版本:

[✓] Flutter (Channel beta, v1.5.4, on Linux, locale pl_PL.UTF-8)
    • Flutter version 1.5.4 at .../development/flutter
    • Framework revision b593f5167b (2 weeks ago), 2019-04-22 07:51:33 -0700
    • Engine revision ca31a7c57b
    • Dart version 2.3.0 (build 2.3.0-dev.0.1 cf4444b803)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at .../Android/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: .../development/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b16-5323222)
    • All Android licenses accepted.

[✓] Android Studio (version 3.4)
    • Android Studio at .../development/android-studio
    • Flutter plugin version 35.2.1
    • Dart plugin version 183.6270
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b16-5323222)

我一直在尝试使用@SPodjasek的解决方案来构建一个包含 64 位和 32 位版本的 appbundle。 它成功构建,我可以将其上传到 Google Play Console,并且可以在 32 位和 64 位手机上安装它。 但是由于某种原因,该应用程序在 android-arm64 设备上启动时崩溃了(不过似乎可以在我正在测试的旧 32 位 android 手机上运行)。

这是我在 64 位设备上遇到的错误:

中止消息:'[ FATAL:flutter/runtime/dart_vm.cc (416)] 初始化 Dart VM 时出错:快照与当前 VM 配置不兼容:快照需要 'product use_bare_instructions no-"asserts" causal_async_stacks arm-eabi softfp ' 但 VM 有 'product use_bare_instructions no-"asserts" causal_async_stacks arm64-sysv'

不知道我能做什么......现在可能不得不坚持只支持 64 位设备。

@Torrunt该错误是因为引擎正在尝试为 32 位

我们正在努力制作一个兼具两者的 AAB,以便商店可以正确地将它们分开。

@SPodjasek使用这个将我的 app-release.apk 文件大小从 11.1 MB 增加到 15.7 MB

@SPodjasek使用这个将我的 app-release.apk 文件大小从 11.1 MB 增加到 15.7 MB

是的,因为它强制包含 32 位和 64 位的libflutter.so 。 如果您不需要它,请坚持使用当前的默认设置,只包含 32 位,然后等待 Flutter 团队正确处理这个问题。

看起来有几种可能性:

  • 等到 Flutter 团队解决了 32 vs 64 架构问题,让 Google Play 商店再次接受 Flutter 构建
  • 我们必须将使用的 android 设备限制为仅 32 位,因此 Flutter 应用程序只能在 32 位设备上运行
  • 我们必须以某种方式说服谷歌不要在 Play 商店中强制使用 64 位。 (我想知道 32 位和 64 位之间有什么区别,比如更大的数字?)
  • 以某种方式在 64 位设备上安装 32 个应用程序,但不在 Play 商店中...

请注意使用--target-platform分别为android-armandroid-arm64构建并上传两个 APK 的人。
请注意,某些插件使用的本机库可能同时针对这两个库,并且 flutter 不会过滤库文件夹,因此您的“32 位”APK 实际上仍将针对 arm64,并且会因 libflutter.so 不存在而崩溃,并且 AOT 快照是专为 armv7 构建。

因此,您需要在 build.gradle 文件中实际明确过滤目标 abi。

我认为flutter build apk --target-platform ...应该在逻辑上进行这种过滤。

使用@SPodjasek的解决方案,我遇到了关于匹配arm-eabiarm64-sysv 。 我认为对我有用的最好的解决方案是暂时为 32 位构建,直到这一切都解决了( 在这里):

在您的app级别build.gradle

android {
    // ...
    buildTypes {
        release {
            // ...
            ndk {
                abiFilters "armeabi-v7a"
            }
        }
    }
}

总结主题的问题 - 不可能为 armeabi-v7a 和 arm64-v8a 构建这样的 APK。 Flutter 使用依赖于 ABI 的 AOT 快照,因此对于 APK,唯一可能的解决方案是使用多个 APK 构建。
解决方案是使用 App Bundles,它现在也有一些问题 (#31922)。
#32787 合并后,现在可以使用 App Bundles。

通过 Android Studio 生成 Android 应用程序包时,如何设置风格和目标文件(例如 -t lib/another_main.dart)? 哦

这将在https://github.com/flutter/flutter/pull/32787合并后通过flutter build appbundle支持!

@swavkulinski您将如何将

那个时候还是可以的。 现在您必须限制为 64 位。 我们被仅 32 位的第三方 NDK 库锁定。

@blasten
这也会增加对flutter build apk --release吗? 还是计划在长期内逐步停止对 APK 的支持以支持应用程序包? 我非常喜欢胖 APK 的相对简单性。

@zimmi正确。 应用程序包应该是前进的方向。 必要时您仍然可以使用flutter build apk --release 。 与 AAB 相比,胖 APK 中什么更简单?

与 AAB 相比,胖 APK 中什么更简单?

AAB 不是安装文件。 Android 本身无法使用它。 它是仅适用于 Google Play 商店的文件格式。 所以在以下情况下需要 apk:

  • 直接安装到设备。
  • 直接分发应用程序。
  • 通过 Google Play 商店以外的任何其他应用市场分发。 (亚马逊和全中国)。

我知道了。 谢谢你的背景。

此外,您可以使用bundletool从 AAB 中提取 APK。

@blasten
谢谢你的确认!
关于简单评论: @audkar说的话。 对于 AAB,开发人员还必须考虑由于资产丢失而导致的潜在故障情况。 对所有可能的设备配置进行测试是很困难的,因此如果发生这些故障,很可能是在生产中。

应用程序大小可能是一些人愿意为这种安心付出的代价。

我确信有比这个问题更好的地方来讨论每种方法的优点,但我不想破坏它。

/cc @jonahwilliams我们可能需要在build apk支持胖 APK。
我们还应该更改build apk的默认值吗?

肯定需要胖 apk 支持。 有很多工具(测试版发行版等)还不能与应用程序包一起使用。

flutter build appbundle现在在master,有没有自愿的人想试一试?

我们进行了一些讨论以支持build apk中的平台列表,因此您可以执行以下操作: flutter build apk --target-platform android-arm,android-arm64

@blasten我切换到主频道,升级并构建了 appbundle,效果很好。 然后将其上传到播放控制台,所有警告都消失了。 (macOS 10.14.4)

惊人的! 在我进行更改后,我将在今晚编译我的构建。

捆绑包似乎不起作用,应用程序在下载时崩溃。

Issue: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mattetti.sounds/com.mattetti.sounds.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.mattetti.sounds.MainActivity" on path: DexPathList[[zip file "/data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/base.apk", zip file "/data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/split_config.arm64_v8a.apk", zip file "/data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/split_config.xxhdpi.apk"],nativeLibraryDirectories=[/data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/lib/arm64, /data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/base.apk!/lib/arm64-v8a, /data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/split_config.arm64_v8a.apk!/lib/arm64-v8a, /data/app/com.mattetti.sounds-ewwlQg0QphABpwu8t14HWA==/split_config.xxhdpi.apk!/lib/arm64-v8a, /system/lib64]]

似乎com.mattetti.sounds.MainActivity不在捆绑包中?

不知道为什么,我如何检查它被删除的原因?

@mattetti你在使用Flutter 模块吗? MainActivity扩展FlutterActivity

@blasten
这是我的依赖项

environment:
  sdk: ">=2.2.2 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  rxdart: ^0.22.0
  shared_preferences: ^0.5.2
  http: ^0.12.0
  cached_network_image: ^0.8.0
  url_launcher: ^5.0.2

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_launcher_icons: "^0.7.0"

dependency_overrides:
  # requried for flutter_icons at this point
  image: 2.0.7

但我也刚刚注意到我重命名了我的应用程序包,但没有更改我的MainActivity.java文件的路径,这仍然是android/app/src/main/java/com/example/old_name/这可能是问题所在。 明天,我将尝试更改路径并推送另一个包。

你好@blasten ,我尝试构建 appbundle 并收到此错误

[  +48 ms] FAILURE: Build failed with an exception.
[   +3 ms] * What went wrong:
[        ] Failed to capture snapshot of input files for task ':app::flutter:package:packLibsDevRelease' property
'rootSpec$2$1' during up-to-date check.
[        ] > java.io.IOException: The filename, directory name, or volume label syntax is incorrect
[        ] * Try:
[        ] Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log
output. Run with --scan to get full insights.
[        ] * Get more help at https://help.gradle.org
[        ] Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
[        ] See https://docs.gradle.org/4.6/userguide/command_line_interface.html#sec:command_line_warnings
[        ] BUILD FAILED in 1m 28s

我的项目使用风味,这是我运行的命令

flutter build appbundle --flavor stage -t lib/main-stage.dart -v

应用程序包是否也包含 mapping.txt? 通过 Codemagic 将应用程序包上传到 Google Play Console 时,不包含 mapping.txt,因此没有自动测试或发布前报告 - 您在上传 apk 时拥有:(

所以问题是:

Flutter 团队是否会在 8 月之前更新 64 位版本,以便我们可以上传和更新我们使用 Flutter 制作的应用程序?

@YazeedAlKhalaf是的。 您今天可以使用flutter build appbundle ,您将获得一个包含 32 位和 64 位的应用程序包。

@mattetti问题解决了吗?

@nohli mapping.txt 听起来像是一个功能请求。 随意提交一个新的错误。

@skybur你能跑flutter doctor吗? 你的 Flutter 项目是应用程序还是模块?

@blasten我的项目是一个应用程序。

这是颤振医生的结果

[√] Flutter (Channel master, v1.6.1-pre.68, on Microsoft Windows [Version 10.0.17763.503], locale en-US)
    • Flutter version 1.6.1-pre.68 at D:\Devs\Flutter\testappbundle\flutter
    • Framework revision d5aae54a28 (22 hours ago), 2019-05-20 23:19:18 -0400
    • Engine revision 301f560bd8
    • Dart version 2.3.1 (build 2.3.1-dev.0.0 b48c8b1d1c)

[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at D:\AndroidSDK
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • ANDROID_HOME = D:\AndroidSDK
    • ANDROID_SDK_ROOT = D:\AndroidSDK
    • Java binary at: D:\AndroidStudio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)
    • All Android licenses accepted.

[√] Android Studio (version 3.2)
    • Android Studio at D:\AndroidStudio
    • Flutter plugin version 31.3.1
    • Dart plugin version 181.5656
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)

[√] VS Code, 64-bit edition (version 1.33.1)
    • VS Code at C:\Program Files\Microsoft VS Code
    • Flutter extension version 3.0.2

[!] Connected device
    ! No devices available

! Doctor found issues in 1 category.

@blasten :得到与skybur相同的错误

尝试使用flutter build appbundle然后上传到商店,然后从 Android 手机打开:
打开时立即崩溃。

亚行日志:
05-22 09:40:52.404 27305 27305 E flutter : [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings. 05-22 09:40:52.404 27305 27305 E flutter : [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from. 05-22 09:40:52.404 27305 27305 E flutter : [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance. 05-22 09:40:52.404 27305 27305 F flutter : [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM. 05-22 09:40:52.404 27305 27305 F libc : Fatal signal 6 (SIGABRT), code -6 in tid 27305 (tform.atomicdex) 05-22 09:40:52.432 27339 27339 I crash_dump64: obtaining output fd from tombstoned 05-22 09:40:52.433 1417 1417 I /system/bin/tombstoned: received crash request for pid 27305 05-22 09:40:52.434 27339 27339 I crash_dump64: performing dump of process 27305 (target tid = 27305) 05-22 09:40:52.434 27339 27339 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 05-22 09:40:52.434 27339 27339 F DEBUG : Build fingerprint: 'lge/judyln_lao_com/judyln:8.0.0/OPR1.170623.032/190501244a6e5.FGN:user/release-keys' 05-22 09:40:52.434 27339 27339 F DEBUG : Revision: '12' 05-22 09:40:52.434 27339 27339 F DEBUG : ABI: 'arm64' 05-22 09:40:52.434 27339 27339 F DEBUG : pid: 27305, tid: 27305, name: PACKAGE_NAME >>> PACKAGE_NAME <<< 05-22 09:40:52.434 27339 27339 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 05-22 09:40:52.435 27339 27339 F DEBUG : Abort message: '[FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM. 05-22 09:40:52.435 27339 27339 F DEBUG : ' 05-22 09:40:52.435 27339 27339 F DEBUG : x0 0000000000000000 x1 0000000000006aa9 x2 0000000000000006 x3 0000000000000008 05-22 09:40:52.435 27339 27339 F DEBUG : x4 0000000007d0bf68 x5 0000000007d0bf68 x6 0000000007d0bf68 x7 0000000007d0bfd8 05-22 09:40:52.435 27339 27339 F DEBUG : x8 0000000000000083 x9 8644075c81e36b5a x10 00000077ccff6a48 x11 8644075c81e36b5a 05-22 09:40:52.435 27339 27339 F DEBUG : x12 8644075c81e36b5a x13 0000000000000020 x14 ffffffffffffffdf x15 00000077ca27ec68 05-22 09:40:52.435 27339 27339 F DEBUG : x16 00000077ca2732b8 x17 00000077ca205a44 x18 0000000000000048 x19 0000000000006aa9 05-22 09:40:52.435 27339 27339 F DEBUG : x20 0000000000006aa9 x21 0000007fe4fb81b8 x22 00000077b3dffba0 x23 00000077bd29d7a0 05-22 09:40:52.435 27339 27339 F DEBUG : x24 00000077aa79a150 x25 0000000000000000 x26 0000000000000000 x27 0000000000000002 05-22 09:40:52.435 27339 27339 F DEBUG : x28 0000000000000000 x29 0000007fe4fb81a0 x30 00000077ca1aa8e4 05-22 09:40:52.435 27339 27339 F DEBUG : sp 0000007fe4fb8160 pc 00000077ca205a4c pstate 0000000060000000 05-22 09:40:52.436 27339 27339 F DEBUG : 05-22 09:40:52.436 27339 27339 F DEBUG : backtrace: 05-22 09:40:52.436 27339 27339 F DEBUG : #00 pc 0000000000079a4c /system/lib64/libc.so (tgkill+8) 05-22 09:40:52.436 27339 27339 F DEBUG : #01 pc 000000000001e8e0 /system/lib64/libc.so (abort+88) 05-22 09:40:52.436 27339 27339 F DEBUG : #02 pc 000000000001d61c /data/app/PACKAGE_NAME-F-z4qH6HT271dk7M7oI8Uw==/split_config.arm64_v8a.apk (offset 0xea7000)

@Kiruel我很不清楚为什么人们一直说 app bundle 正在解决这个问题。

App bundle 无非是一个自动拆分的APK,在assets 文件夹上没有拆分。 所以快照仍然只针对单一架构。

我可能遗漏了一些东西,但在我看来,现在唯一的解决方案是为每个架构构建 APK,并在 gradle 文件中使用相应的 ndk 过滤。 然后上传这些 APK 中的每一个。

如果我们不能用 APK 解决这个问题,那么 app bundle 也无法工作。

@ndusart我认为这不是真的。 应用程序包文档说:

res/、lib/ 和 assets/:这些目录与典型 APK 中的目录相同。 当您上传应用程序包时,Google Play 会检查这些目录并仅打包满足目标设备配置的文件,同时保留文件路径。

所以它可以以某种方式分割资产。

@jereksel这只是说明这些目录在 app bundle 中的工作方式与 apk 中的完全相同,并且assets/文件夹没有拆分。 它用于将资产存储在应用程序中非常特定的文件结构中,它并不意味着由操作系统或任何东西解析。

如果我错了,请告诉我如何根据目标 ABI 拆分此文件夹。

这句话只是证实了我所说的,如果现在 APK 无法做到这一点,那么使用 app bundle 将无法实现,因为这些文件夹在两种方式下的工作方式完全相同。

我还没有看到自己拆分资产,但我发现了这一点:

https://medium.com/google-developer-experts/exploring-the-android-app-bundle-ca16846fa3d7

assets.pb — 这相当于应用程序资产的资源表,仅当您在应用程序中使用资产时才会出现。

所以我的猜测是 Android Studio 不会拆分资产,但应用程序包本身支持这一点。

你有任何官方文件吗? 所有这些似乎都非常不可靠。
以下文章https://medium.com/mindorks/android-app-bundle-aab-98de6dad8ba8指出我们可以在assets/附加文件夹名称的后缀来拆分它,但目前这只能在语言上完成。

所以,这似乎还不稳定,不应该基于现在。 如果可能,VM 快照应该被驱逐到lib/文件夹中,或者flutter命令应该带有完整的功能来为特定目标构建 APK(还有工作要做)因为可供很多人访问)并在准备好时延迟应用程序包的生产。

@blasten

我切换到主频道,升级并构建了 appbundle。 不幸的是,应用程序在从谷歌商店下载后出现以下 logcat

2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
2019-05-22 09:42:14.824 6995-6995/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.

flutter build appbundle现在在master,有没有自愿的人想试一试?

我们进行了一些讨论以支持build apk中的平台列表,因此您可以执行以下操作: flutter build apk --target-platform android-arm,android-arm64

@blasten

我切换到主频道,升级并构建了 appbundle。 不幸的是,应用程序在从谷歌商店下载后出现以下 logcat

2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
2019-05-22 09:42:14.824 6995-6995/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.

flutter build appbundle现在在master,有没有自愿的人想试一试?
我们进行了一些讨论以支持build apk中的平台列表,因此您可以执行以下操作: flutter build apk --target-platform android-arm,android-arm64

有同样的问题,虽然我还没有任何日志。

@ndusart
是啊,你说得对。 我检查了 bundletool 源代码,并且资产拆分确实仅按语言进行:
https://github.com/google/bundletool/blob/master/src/main/java/com/android/tools/build/bundletool/splitters/ModuleSplitter.java#L286

这是我的解决方案:

  1. app gradle
splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }
  1. 运行flutter build apk --release --target-platform=android-arm
  2. app-armeabi-v7a-release.apk上传到 Play 商店
  3. 增加versionCode
  4. 运行flutter build apk --release --target-platform=android-arm64
  5. app-arm64-v8a-release.apk上传到 Play 商店

Google Play 商店将根据设备架构为 App 提供服务。 32 位设备很高兴,64 位设备很高兴,我很高兴知道我的 APK 大小仍然相对较小,同时仍然可以为两种架构提供服务。

如果我们在同一个 APK 中包含对这两种架构的支持,则您的应用程序的大小预计为 10MB 以上

有重要的事情要告诉大家。 如果你使用我引用的方法。 当您想继续调试您的应用程序时,您可能需要注释掉该设置。 我遇到了Gradle build failed to generate an Android package的错误,并卡住了几个小时,制作了一些gradlew clean ...等等,最后发现这应该被注释掉!

希望这有助于有人跳出来。

flutter build appbundle现在在master,有没有自愿的人想试一试?

我们进行了一些讨论以支持build apk中的平台列表,因此您可以执行以下操作: flutter build apk --target-platform android-arm,android-arm64

flutter build appbundle正在工作! 我不需要添加该设置,只需执行代码即可。 不过编译的时间有点长,不过现在只能通过Google Play了。

@Tokenyet您是否能够从 Play 商店下载该应用程序并在上传.aab后运行它? 如果是这种情况,您介意粘贴flutter doctor的输出吗?

@blasten

我切换到主频道,升级并构建了 appbundle。 不幸的是,应用程序在从谷歌商店下载后出现以下 logcat

2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
2019-05-22 09:42:14.824 6995-6995/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.

flutter build appbundle现在在master,有没有自愿的人想试一试?
我们进行了一些讨论以支持build apk中的平台列表,因此您可以执行以下操作: flutter build apk --target-platform android-arm,android-arm64

在尝试从 Play 商店(创建为 appbundle)运行我的应用程序时,这里完全相同。 你们需要什么日志来解决这个问题?

这会很有帮助:

  1. https://developer.android.com/studio/command-line/bundletool下载bundletool
  2. 运行flutter build appbundle (请说明您是否传递了任何标志,或者您是否对任何 Gradle 脚本进行了 _custom_ 更改)
  3. 运行bundletool build-apks --bundle=build/app/outputs/bundle/release/app.aab --output=out.apks以提取 APK 集。
  4. 运行unzip -l out.apks和最后flutter doctor并将两个命令的输出粘贴到您的评论中。

如果可能的话:

使用bundletool和 APK 集在设备上进行本地测试。 这些是步骤,将 logcat 粘贴到您的评论中。

尽管我仅使用bundletool在本地进行

@blasten因此,之前的错误已修复,但我遇到了另一个错误。 我认为这是由我的项目中的某些内容引起的。 有什么办法可以调试这个吗?

[+6084 ms] Failed to execute aapt
[  +17 ms] com.android.ide.common.process.ProcessException: Failed to execute aapt
[   +1 ms]      at com.android.builder.core.AndroidBuilder.processResources(AndroidBuilder.java:809)
[   +1 ms]      at com.android.build.gradle.internal.res.LinkAndroidResForBundleTask.taskAction(LinkAndroidResForBundleTask.kt:128)
[   +1 ms]      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[   +1 ms]      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[   +1 ms]      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[        ]      at java.lang.reflect.Method.invoke(Method.java:498)
[        ]      at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
[   +4 ms]      at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
[   +1 ms]      at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
[        ]      at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
[   +3 ms]      at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:788)
[  +29 ms]      at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:755)
[   +1 ms]      at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
[   +1 ms]      at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
[   +2 ms]      at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
[   +1 ms]      at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
[   +9 ms]      at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
[        ]      at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
[        ]      at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
[   +1 ms]      at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
[        ]      at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
[   +1 ms]      at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
[        ]      at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
[        ]      at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
[   +5 ms]      at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
[        ]      at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
[   +1 ms]      at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
[   +1 ms]      at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
[  +12 ms]      at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
[   +4 ms]      at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
[        ]      at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
[        ]      at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
[        ]      at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:256)
[        ]      at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
[        ]      at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
[        ]      at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
[        ]      at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
[   +1 ms]      at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
[   +6 ms]      at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
[        ]      at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
[        ]      at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
[        ]      at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
[   +1 ms]      at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
[   +1 ms]      at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
[   +1 ms]      at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
[        ]      at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
[  +14 ms]      at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
[   +1 ms]      at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
[   +4 ms]      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[   +1 ms]      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[   +2 ms]      at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
[   +1 ms]      at java.lang.Thread.run(Thread.java:745)
[  +26 ms] Caused by: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
[   +4 ms]      at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:503)
[   +1 ms]      at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:482)
[        ]      at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:79)
[        ]      at com.android.builder.internal.aapt.AbstractAapt.link(AbstractAapt.java:34)
[        ]      at com.android.builder.core.AndroidBuilder.processResources(AndroidBuilder.java:807)
[        ]      ... 51 more
[        ] Caused by: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
[   +1 ms]      at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:503)
[        ]      at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:462)
[        ]      at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:79)
[        ]      at com.android.builder.internal.aapt.v2.QueueableAapt2.lambda$makeValidatedPackage$1(QueueableAapt2.java:166)
[   +4 ms]      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[   +1 ms]      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[   +1 ms]      ... 1 more
[   +1 ms] Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
[   +1 ms]      at com.android.builder.png.AaptProcess$NotifierProcessOutput.handleOutput(AaptProcess.java:443)
[   +1 ms]      at com.android.builder.png.AaptProcess$NotifierProcessOutput.err(AaptProcess.java:395)
[        ]      at com.android.builder.png.AaptProcess$ProcessOutputFacade.err(AaptProcess.java:312)
[        ]      at com.android.utils.GrabProcessOutput$1.run(GrabProcessOutput.java:104)
[        ] FAILURE: Build failed with an exception.
[        ] * What went wrong:
[        ] Execution failed for task ':app:bundleProdReleaseResources'.
[        ] > Failed to execute aapt
[        ] * Try:
[        ] Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
[   +5 ms] * Get more help at https://help.gradle.org
[        ] BUILD FAILED in 30s
[ +324 ms] Running Gradle task 'bundleProdRelease'... (completed in 31.5s)

@blasten我按照你的所有步骤记录我的日志:

➜  PROJECT_NAME git:(master) ✗ unzip -l out.apks
Archive:  out.apks
  Length      Date    Time    Name
---------  ---------- -----   ----
 43369811  01-01-1970 01:00   standalones/standalone-armeabi_tvdpi.apk
 43327197  01-01-1970 01:00   standalones/standalone-armeabi_hdpi.apk
 43319503  01-01-1970 01:00   standalones/standalone-armeabi_mdpi.apk
 43320027  01-01-1970 01:00   standalones/standalone-armeabi_ldpi.apk
 43346424  01-01-1970 01:00   standalones/standalone-armeabi_xxhdpi.apk
 43350403  01-01-1970 01:00   standalones/standalone-armeabi_xxxhdpi.apk
 43332970  01-01-1970 01:00   standalones/standalone-armeabi_xhdpi.apk
 50349155  01-01-1970 01:00   standalones/standalone-armeabi_v7a_ldpi.apk
 50348629  01-01-1970 01:00   standalones/standalone-armeabi_v7a_mdpi.apk
 50398968  01-01-1970 01:00   standalones/standalone-armeabi_v7a_tvdpi.apk
 50356358  01-01-1970 01:00   standalones/standalone-armeabi_v7a_hdpi.apk
 50362126  01-01-1970 01:00   standalones/standalone-armeabi_v7a_xhdpi.apk
 50375565  01-01-1970 01:00   standalones/standalone-armeabi_v7a_xxhdpi.apk
 50379553  01-01-1970 01:00   standalones/standalone-armeabi_v7a_xxxhdpi.apk
 50660246  01-01-1970 01:00   standalones/standalone-arm64_v8a_ldpi.apk
 50659718  01-01-1970 01:00   standalones/standalone-arm64_v8a_mdpi.apk
 50710027  01-01-1970 01:00   standalones/standalone-arm64_v8a_tvdpi.apk
 50667415  01-01-1970 01:00   standalones/standalone-arm64_v8a_hdpi.apk
 50673185  01-01-1970 01:00   standalones/standalone-arm64_v8a_xhdpi.apk
 50686641  01-01-1970 01:00   standalones/standalone-arm64_v8a_xxhdpi.apk
 43345757  01-01-1970 01:00   standalones/standalone-x86_mdpi.apk
 43346287  01-01-1970 01:00   standalones/standalone-x86_ldpi.apk
 43396086  01-01-1970 01:00   standalones/standalone-x86_tvdpi.apk
 50690619  01-01-1970 01:00   standalones/standalone-arm64_v8a_xxxhdpi.apk
 43359247  01-01-1970 01:00   standalones/standalone-x86_xhdpi.apk
 43353470  01-01-1970 01:00   standalones/standalone-x86_hdpi.apk
 43372688  01-01-1970 01:00   standalones/standalone-x86_xxhdpi.apk
 43376653  01-01-1970 01:00   standalones/standalone-x86_xxxhdpi.apk
 43340224  01-01-1970 01:00   standalones/standalone-x86_64_ldpi.apk
 43339701  01-01-1970 01:00   standalones/standalone-x86_64_mdpi.apk
 43390033  01-01-1970 01:00   standalones/standalone-x86_64_tvdpi.apk
 43347418  01-01-1970 01:00   standalones/standalone-x86_64_hdpi.apk
    57027  01-01-1970 01:00   splits/base-ldpi.apk
    56501  01-01-1970 01:00   splits/base-mdpi.apk
    61951  01-01-1970 01:00   splits/base-hdpi.apk
    67741  01-01-1970 01:00   splits/base-xhdpi.apk
    81187  01-01-1970 01:00   splits/base-xxhdpi.apk
    85188  01-01-1970 01:00   splits/base-xxxhdpi.apk
   105385  01-01-1970 01:00   splits/base-tvdpi.apk
 43353194  01-01-1970 01:00   standalones/standalone-x86_64_xhdpi.apk
    11313  01-01-1970 01:00   splits/base-ca.apk
    11211  01-01-1970 01:00   splits/base-da.apk
    12040  01-01-1970 01:00   splits/base-fa.apk
    11659  01-01-1970 01:00   splits/base-ja.apk
    12486  01-01-1970 01:00   splits/base-ka.apk
    12511  01-01-1970 01:00   splits/base-pa.apk
    12856  01-01-1970 01:00   splits/base-ta.apk
    11195  01-01-1970 01:00   splits/base-nb.apk
    12001  01-01-1970 01:00   splits/base-be.apk
    11420  01-01-1970 01:00   splits/base-de.apk
    13041  01-01-1970 01:00   splits/base-ne.apk
    12674  01-01-1970 01:00   splits/base-te.apk
 43366615  01-01-1970 01:00   standalones/standalone-x86_64_xxhdpi.apk
    11179  01-01-1970 01:00   splits/base-af.apk
    12151  01-01-1970 01:00   splits/base-bg.apk
    12353  01-01-1970 01:00   splits/base-th.apk
    11228  01-01-1970 01:00   splits/base-fi.apk
    12537  01-01-1970 01:00   splits/base-si.apk
    12551  01-01-1970 01:00   splits/base-hi.apk
    11939  01-01-1970 01:00   splits/base-kk.apk
    11615  01-01-1970 01:00   splits/base-vi.apk
    12059  01-01-1970 01:00   splits/base-mk.apk
    11440  01-01-1970 01:00   splits/base-sk.apk
    11961  01-01-1970 01:00   splits/base-uk.apk
    12344  01-01-1970 01:00   splits/base-el.apk
    11342  01-01-1970 01:00   splits/base-gl.apk
    13334  01-01-1970 01:00   splits/base-ml.apk
    11350  01-01-1970 01:00   splits/base-nl.apk
    11371  01-01-1970 01:00   splits/base-pl.apk
    11311  01-01-1970 01:00   splits/base-sl.apk
    11428  01-01-1970 01:00   splits/base-tl.apk
    11825  01-01-1970 01:00   splits/base-am.apk
    12685  01-01-1970 01:00   splits/base-km.apk
    12615  01-01-1970 01:00   splits/base-bn.apk
    11223  01-01-1970 01:00   splits/base-in.apk
    12832  01-01-1970 01:00   splits/base-kn.apk
    11958  01-01-1970 01:00   splits/base-mn.apk
    12621  01-01-1970 01:00   splits/base-lo.apk
    11425  01-01-1970 01:00   splits/base-ko.apk
    11395  01-01-1970 01:00   splits/base-ro.apk
    11438  01-01-1970 01:00   splits/base-sq.apk
    13612  01-01-1970 01:00   splits/base-fr.apk
    11647  01-01-1970 01:00   splits/base-ar.apk
    11278  01-01-1970 01:00   splits/base-hr.apk
    12447  01-01-1970 01:00   splits/base-mr.apk
    12943  01-01-1970 01:00   splits/base-or.apk
    14244  01-01-1970 01:00   splits/base-sr.apk
    11316  01-01-1970 01:00   splits/base-tr.apk
    11973  01-01-1970 01:00   splits/base-ur.apk
    11308  01-01-1970 01:00   splits/base-bs.apk
    12525  01-01-1970 01:00   splits/base-as.apk
    13704  01-01-1970 01:00   splits/base-es.apk
    11367  01-01-1970 01:00   splits/base-cs.apk
    11222  01-01-1970 01:00   splits/base-is.apk
    11360  01-01-1970 01:00   splits/base-ms.apk
    11323  01-01-1970 01:00   splits/base-et.apk
    11283  01-01-1970 01:00   splits/base-it.apk
    11550  01-01-1970 01:00   splits/base-lt.apk
    14605  01-01-1970 01:00   splits/base-pt.apk
    11377  01-01-1970 01:00   splits/base-eu.apk
    12409  01-01-1970 01:00   splits/base-gu.apk
    11651  01-01-1970 01:00   splits/base-hu.apk
    12048  01-01-1970 01:00   splits/base-ru.apk
    11616  01-01-1970 01:00   splits/base-lv.apk
    11314  01-01-1970 01:00   splits/base-zu.apk
    11260  01-01-1970 01:00   splits/base-sv.apk
    11539  01-01-1970 01:00   splits/base-iw.apk
    11283  01-01-1970 01:00   splits/base-sw.apk
    12110  01-01-1970 01:00   splits/base-hy.apk
 43370609  01-01-1970 01:00   standalones/standalone-x86_64_xxxhdpi.apk
    11904  01-01-1970 01:00   splits/base-ky.apk
    11430  01-01-1970 01:00   splits/base-az.apk
    13395  01-01-1970 01:00   splits/base-my.apk
    11296  01-01-1970 01:00   splits/base-uz.apk
    15398  01-01-1970 01:00   splits/base-zh.apk
    23877  01-01-1970 01:00   splits/base-en.apk
   107757  01-01-1970 01:00   splits/base-armeabi.apk
   134023  01-01-1970 01:00   splits/base-x86.apk
   127969  01-01-1970 01:00   splits/base-x86_64.apk
 42926206  01-01-1970 01:00   splits/base-master.apk
 21480838  01-01-1970 01:00   splits/base-arm64_v8a_2.apk
 17508309  01-01-1970 01:00   splits/base-armeabi_v7a_2.apk
   217751  01-01-1970 01:00   splits/base-armeabi_2.apk
   311771  01-01-1970 01:00   splits/base-x86_2.apk
   308537  01-01-1970 01:00   splits/base-x86_64_2.apk
  7136923  01-01-1970 01:00   splits/base-armeabi_v7a.apk
  7447993  01-01-1970 01:00   splits/base-arm64_v8a.apk
 42926200  01-01-1970 01:00   splits/base-master_2.apk
    16537  01-01-1970 01:00   toc.pb
---------                     -------
1759809847                     129 files
➜  PROJECT_NAME git:(master) ✗ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel master, v1.6.1-pre.68, on Mac OS X 10.14.5 18F132, locale en-GB)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] iOS toolchain - develop for iOS devices (Xcode 10.2.1)
[!] Android Studio (version 3.3)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.34.0)
[✓] Connected device (1 available)

! Doctor found issues in 1 category.

@jereksel @ndusart
实际上,这称为Assets Targeting ,它允许您根据图形 API、语言和纹理压缩定位/拆分资产中的目录。
如下所示: .../bundletool/model/targeting/TargetedDirectorySegment.java

关于 AAB 当前的flutter@master在本地对我有用 - 使用bundletool在真实设备上测试和安装。 我在build.gradle禁用了对密度和语言的拆分,所以build-apks给了我这个:

  Length      Date    Time    Name
---------  ---------- -----   ----
  6872466  1970-01-01 01:00   splits/base-arm64_v8a.apk
  6726824  1970-01-01 01:00   splits/base-master.apk
 13289718  1970-01-01 01:00   standalones/standalone-armeabi_v7a.apk
 13594392  1970-01-01 01:00   standalones/standalone-arm64_v8a.apk
  6567785  1970-01-01 01:00   splits/base-armeabi_v7a.apk
      429  1970-01-01 01:00   toc.pb
---------                     -------
 47051614                     6 files

在测试实验室测试它我也全绿了。
仍在等待 Play 商店处理此版本以测试此频道。

@Tokenyet您是否能够从 Play 商店下载该应用程序并在上传.aab后运行它? 如果是这种情况,您介意粘贴flutter doctor的输出吗?

我可以从 Play 商店下载该应用程序,然后运行它。 你可以[试一试](https://play.google.com/store/apps/details?id=com.bumbystudio.starry_clock)。 (编辑:哎呀,这不是工作...来自 PlayStore)

以下是您需要的flutter doctor 。 希望它有所帮助。

[√] Flutter (Channel master, v1.6.1-pre.88, on Microsoft Windows [Version 10.0.17134.765], locale zh-TW)

[√] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3)
[√] Android Studio(3.3版)
[√] VS Code,64位版(1.30.2版)
[!] 连接的设备
! 没有可用的设备

这对我来说很好用!

构建类型{
发布 {
// TODO:为发布版本添加您自己的签名配置。
// 现在使用调试密钥签名,所以flutter run --release可以工作。
签名配置signingConfigs.debug
}
调试{
ndk{
abiFilters 'armeabi-v7a'
}
}
}

@SPodjasek仍然,我们需要根据 ABI 拆分assets/ 。 目前如何做到这一点?

我安装在我的设备中,但它似乎不起作用。 我得到的只是一个
黑屏。

谢谢,

普鲁索塔曼·拉玛努加姆

在 2019 年 5 月 23 日星期四下午 6:43 Tokenyet, notifications @github.com 写道:

@Tokenyet https://github.com/Tokenyet你能下载这个应用吗
从 Play 商店下载并在上传 .aab 后运行它? 如果这是
案例,您介意粘贴颤振医生的输出吗?

我可以从 Play 商店下载该应用程序,然后运行它。 你可以给它
一试
https://play.google.com/store/apps/details?id=com.bumbystudio.starry_clock
.

以下是您需要的我的颤振医生。 希望它有所帮助。

[√] Flutter (Channel master, v1.6.1-pre.88, on Microsoft Windows [Version
10.0.17134.765],语言环境 zh-TW)

[√] Android 工具链 - 为 Android 设备开发(Android SDK 版本)
28.0.3)
[√] Android Studio(3.3版)
[√] VS Code,64位版(1.30.2版)
[!] 连接的设备
! 没有可用的设备


您收到此消息是因为您订阅了此线程。
直接回复本邮件,在GitHub上查看
https://github.com/flutter/flutter/issues/18494?email_source=notifications&email_token=AAIHDZYY47H6PUQQJYEO4J3PW2J7RA5CNFSM4FFE2B7KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LDFNXP200000000000000000000000000000000000000 ;不同的
或静音线程
https://github.com/notifications/unsubscribe-auth/AAIHDZZXV67JCNVJYLVA3WLPW2J7RANCNFSM4FFE2B7A
.

@ndusart在这一点上这是不可能的 - 也许在bundletool

@SPodjasek所以这就是我的意思,所有这些问题都以错误的方式进行。

所有的讨论似乎都以“别担心,当我们可以构建应用程序包时,一切都会好起来的”结束,但现在和不久的将来情况完全不是这样。
看到 Flutter 团队让人们认为这是可能的,有点令人失望。

flutter 应该能够提供一种轻松构建拆分 APK 的方法,可以通过自己进行拆分或设法将 VM 快照移动到lib/文件夹并让拆分正常工作(然后我们也可以使用应用程序包)

让我们回顾一下:

  1. Flutter 将通过flutter build apk ...支持胖 APK。
  2. 如果您想立即尝试此功能,请在主分支中尝试flutter build appbundle 。 如果应用程序包不适用于您的用例,则 (1) 应涵盖其余情况。

好的@blasten我确实查看了主代码并将快照移动到了 lib 文件夹中:
https://github.com/flutter/flutter/blob/dc28ba8919604ff19ea7cbad8d9400516347b08a/packages/flutter_tools/gradle/flutter.gradle#L470 -L481

所以它不仅仅是添加应用程序包支持。 现在更清楚了。
尽管有人表示问题出在资产文件夹上,但没有提供任何信息,因此在此方向上完成了工作,因为此问题和应用程序包支持非常独立,因此我们会感谢一些解释。

谢谢你的工作。

@ndusart - @blasten对 Android 嵌入进行了更改,以便它现在会在lib文件夹中查找二进制 blob,这样如果我没记错的话,您可以捆绑两种类型...

如果快照被移动到 lib 中,那么#30846 可能也会被修复?

@blasten
我切换到主频道,升级并构建了 appbundle。 不幸的是,应用程序在从谷歌商店下载后出现以下 logcat

2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
2019-05-22 09:42:14.824 6995-6995/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
2019-05-22 09:42:14.824 6995-6995/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.

flutter build appbundle现在在master,有没有自愿的人想试一试?
我们进行了一些讨论以支持build apk中的平台列表,因此您可以执行以下操作: flutter build apk --target-platform android-arm,android-arm64

有同样的问题,虽然我还没有任何日志。

同样在这里。 有错误。 升级 master 并运行flutter build appbundle 。 摆脱了错误,但应用程序在打开时崩溃。

我尝试使用最新的 flutter master 版本将 appbundle 上传到应用商店并进行最新更改。 64 位错误现已消失,但我的应用程序立即崩溃。

真正奇怪的是使用下面的命令运行 64 位版本工作正常。
颤振构建 apk --target-platform android-arm64
颤振安装api

只有在通过应用商店中的 appbundle 安装应用时才会崩溃。 现在我已经将 appstore 恢复到 32 位 apk。

我的 gradle.build 没有什么特别的

minSdk 版本 21
目标SDK版本28
versionCode flutterVersionCode.toInteger()
版本名称 flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true

我正在运行 Flutter (Channel master, v1.6.4-pre.13, on Mac OS X 10.14.5 18F132, locale en-US)

无论如何在上传到应用商店之前测试这些包? 这是 google 正在处理的已知问题还是我需要对我的 gradle 文件进行一些更改?

@chitwoob请按照步骤操作: https :

@blasten我遇到了与此问题无关的捆绑工具问题。

我得到
错误:无法启动 ADB 服务器

跑步时
build-apks --connected-device --bundle=./app.aab --output=./my_app.apks --adb

我已经正确安装了 adb。 当我尝试 adb logcat 时它工作正常。

将是一个很长的评论,但这完全解决了问题

这是我的解决方案:

  1. app gradle
splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }
  1. 运行flutter build apk --release --target-platform=android-arm
  2. app-armeabi-v7a-release.apk上传到 Play 商店
  3. 增加versionCode
  4. 运行flutter build apk --release --target-platform=android-arm64
  5. app-arm64-v8a-release.apk上传到 Play 商店

Google Play 商店将根据设备架构为 App 提供服务。 32 位设备很高兴,64 位设备很高兴,我很高兴知道我的 APK 大小仍然相对较小,同时仍然可以为两种架构提供服务。

如果我们在同一个 APK 中包含对这两种架构的支持,则您的应用程序的大小预计为 10MB 以上

按照这些步骤操作会给出“Gradle build failed to generate an Android package”。 错误
_经过一个小时的调试,找到了修复方法。 _

要为 x86 和 x64 创建不同的应用程序,请按照以下步骤操作:

步骤 1:在app/build.gradle文件中包含代码片段。 该文件将如下所示:

....
    lintOptions {
        disable 'InvalidPackage'
    }

    splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }

    defaultConfig {
....

第 2 步:使用flutter build apk --release创建发布 apk
这将在文件夹build/app/outputs/apk/app.apk创建基于 x86 的 apk
将此 apk 上传到 google play 商店。
x86 完成到现在

此时不要运行flutter clean
我正在这样做并在构建 x64 apk 时出错

第 3 步:现在打开pubspec.yaml并将version
version: 1.0.0+1version: 1.0.0+2

+ 旁边的数字是版本代码

第 4 步:现在运行命令
flutter build apk --release --target-platform=android-arm64

此命令完成后,转到build/app/outputs/apk/release/ 。 在那里你会找到一个名为app-arm64-v8a-release.apk的 apk。 这是具有不同版本代码的 64 位 apk 文件。

现在上传这个 x64 apk 到 Play 商店......然后你去。 您已将 x86 和 x64 应用程序上传到 Play 商店。

将是一个很长的评论,但这完全解决了问题

[...]
要为 x86 和 x64 创建不同的应用程序,请按照以下步骤操作:

步骤 1:在app/build.gradle文件中包含代码片段。 该文件将如下所示:

....
    lintOptions {
        disable 'InvalidPackage'
    }

    splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }

    defaultConfig {
....

第 2 步:使用flutter build apk --release创建发布 apk
[...]

同意你的回答。 对我有用,即使我不必遵循第 1 步(我使用了默认的 build.gradle)

然后,您只需要增加内部版本号和版本,以便 Google Play 接受它。

我手上的flutter build appbundle仍然有问题。

将是一个很长的评论,但这完全解决了问题

[...]
要为 x86 和 x64 创建不同的应用程序,请按照以下步骤操作:
步骤 1:在app/build.gradle文件中包含代码片段。 该文件将如下所示:

....
    lintOptions {
        disable 'InvalidPackage'
    }

    splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }

    defaultConfig {
....

第 2 步:使用flutter build apk --release创建发布 apk
[...]

同意你的回答。 对我有用,即使我不必遵循第 1 步(我使用了默认的 build.gradle)

然后,您只需要增加内部版本号和版本,以便 Google Play 接受它。

我手上的flutter build appbundle仍然有问题。

不工作。 我很沮丧。 尝试在 x86 模拟器和真实 arm 设备上部署时,应用程序崩溃。 尝试使用 master/beta/stable 频道。 没有准备好发布。 它对我们来说仍然是展示塞子。 Appbundle 命令生成可安装的包以供播放,但在运行时应用程序仅显示启动画面,然后冻结。 Flutter 团队请提供明确的解决方案或 WA。

@mormih感谢您的耐心等待 - 我们正在努力复制。 如果您不介意,可以给我发一封电子邮件 ([email protected]),包括以下内容,这会有所帮助:

  • 您用于构建的主机平台。
  • 您用于构建应用程序的命令。
  • 使用--bug-report (例如flutter build appbundle --bug-report )运行您的构建命令并附加关联的bugreport.zip文件
  • 附加生成的应用程序包,以便我们可以尝试在本地设备上运行它
  • 尝试运行应用程序后附上adb bugreport的结果

谢谢!

@tvolkert我也遇到了崩溃并显示以下消息的问题:

检查失败:vm。 必须能够初始化 VM。

我的主机平台是 mac 和 macOS 10.14.5。 您是否能够重现它,或者您希望我按照您上面写的步骤进行操作? 另外,也许这应该有一张专用票,因为它与 OP 是一个单独的问题..干杯

@mormih我不确定,但您是否尝试过将x86也包括在 abi 列表中?

include "armeabi-v7a", "arm64-v8a", "x86"

flutter build appbundle (在 master 上)对我也不起作用,就像其他人注意到的那样,闪屏卡住了......

到目前为止,我发现(在 Play 商店中)发布 32 位和 64 位的唯一解决方法如下。 (部分包含在线程中,但可能对某人有所帮助):

  1. 创建一个带有 v7 过滤器的 apk + 默认构建 apk 命令:
    在您的 app/build.gradle 文件中:
    defaultConfig { ... ndk{ abiFilters "armeabi-v7a" } }
    然后运行
    flutter build apk
    (默认为 --release)

  2. 在 pubspec.yaml 中添加您的内部版本号。
    例如从version: 1.1.0+6version: 1.1.0+7

  3. 创建一个带有 v8 过滤器的 apk + 以 arm64 作为目标平台构建:
    现在更新 build.gradle 像:
    defaultConfig { ... ndk{ abiFilters "arm64-v8a" } }
    然后运行
    flutter build apk --release --target-platform android-arm64

确实包括必须上传 2 个 apk(从而创建 2 个内部版本号)的开销,但至少它似乎可以完成这项工作,我可以为 32 位和 64 位设备发布...

注意:我放弃了 x86,因为它只涉及非常少的移动设备组(可能没有我的用户),而且我不需要在模拟器中发布版本(调试足以进行测试)。 但这当然可能不适用于其他人。

@ezmegy方法是唯一对我

在评论的某处有人留下了这个。

image

这一直对我有用,而且它只有 1 个终端代码。
它输出 2 个我讨厌的文件,但它创建了 2 个版本。

@ezmegy谢谢! 你拯救了我的一天

谢谢@ezmegy ,你的“技巧”奏效了!

谢谢@ezmegy
我想分享我当前的工作流程,这可能会有所帮助:


在每个架构的app/build.gradle上创建一些构建风格

flavorDimensions 'arch'
    productFlavors {
        arm32 {
            dimension 'arch'
            ndk {
                abiFilters 'armeabi-v7a'
            }
        }
        arm64 {
            dimension 'arch'
            ndk {
                abiFilters 'arm64-v8a'
            }
        }

然后我可以使用以下方法构建两者:
flutter build apk --flavor arm32

flutter build apk --flavor arm64 --target-platform android-arm64
无需在每次构建时修改 gradle


关于版本代码,我更喜欢默认设置一个,然后从那个派生出其他的
例如将arm32设置arm64生成版本代码,即 1.0.0+10001
这应该很容易使用 bash 生成(如果您使用的是 fastlane,则在 fastfile 中)

您可以使用--build-number参数或通过 fastlane 设置版本号(如果您正在使用)

这个版本的代码脚本帮助我在 CI/CD 😄

CMIIW

将是一个很长的评论,但这完全解决了问题

这是我的解决方案:

  1. app gradle
splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }
  1. 运行flutter build apk --release --target-platform=android-arm
  2. app-armeabi-v7a-release.apk上传到 Play 商店
  3. 增加versionCode
  4. 运行flutter build apk --release --target-platform=android-arm64
  5. app-arm64-v8a-release.apk上传到 Play 商店

Google Play 商店将根据设备架构为 App 提供服务。 32 位设备很高兴,64 位设备很高兴,我很高兴知道我的 APK 大小仍然相对较小,同时仍然可以为两种架构提供服务。
如果我们在同一个 APK 中包含对这两种架构的支持,则您的应用程序的大小预计为 10MB 以上

按照这些步骤操作会给出“Gradle build failed to generate an Android package”。 错误
_经过一个小时的调试,找到了修复方法。 _

要为 x86 和 x64 创建不同的应用程序,请按照以下步骤操作:

步骤 1:在app/build.gradle文件中包含代码片段。 该文件将如下所示:

....
    lintOptions {
        disable 'InvalidPackage'
    }

    splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }

    defaultConfig {
....

第 2 步:使用flutter build apk --release创建发布 apk
这将在文件夹build/app/outputs/apk/app.apk创建基于 x86 的 apk
将此 apk 上传到 google play 商店。
x86 完成到现在

此时不要运行flutter clean
我正在这样做并在构建 x64 apk 时出错

第 3 步:现在打开pubspec.yaml并将version
version: 1.0.0+1version: 1.0.0+2

+ 旁边的数字是版本代码

第 4 步:现在运行命令
flutter build apk --release --target-platform=android-arm64

此命令完成后,转到build/app/outputs/apk/release/ 。 在那里你会找到一个名为app-arm64-v8a-release.apk的 apk。 这是具有不同版本代码的 64 位 apk 文件。

现在上传这个 x64 apk 到 Play 商店......然后你去。 您已将 x86 和 x64 应用程序上传到 Play 商店。

它也适用于我,无需第 1 步。感谢每一个人。 我用过 ndk 过滤器 ndk {
abiFilters "armeabi-v7a", "x86"
}
在构建 gradle 文件中。 我不知道它是否需要。 除此之外,我按照步骤 2 中的所有步骤上传了两个 apk,一个用于 32 位,另一个用于 64 位。

早些时候我上传了appbundle,这次上传了apk文件。 工作正常。 我必须检查 appbundle 并尝试在不上传两个 apk 的情况下进行修复。

笔记 :
在执行此过程之前,我的应用程序在以下 arm-64 位设备中崩溃了
红米米,
红米 3S Prime
荣誉8x

曾在以下 arm-64 位设备中工作
三星 Galaxy J4
三星On8

嗨,颤振团队,

请。 还可以考虑其他应用程序市场,例如中国的应用程序市场。 在中国,我们不允许使用 Google Play Store,相反,我们有很多应用市场,例如小米的、华为的和阿里的……等。

在这些应用市场中,我们不允许提供不同架构的 apk 版本,每个版本只能上传一个且只能上传一个 apk,该版本将覆盖之前版本的 apk。 这意味着当前的解决方法是使用“armeabi-v7a”。

如果我错了,请纠正我,通过使用“armeabi-v7a”,所有 64 位设备都将运行 32 位 libflutter.so,我想它会更慢。

所以我建议flutter团队是否可以提供一种方法让我们构建一个包含32位和64位libflutter.so的apk,尽管apk的大小会更大。 (在中国,我们通常有非常快的网速,而且我们很少为无限的4G使用计划付费,而且人们通常不关心apk的大小)

嗨,颤振团队,

请。 还可以考虑其他应用程序市场,例如中国的应用程序市场。 在中国,我们不允许使用 Google Play Store,相反,我们有很多应用市场,例如小米的、华为的和阿里的……等。

在这些应用市场中,我们不允许提供不同架构的 apk 版本,每个版本只能上传一个且只能上传一个 apk,该版本将覆盖之前版本的 apk。 这意味着当前的解决方法是使用“armeabi-v7a”。

如果我错了,请纠正我,通过使用“armeabi-v7a”,所有 64 位设备都将运行 32 位 libflutter.so,我想它会更慢。

所以我建议flutter团队是否可以提供一种方法让我们构建一个包含32位和64位libflutter.so的apk,尽管apk的大小会更大。 (在中国,我们通常有非常快的网速,而且我们很少为无限的4G使用计划付费,而且人们通常不关心apk的大小)

在你的情况下,你可以提供标准的 32 位,一切都会好起来的,对吧?
64 位警告仅适用于 Google Play。 我相信这对中国来说不是问题。
(如果我错了,请纠正我。)

@KunalT6569我猜你说的第 3 步

第 3 步:现在打开 pubspec.yaml 并将版本从
版本:1.0.0+1 到版本:1.0.0+2

需要允许将两个 apk 文件上传到 google play 控制台,不是吗?

我还有一个问题 - 一旦两个 apk 文件都准备好了,您只需通过App releases\New Release\Browse Files部分上传它们,不是吗?

@angel1st是的,第 3 步是必需的,因为Google Play不允许上传两个具有相同版本代码的 apk。

为了将多个 apk 上传到 google play,我参考了这个视频。
https://www.youtube.com/watch?v=rMl_oLlf_g0

供参考:

我们目前的计划是在未来 10 天左右使用最近的开发版本之一发布测试版。 然后,我们的计划是等到我们有一个更新的文档化流程来说明如何在 Android 上发布不会触发 Play 商店中关于 64 位构建的警告,有一种方法来打包支持 64 位的 APK,并证明我们可以使用该流程发布图库,一旦我们这样做了,就按照流程发布新的测试版,然后我们将在一周左右后将其推向稳定版。

这意味着我们可能会在 6 月初发布测试版,并在 6 月下旬或 7 月初发布测试版,此后不久将进入稳定状态。

@Hixie这里出现了另一个问题
最新 flutter 的应用程序包(截至目前主)未生成 x86 、 x86_64 版本
master 分支生成的文件
WinRAR_2019-05-30_02-55-34

旧版本使用 android studio 生成的文件
WinRAR_2019-05-30_03-03-15

预期行为是在新版本生成的文件中包含 x86 、 x86_64 版本

@canewsin独立这个问题,我们不提供的x86版本的二进制文件(https://github.com/flutter/flutter/issues/9253) -是“老版”在https://github.com/flutter/ flutter/issues/18494#issuecomment -497118805 指的是调试版本?

我有同样的问题,为 32 位构建将排除 64 位设备,但它可以在它们上运行。 通过指定--target-platform android-arm64为 64 构建适用于 64 位设备,但在 32 位设备上崩溃。 此外,谷歌将在 2019 年将 apk 的上传限制为 64 位。

Flutter 团队,请解决这个基本问题!

默认配置{
....
版本名称 flutterVersionName
ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
}
// 准备好!

我用最新的 flutter master 分支编译了我的应用程序,并作为应用程序包上传到 Play 商店,但应用程序在设备上崩溃了这个日志来自测试实验室

05-31 07:50:28.384: D/AndroidRuntime(11036): --------- beginning of crash
05-31 07:50:28.384: E/AndroidRuntime(11036): FATAL EXCEPTION: main
05-31 07:50:28.384: E/AndroidRuntime(11036): Process: in.canews.social, PID: 11036
05-31 07:50:28.384: E/AndroidRuntime(11036): java.lang.RuntimeException: Unable to create application in.canews.social.App: java.lang.NullPointerException: Attempt to get length of null array
05-31 07:50:28.384: E/AndroidRuntime(11036):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5794)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at android.app.ActivityThread.-wrap1(Unknown Source:0)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at android.os.Handler.dispatchMessage(Handler.java:105)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at android.os.Looper.loop(Looper.java:164)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at android.app.ActivityThread.main(ActivityThread.java:6541)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at java.lang.reflect.Method.invoke(Native Method)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
05-31 07:50:28.384: E/AndroidRuntime(11036): Caused by: java.lang.NullPointerException: Attempt to get length of null array
05-31 07:50:28.384: E/AndroidRuntime(11036):    at io.flutter.view.FlutterMain.listLibs(FlutterMain.java:381)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at io.flutter.view.FlutterMain.initAot(FlutterMain.java:412)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at io.flutter.view.FlutterMain.startInitialization(FlutterMain.java:164)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at io.flutter.view.FlutterMain.startInitialization(FlutterMain.java:143)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at io.flutter.app.FlutterApplication.onCreate(FlutterApplication.java:22)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1118)
05-31 07:50:28.384: E/AndroidRuntime(11036):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5791)
05-31 07:50:28.384: E/AndroidRuntime(11036):    ... 8 more
05-31 07:50:28.392: W/ActivityManager(897):   Force finishing activity in.canews.social/.MainActivity

颤振医生 -v

C:\flutter\flutter\bin>flutter doctor -v
[√] Flutter (Channel master, v1.6.7-pre.7, on Microsoft Windows [Version 10.0.17763.503], locale en-IN)
    • Flutter version 1.6.7-pre.7 at C:\flutter\flutter
    • Framework revision 6884146925 (2 days ago), 2019-05-29 12:52:05 -0700
    • Engine revision 8dc3a4cde2
    • Dart version 2.3.2 (build 2.3.2-dev.0.0 e3edfd36b2)


[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at C:\Users\PramUkesh\AppData\Local\Android\sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b01)
    • All Android licenses accepted.

[√] Android Studio (version 3.4)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 35.3.1
    • Dart plugin version 183.6270
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1343-b01)

[√] VS Code (version 1.34.0)
    • VS Code at C:\Users\PramUkesh\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.0.2

[√] Connected device (1 available)
    • Z2 Plus • 2e9087c2 • android-arm64 • Android 9 (API 28)

• No issues found!

@canewsin看起来这个问题已在https://github.com/flutter/engine/pull/9078中修复git fetch upstream && git merge upstream/master

在看到重复的问题后,这些问题已经在之前的评论中得到了回答,我写了一篇简短的文章,记录了我们现在有哪些选择https://medium.com/@truongsinh/flutter -android-64-bit-so-what-the-fuss -15da6f8e3a46。 这是 TLDR:
1_Awm6pB8jR3wGdHMC4DsatQ

@truongsinh ,我们还最终确定支持使用flutter build appbundle构建包含 32 位和 64 位二进制文​​件的应用程序包,以部署到 Play 商店。 有关更多信息,请参阅https://github.com/flutter/flutter/issues/31922 - 请尝试一下,如果您遇到任何问题,请告诉我们。

@truongsinh ,我们还最终确定支持使用flutter build appbundle构建包含 32 位和 64 位二进制文​​件的应用程序包,以部署到 Play 商店。 有关更多信息,请参阅 #31922 - 请尝试一下,如果遇到任何问题,请告诉我们。

是的,我仍在等待flutter build appbundle生成不会卡住或崩溃的应用程序:D

是的,我仍在等待 flutter build appbundle 来生成不会卡住或崩溃的应用程序:D

承认🙂。 如果您有一个可重现的案例,我们可以查看一下,那就太好了。 如果您愿意从 1.7.1 版本构建一个未签名的 .aab 文件并通过电子邮件 ([email protected]) 将其发送给我,我将不胜感激!

仅供参考,以下公告已发送至[email protected]有关我们的 64 位支持。

https://groups.google.com/forum/#!topic/flutter -announce/oIzwT9EDczc

我也有这个问题。

当我在 Android Studios 中构建应用程序包时,我可以在模拟器上正常加载它,但是当我从 Play 商店下载应用程序时它会崩溃

嗨,正在使用 flutter master 分支并构建应用程序包的人
如果您正在调试您的应用程序,您的应用程序运行良好
从 Play 商店下载时会遇到一些崩溃,如果发生这种情况,您已检查您的应用程序包是否在您的设备上运行,因为调试模式会生成 JIT 二进制文件,而发布模式会生成 AOT 二进制文件,目前它们的位置也不同我认为是为了正确测试您的应用程序
仅根据您的设备为特定配置从应用程序包生成 apk,并从您的设备完全卸载调试应用程序,并从应用程序包安装这个新的输出应用程序,如果它崩溃,它会在从 Play 商店下载或以其他方式下载时崩溃,希望这对其他人有帮助。 .

从 cmd 行引用从您的应用程序包输出到 APK
https://developer.android.com/studio/command-line/bundletool

仅供参考,在https://github.com/flutter/flutter/issues/31922 中可以更好地跟踪应用程序包中的崩溃

大家好,

域名注册地址:

我们已经确定了从 Play 商店下载时崩溃的问题,并正在修复,将在与上述https://github.com/flutter/flutter/issues/31922#issuecomment 中概述的相同时间范围内交付-498880614

高层解释

对于那些感兴趣的人来说,有点长的解释是,对于运行 Android Marshmallow 或更高版本的设备,Play Store 将检测打包为包含多个 ABI 的 App Bundle 的应用程序——它会以“拆分”的形式在设备上安装这些应用程序APK”。 执行此操作时,其中包含的 .so 文件不会从 APK zip 存档中提取,这与非拆分 APK 的行为不同。 由于 Flutter 引擎当前查找 .so 文件的机制假设它们是从 APK 中提取的,因此在拆分 APK 的情况下它会失败。

解决方案只是dlopen库,Android 抽象出库所在的位置(即在存档中与否)。 然而,必要的 .so 文件从来都不是真正的库——它们只是我们加载到 Dart VM 中的二进制数据块。 因此,作为其中的一部分,我们正在使它们成为 ELF 库(例如 https://github.com/dart-lang/sdk/commit/6d608fb52bc1926a73d986d73ab228b77cfb7ca2 和 https://github.com/flutter/flutter/pull/33696)。

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

将代码片段添加到 build.gradle 后出现此错误
Gradle build failed to produce an Android package.

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

将代码片段添加到 build.gradle 后出现此错误
Gradle build failed to produce an Android package.

https://developer.android.com/distribute/best-practices/develop/64-bit

有人可以解决问题吗? 我有一个关于 flutter 的应用程序,它只能在 32 位 apk 中运行,但 64 位不能运行或不安装。 我在 64 位手机上测试

@CgarciaTC请参阅https://github.com/flutter/flutter/issues/18494#issuecomment -500101807 以获取最新更新

大家好,

我们相信所有修复都已在master频道的树尖上完成。 如果您想尝试一下,方法如下:

  • flutter build appbundle

    默认情况下,App Bundle 包含您的 Dart 代码和为armeabi-v7a (32 位)和arm64-v8a (64 位)编译的 Flutter 运行时

  • flutter build apk --split-per-abi

    此命令将生成两个 APK:

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

  • flutter build apk

    这将产生一个包含为所有目标 ABI 编译的代码的胖 APK。 此类 APK 的大小将比拆分的对应物大,从而导致用户下载不适用于其设备架构的本机二进制文件。

flutter build apk --split-per-abi
此命令将生成两个 APK:
build/app/outputs/apk/release/app-armeabi-v7a-release.apk
build/app/outputs/apk/release/app-arm64-v8a-release.apk

@tvolkert - 在这个特定场景中,每个发布版本号怎么样? 据我所知,它们必须有所不同,因此我们可以将两者都上传到 Google Play。 在构建 apk 时,该部分是否以某种方式进行了管理? 如果不是,应该如何处理?

@angel1st根据https://developer.android.com/studio/build/configure-apk-splits#configure -APK-versions 中的指导,在构建 APK 时自动管理它

@tvolkert是否有关于何时登陆稳定频道的任何信息?

可以确认这在多个 android 设备上工作(切换到 master 后)。 真是救命稻草,谢谢。

@tvolkert谢谢。 有没有将其纳入 Flutter 稳定版的时间表?

@harsha973您正在认真地标记并提出与他在您的帖子上方回答 2 个帖子完全相同的问题。 不仅无知,而且处于不尊重的边缘。

@PerLycke对此表示抱歉。

我已经检查了主频道,升级了 flutter,现在我无法真正构建应用程序,使用命令:
flutter build apk --release --flavor production -t lib/main.dart
结果是:

* What went wrong:                                                                                                 
Execution failed for task ':app:transformNativeLibsWithMergeJniLibsForProductionRelease'.                          
> More than one file was found with OS independent path 'lib/armeabi-v7a/libapp.so' 

类似的 StackOverflow 问题的答案并没有真正的帮助。

@MichaelRFairhurst flutter build apk --release对我来说效果很好,所以也许 master 上的新更新也需要更新你的风味设置。

我知道这不是答案,抱歉,但至少是正确方向的一点。

修复程序何时进入测试版?

@derolf请参阅https://github.com/flutter/flutter/issues/18494#issuecomment -498880287 作为目标时间表的最新更新。

大家好,

这些修复现在在dev频道中,在v1.7.4版本或更高版本中。

在试图弄清楚这个 64 位的东西时,我遇到了与@michalsuryntequiqo相同的问题,我现在无法通过 CLI 构建任何东西。 它通过 Android Studio 构建和运行良好....
运行flutter build apk --flavor=dev -t lib/main-dev.dart

[   +3 ms] FAILURE: Build failed with an exception.
[   +1 ms] * What went wrong:
[        ] Execution failed for task ':app:transformNativeLibsWithMergeJniLibsForDevRelease'.
[        ] > More than one file was found with OS independent path 'lib/armeabi-v7a/libapp.so'
[        ] * Try:
[        ] Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
[        ] * Get more help at https://help.gradle.org
[        ] BUILD FAILED in 1m 3s
[ +370 ms] Running Gradle task 'assembleDevRelease'... (completed in 64.0s)
[   +4 ms] "flutter apk" took 69,789ms.
[        ] "flutter apk" took 69,789ms.

医生

编辑:
只是试图用8627ff433b4658195e66b9c0034902116f53d580权之前提交,并与通常的错误产生的APK Gradle build failed to produce an Android package.因为https://github.com/flutter/flutter/issues/24106

@blasten知道如何通过您的更改使其再次工作吗?

编辑2:
为此打开了新问题: https :

我今天阅读了颤振文档,我发现:

从命令行:

输入光盘
(代替与您的应用程序的目录。)
运行 flutter build apk --split-per-abi
(flutter build 命令默认为 --release。)
此命令会生成两个 APK 文件:

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

https://flutter.dev/docs/deployment/android#build -an-apk

@eugenio-tesio 在使用--split-per-abi时使用

我在文档中看到它,我想在这里发布它。 我没有测试它。
我会运行命令并没有工作。 它说:

找不到名为“split-per-abi”的选项。

运行 'flutter -h'(或 'flutter-h') 用于可用的颤振命令和选项。

扑医生:

Flutter 1.6.3 • 频道测试版 • https://github.com/flutter/flutter.git
框架 • 修订版 bc7bc94083(4 周前) • 2019-05-23 10:29:07 -0700
引擎 • 修订版 8dc3a4cde2
工具 • Dart 2.3.2(构建 2.3.2-dev.0.0 e3edfd36b2)

在 consumos_app 中运行“flutter pub upgrade”... 19,8s

跑扑医生...
医生摘要(要查看所有详细信息,请运行 flutter doctor -v):
[√] Flutter (Channel beta, v1.6.3, on Microsoft Windows [Versión 10.0.17134.829], locale es-AR)
[√] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3)
[√] Android Studio(3.4版本)
[√] IntelliJ IDEA 终极版(2019.1版)
[√] VS Code(1.26.1 版本)
[√] VS Code,64位版(1.33.1版)
[!] 连接的设备
! 没有可用的设备

我想这个功能很快就会可用。

我在文档中看到它,我想在这里发布它。 我没有测试它。
我会运行命令并没有工作。 它说:

找不到名为“split-per-abi”的选项。
运行“flutter -h”(或“flutter -h”)以获取可用的 flutter 命令和选项。

扑医生:

Flutter 1.6.3 • 频道测试版 • https://github.com/flutter/flutter.git
框架 • 修订版bc7bc94 (4 周前) • 2019-05-23 10:29:07 -0700
引擎 • 修订版 8dc3a4cde2
工具 • Dart 2.3.2(构建 2.3.2-dev.0.0 e3edfd36b2)
在 consumos_app 中运行“flutter pub upgrade”... 19,8s
跑扑医生...
医生摘要(要查看所有详细信息,请运行 flutter doctor -v):
[√] Flutter (Channel beta, v1.6.3, on Microsoft Windows [Versión 10.0.17134.829], locale es-AR)
[√] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3)
[√] Android Studio(3.4版本)
[√] IntelliJ IDEA 终极版(2019.1版)
[√] VS Code(1.26.1 版本)
[√] VS Code,64位版(1.33.1版)
[!] 连接的设备
! 没有可用的设备

我想这个功能很快就会可用。

请注意,这仅适用于dev频道/1.7.4 以上版本。 您正在运行beta频道/版本 1.6.3

我刚刚尝试过(使用 Codemagic 构建和发布),效果非常好。 谢谢!

Google 仍然抱怨我没有使用 appbundle。 鉴于此警告,发布 apk 可能没有太大意义?

我会使用 appbundle - 但这会阻止 Google 的自动测试(生成发布前报告)工作。 我应该为此开一个新问题吗?

@nohli我们更新了文档以反映有关应用程序包/APK 的最新信息: https : //flutter.dev/docs/deployment/android#building -the-app-for-release。

请随时提交有关 Google 自动化测试的问题。

我从 bundle 构建我的应用程序,但在 64 位设备上运行后说 libflutter.so 通过为 32 位设备和 64 位设备构建应用程序而丢失。 如何在单个捆绑文件中为两种架构添加 libflutter.so?

@nohli我们更新了文档以反映有关应用程序包/APK 的最新信息: https : //flutter.dev/docs/deployment/android#building -the-app-for-release。

请随时提交有关 Google 自动化测试的问题。

@blasten链接中给出的程序未在捆绑包中生成 64 位 APK。 当我上传捆绑包时,Google Play 商店有同样的错误,说您的 APK 不兼容 64 位。

@wal33d006请参阅页面顶部的免责声明 - 它仅适用于v1.7.4或更高版本(当前为 dev 或 master 频道)。

@wal33d006请参阅页面顶部的免责声明 - 它仅适用于v1.7.4或更高版本(当前为 dev 或 master 频道)。

@tvolkert我什至无法通过 dev 或 master 渠道构建我的应用程序。

这是我在 dev 或 master 频道上构建时的输出:

编译器消息:
file:///Users/waleed/.pub-cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image。 dart:199 :38: 错误:无法将参数类型“void Function(ImageInfo, bool)”分配给参数类型“ImageStreamListener”。

  • 'ImageInfo' 来自 ' package:flutter/src/painting/image_stream.dart ' ('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ')。
  • 'ImageStreamListener' 来自 ' package:flutter/src/painting/image_stream.dart ' ('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ')。
    尝试更改参数的类型,或将参数转换为“ImageStreamListener”。
    oldImageStream?.removeListener(_handleImageChanged);
    ^
    file:///Users/waleed/.pub-cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image。 dart:200 :32: 错误:无法将参数类型“void Function(ImageInfo, bool)”分配给参数类型“ImageStreamListener”。
  • 'ImageInfo' 来自 ' package:flutter/src/painting/image_stream.dart ' ('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ')。
  • 'ImageStreamListener' 来自 ' package:flutter/src/painting/image_stream.dart ' ('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ')。
    尝试更改参数的类型,或将参数转换为“ImageStreamListener”。
    _imageStream.addListener(_handleImageChanged);
    ^
    file:///Users/waleed/.pub-cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image。 dart:210 :34: 错误:无法将参数类型“void Function(ImageInfo, bool)”分配给参数类型“ImageStreamListener”。
  • 'ImageInfo' 来自 ' package:flutter/src/painting/image_stream.dart ' ('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ')。
  • 'ImageStreamListener' 来自 ' package:flutter/src/painting/image_stream.dart ' ('file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/painting/image_stream.dart ')。
    尝试更改参数的类型,或将参数转换为“ImageStreamListener”。
    _imageStream?.removeListener(_handleImageChanged);
    ^
    file:///Users/waleed/.pub-cache/hosted/pub.dartlang.org/cached_network_image-0.5.1/lib/cached_network_image。 dart:465 :31: 错误:无法将参数类型“Null Function(StringBuffer)”分配给参数类型“Iterable”功能()'。
  • “StringBuffer”来自“ dart:core ”。
  • 'Iterable' 来自 ' dart:core '。
  • “DiagnosticsNode”来自“ package:flutter/src/foundation/diagnostics.dart ”(“file:///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/foundation/diagnostics.dart” ')。
    尝试更改参数的类型,或将参数强制转换为 'Iterable功能()'。
    信息收集器:(字符串缓冲区信息){
    ^
    编译器意外终止。

FAILURE:构建失败,出现异常。

  • 在哪里:
    脚本'/Users/waleed/Developer/flutter-sdk/flutter/packages/flutter_tools/gradle/flutter.gradle'行:638

  • 什么地方出了错:
    任务“: app:compileflutterBuildReleaseArm ”执行失败。

    进程'命令'/Users/waleed/Developer/flutter-sdk/flutter/bin/flutter'' 以非零退出值 1 结束

  • 尝试:
    使用 --stacktrace 选项运行以获取堆栈跟踪。 使用 --info 或 --debug 选项运行以获得更多日志输出。 使用 --scan 运行以获得完整的见解。

  • https://help.gradle.org获取更多帮助

在 14 秒内构建失败
正在运行 Gradle 任务“bundleRelease”...
运行 Gradle 任务 'bundleRelease'... 完成 15.0s
Gradle 任务 bundleRelease 失败,退出代码为 1

@wal33d006 package:cached_network_image现在是0.8.0 ,您使用的是0.5.1 -- 看起来在针对较新版本的 Flutter 运行时,您需要更新版本约束你的pubspec.yamlflutter packages upgrade

@tvolkert你是说在v1.7.4文件libflutter.so自动当我们使用命令扑构建的appbundle打造束增加了64位设备?

@nimesh1997是的,尽管使其稳定的构建可能是更新的版本。

@tvolkert我将频道更改为 ### 主频道,并通过在 pubspec.yaml 内部更改将 ### package:cached_network_image 版本升级到 0.8.0。 但是在运行 flutter 包升级时。 错误如下所示:
**因为cached_network_image >=0.7.0 依赖于flutter_cache_manager ^0.3.2 依赖path_provider ^0.5.0+1,cached_network_image >=0.7.0 需要path_provider ^0.5.0+1。

@nimesh1997你能提出一个单独的问题并抄送给我吗? 有数百人订阅了这个错误。

@tvolkert 1.7.4 版

这是我在 flutter v1.7.4 或更高版本上运行时得到的输出

编译器消息:
file:///home/zunroof-dev-4/package_flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_image-1.0.0/lib/network。 飞镖:75 :31:
错误:无法将参数类型“Null Function(StringBuffer)”分配给参数类型“Iterable”功能()'。

  • “StringBuffer”来自“ dart:core ”。
  • 'Iterable' 来自 ' dart:core '。
  • 'DiagnosticsNode' 来自 ' package:flutter/src/foundation/diagnostics.dart ' ('file:///home/zunroof-dev-4/package_flutter/flutter/packages/flutter/lib/src/foundation/diagnostics.dart ')。
    尝试更改参数的类型,或将参数强制转换为 'Iterable功能()'。
    信息收集器:(字符串缓冲区信息){
    ^
    file:///home/zunroof-dev-4/package_flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_image-1.0.0/lib/network。 dart:168 :65: 错误:无法将参数类型“String”分配给参数类型“DiagnosticsNode”。
  • 'DiagnosticsNode' 来自 ' package:flutter/src/foundation/diagnostics.dart ' ('file:///home/zunroof-dev-4/package_flutter/flutter/packages/flutter/lib/src/foundation/diagnostics.dart ')。
    尝试更改参数的类型,或将参数转换为“DiagnosticsNode”。
    上下文:'$runtimeType 无法加载 ${instructions.uri}',
    ^
    编译器意外终止。

编译出错,不生成日志,flutter doctor -v 不指向错误。 我该怎么办?

如果您要将应用部署到 Play 商店,建议使用 app
捆绑或拆分 APK 以减小 APK 大小。
要生成应用程序包,请运行:
flutter build appbundle --target-platform android-arm,android-arm64
了解更多: https :
要按 ABI 拆分 APK,请运行:
颤振构建 apk --target-platform android-arm,android-arm64
--split-per-abi
了解更多:
https://developer.android.com/studio/build/configure-apk-splits#configur
e-abi-split
初始化 gradle... 7,4s
解决依赖关系... 4,3s
不推荐使用 registerResGeneratingTask,使用 registerGeneratedResFolders(FileCollection)
不推荐使用 registerResGeneratingTask,使用 registerGeneratedResFolders(FileCollection)
不推荐使用 registerResGeneratingTask,使用 registerGeneratedResFolders(FileCollection)
正在运行 Gradle 任务 'assembleRelease'...
运行 Gradle 任务 'assembleRelease'... 完成 9,0s

Gradle 构建未能生成 Android 包。

@leonardop21试试

颤动运行 -v

@canewsin

我的天啊。 我不知道现在该怎么办

Gradle 构建未能生成 Android 包。

0 throwToolExit (包:flutter_tools/src/base/common.dart:28:3)

1 _buildGradleProjectV2

(包:flutter_tools/src/android/gradle.dart:514:7)

2 _asyncThenWrapperHelper。

(dart:async-patch/async_patch.dart:77:64)

3 _rootRunUnary (dart:async/zone.dart:1132:38)

4 _CustomZone.runUnary (dart:async/zone.dart:1029:19)

5 _FutureListener.handleValue (dart:async/future_impl.dart:126:18)

6 Future._propagateToListeners.handleValueCallback

(dart:async/future_impl.dart:639:45)

7 Future._propagateToListeners (dart:async/future_impl.dart:668:32)

8 Future._complete (dart:async/future_impl.dart:473:7)

9 _SyncCompleter.complete (dart:async/future_impl.dart:51:12)

10 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:28:18)

11 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:294:13)

12 runCommandAndStreamOutput (package:flutter_tools/src/base/process.dart)

13 _asyncThenWrapperHelper。

(dart:async-patch/async_patch.dart:77:64)

14 _rootRunUnary (dart:async/zone.dart:1132:38)

15 _CustomZone.runUnary (dart:async/zone.dart:1029:19)

16 _FutureListener.handleValue (dart:async/future_impl.dart:126:18)

17 Future._propagateToListeners.handleValueCallback

(dart:async/future_impl.dart:639:45)

18 Future._propagateToListeners (dart:async/future_impl.dart:668:32)

19 Future._completeWithValue (dart:async/future_impl.dart:483:5)

20 Future._asyncComplete。

(dart:async/future_impl.dart:513:7)

21 _rootRun (dart:async/zone.dart:1124:13)

22 _CustomZone.run (dart:async/zone.dart:1021:19)

23 _CustomZone.runGuarded (dart:async/zone.dart:923:7)

24 _CustomZone.bindCallbackGuarded。

(dart:async/zone.dart:963:23)

25 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)

26 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

27 _runPendingImmediateCallback

(dart:isolate-patch/isolate_patch.dart:116:13)

28 _RawReceivePortImpl._handleMessage

(dart:isolate-patch/isolate_patch.dart:173:5)

我们更新了我们的文档,以说明如何使用 32 位和 64 位二进制文​​件构建 APK。 https://flutter.dev/docs/deployment/android#building -the-app-for-release 。

请使用dev频道: v1.7.9或以上。 该团队正在努力在本周五(2019 年 6 月 28 日)之前宣传 Beta 版的最新变化。

编译器消息:
file:///Users/systemgnk/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/flare_flutter-1.5.2/lib/flare。 dart:1033 :18: 错误:无法将参数类型“Int32List”分配给参数类型“Uint16List”。

  • “Int32List”来自“ dart:typed_data ”。
  • “Uint16List”来自“dart:typed_data”。
    尝试更改参数的类型,或将参数转换为“Uint16List”。
    索引:_indices,纹理坐标:_uvBuffer);
    ^
    编译器意外终止。

FAILURE:构建失败,出现异常。

  • 在哪里:
    脚本“/Users/systemgnk/Desktop/flutter/packages/flutter_tools/gradle/flutter.gradle”行:631

  • 什么地方出了错:
    任务“: app:compileflutterBuildReleaseArm ”执行失败。

    进程 'command'/Users/systemgnk/Desktop/flutter/bin/flutter'' 以非零退出值 1 结束

  • 尝试:
    使用 --stacktrace 选项运行以获取堆栈跟踪。 使用 --info 或 --debug 选项运行以获得更多日志输出。 使用 --scan 运行以获得完整的见解。

  • https://help.gradle.org获取更多帮助

在 22 秒内构建失败
正在运行 Gradle 任务 'assembleRelease'...
运行 Gradle 任务 'assembleRelease'... 完成 23.3 秒
Gradle 任务 assembleRelease 失败,退出代码为 1

[✓] Flutter (Channel dev, v1.7.10, on Mac OS X 10.13.6 17G65, locale en-US)
• Flutter 1.7.10 版位于 /Users/systemgnk/Desktop/flutter
• 框架修订 9a3a7490c8(2 天前),2019-06-25 15:59:15 +0200
• 引擎修订版 ae8e6d9f46
• Dart 版本 2.4.0

[✓] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3)
• Android SDK 位于 /Users/systemgnk/Library/Android/sdk
• 未配置 Android NDK 位置(可选;对于本机分析支持很有用)
• 平台 android-28,构建工具 28.0.3
• Java 二进制文件位于:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java 版 OpenJDK 运行时环境(构建 1.8.0_152-release-1248-b01)
• 接受所有Android 许可证。

[✓] Xcode - 为 iOS 和 macOS 开发 (Xcode 10.1)
• Xcode 位于 /Applications/Xcode.app/Contents/Developer
• Xcode 10.1,构建版本 10B61
• CocoaPods 1.6.0 版

[✓] iOS 工具 - 为 iOS 设备开发
• ios 部署 1.9.4

[✓] Chrome - 为网络开发
• Chrome 位于 /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio(3.3 版)
• Android Studio 位于 /Applications/Android Studio.app/Contents
• Flutter 插件版本 33.3.1
• Dart 插件版本 182.5215
• Java 版 OpenJDK 运行时环境(构建 1.8.0_152-release-1248-b01)

[✓] 已连接设备(4 个可用)
• 为 x86 构建的 Android SDK • emulator-5554 • android-x86 • Android 7.0 (API 24)(模拟器)
• 系统的 iPhone • 73145c33ee6d180a2db3d4a96b908ceb4c49065b • ios • iOS 12.3.1
• macOS • macOS • darwin-x64 • Mac OS X 10.13.6 17G65
• Chrome • chrome • web-javascript • Google Chrome 75.0.3770.100

• 未发现问题!

我仍然遇到构建 apk 的问题。
我只能在稳定频道中构建 32 位 apk。

我想我需要等到 flutter 团队修复这个错误,而不是使用 dev 或 master channel sdk。

谢谢你。

@JaeyoungChu参考 2d-inc/Flare-Flutter#79

@ctrysbita感谢您的链接。 我将频道更改为 master 并将 _indices 的类型从 Int32List 更改为 Uint16List。
在 Play 商店上传的 apk 没有针对 64 位的警告,并且在从 Play 商店测试页面安装后正在运行。

我在开发频道 flutter sdk 方面还有其他问题,例如没有弹出位置的权限对话框,谷歌地图没有显示在 ios 中,也无法通过 http(缓存的网络图像)显示大图像文件。 由于开发渠道,这些问题不确定,但是当我恢复稳定并再次构建时,所有问题都消失了。 我没有太多时间来挖掘这个问题,所以不是 100% 确定。 对此很抱歉,但也许有人会从这个问题中得到暗示。

这是我的解决方案:

  1. app gradle
splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }
  1. 运行flutter build apk --release --target-platform=android-arm
  2. app-armeabi-v7a-release.apk上传到 Play 商店
  3. 增加versionCode
  4. 运行flutter build apk --release --target-platform=android-arm64
  5. app-arm64-v8a-release.apk上传到 Play 商店

Google Play 商店将根据设备架构为 App 提供服务。 32 位设备很高兴,64 位设备很高兴,我很高兴知道我的 APK 大小仍然相对较小,同时仍然可以为两种架构提供服务。

如果我们在同一个 APK 中包含对这两种架构的支持,则您的应用程序的大小预计为 10MB 以上

在哪里? 我们在哪里将 splits 部分添加到 gradle 文件中? 我在 flutter {} 和 dependencies {} 之间添加了它,它不会像它所说的那样构建第一个 APK:

请检查您在 android/ 文件夹中的 Gradle 项目设置。

很明显这是不对的,因为这是自上次构建以来我对项目所做的唯一更改。

@ArtfulDodgerB92感谢您的解决方案。 您使用哪个渠道来构建 apk 和版本?

在哪里? 我们在哪里将 splits 部分添加到 gradle 文件中? 我在 flutter {} 和 dependencies {} 之间添加了它,它不会像它所说的那样构建第一个 APK:

请检查您在 android/ 文件夹中的 Gradle 项目设置。

很明显这是不对的,因为这是自上次构建以来我对项目所做的唯一更改。

@ArtfulDodgerB92它应该在android{}部分,如下所示: https :

仅供参考,以下公告已发送至[email protected]有关我们的 64 位支持。

https://groups.google.com/forum/#!topic/flutter -announce/oIzwT9EDczc

关于即将发布的测试版的任何消息?

@nohli我们将测试版发布推迟了几天,以修复(恢复提交)到https://github.com/flutter/flutter/issues/35291。 我们正在努力尽快发布测试版。

现在在测试版频道上直播,发布v1.7.8+hotfix.2

现在在测试版频道上直播,发布v1.7.8+hotfix.2

Сool 如何生成发行版apk?

现在在测试版频道上直播,发布v1.7.8+hotfix.2

Сool 如何生成发行版apk?

这是指令https://flutter.dev/docs/deployment/android

现在在测试版频道上直播,发布v1.7.8+hotfix.2

Сool 如何生成发行版apk?

这是指令https://flutter.dev/docs/deployment/android

我试过但没有在 32 岁时工作

我试过但没有在 32 岁时工作

你所说的32是什么意思? 就像“我可以生成一个胖 apk,并且该 apk 在 64 位设备上运行,但在 32 位设备上崩溃”?

你能发布flutter doctor的结果吗,你的一步一步(例如,这是 progard https://flutter.dev/docs/deployment/android#step-2---enable- obfuscation-andor-minification),您是生成 APK 还是 AAB,您正在测试哪个设备?

我们还需要把
在测试版修复后不再需要gradle中的ndk { abiFilters 'armeabi-v7a' , 'x86', 'armeabi' }

@ksamj不需要。

我试过但没有在 32 岁时工作

你所说的32是什么意思? 就像“我可以生成一个胖 apk,并且该 apk 在 64 位设备上运行,但在 32 位设备上崩溃”?

你能发布flutter doctor的结果吗,你的一步一步(例如,这是 progard https://flutter.dev/docs/deployment/android#step-2---enable- obfuscation-andor-minification),您是生成 APK 还是 AAB,您正在测试哪个设备?

医生摘要(要查看所有详细信息,请运行 flutter doctor -v):
[✓] Flutter (Channel beta, v1.7.8+hotfix.2, on Mac OS X 10.14.5 18F132, locale ru-RU)

[✓] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3)
[✓] Xcode - 为 iOS 和 macOS 开发 (Xcode 10.2.1)
[✓] iOS 工具 - 为 iOS 设备开发
[✓] Android Studio(3.4 版)
[✓] 已连接设备(1 个可用)

• 未发现问题!

医生摘要(要查看所有详细信息,请运行 flutter doctor -v):
[✓] Flutter (Channel beta, v1.7.8+hotfix.2, on Mac OS X 10.14.5 18F132, locale ru-RU)

[✓] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3)
[✓] Xcode - 为 iOS 和 macOS 开发 (Xcode 10.2.1)
[✓] iOS 工具 - 为 iOS 设备开发
[✓] Android Studio(3.4 版)
[✓] 已连接设备(1 个可用)

• 未发现问题!
医生摘要(要查看所有详细信息,请运行 flutter doctor -v):
[✓] Flutter (Channel beta, v1.7.8+hotfix.2, on Mac OS X 10.14.5 18F132, locale ru-RU)

[✓] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3)
[✓] Xcode - 为 iOS 和 macOS 开发 (Xcode 10.2.1)
[✓] iOS 工具 - 为 iOS 设备开发
[✓] Android Studio(3.4 版)
[✓] 已连接设备(1 个可用)

• 未发现问题!
构建apk
我按照说明做了一切,但它没有安装在 32 位上

我按照说明做了一切,但它没有安装在 32 位上

任何屏幕截图/日志显示在 32 位设备上安装 32 位 apk 不成功,那是什么设备型号?

大家好,

v1.7.8+hotfix.2已发布到稳定频道,因此此修复现已在所有频道中可用。 感谢大家一路以来的耐心和帮助!

我按照说明做了一切,但它没有安装在 32 位上

任何屏幕截图/日志显示在 32 位设备上安装 32 位 apk 不成功,那是什么设备型号?

感谢您的帮助,我尝试构建 appbundle 并且它工作正常。

@tvolkert同样的问题,请检查。 https://github.com/flutter/flutter/issues/31962#issuecomment -509458960

@nimesh1997这个问题与这个问题无关。 如果您没有发现链接问题中提供的答案有帮助,也许您可​​以查看针对您的问题发布 Stackoverflow 问题。

@tvolkert - 只是为了澄清 - 上述修补程序可用于根据flutter docs 说明构建单独的 apk,对吗?
因此,不需要像之前的部分解决方案中描述的那样在 gradle 文件中进行任何其他更改
感谢您和团队其他成员出色的工作和准时交货!

我刚刚用最新的修补程序编译了我的应用程序之一。 因此,编译后的app-production-armeabi-v7a-release.apk无法在 Galaxy S3 mini (Android OS 4.1.2) 上运行 - 在启动画面后,应用程序会在没有任何通知的情况下关闭。
然而,我能够在 64 部手机(例如 Galaxy S8)上成功运行相同的 apk。
这是我从命令行运行颤振的方法:

flutter build apk --target="lib/config/main_production.dart" --flavor=production --split-per-abi

这是我的flutter doctor -v

[√] Flutter (Channel stable, v1.7.8+hotfix.2, on Microsoft Windows [Version 10.0.17763.557], locale en-US)
• Flutter 1.7.8+hotfix.2 版本位于 E:\DevToolsflutter
• 框架修订 2e540931f7(7 天前),2019-07-02 09:31:07 -0700
• 引擎版本 b1cb0d9e9b
• Dart 版本 2.4.0

[√] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3)
• Android SDK 位于 E:\DevTools\Android\Sdk
• 未配置 Android NDK 位置(可选;对于本机分析支持很有用)
• 平台 android-28,构建工具 28.0.3
• ANDROID_SDK_ROOT = E:\DevTools\Android\Sdk
• Java 二进制文件位于:E:\DevTools\android-studio\jre\bin\java
• Java 版 OpenJDK 运行时环境(构建 1.8.0_152-release-1343-b01)
• 接受所有Android 许可证。

[√] Android Studio(3.4版本)
• 位于 E:\DevTools\android-studio 的 Android Studio
• Flutter 插件版本 37.0.1
• Dart 插件版本 183.6270
• Java 版 OpenJDK 运行时环境(构建 1.8.0_152-release-1343-b01)

[√] 已连接设备(1 个可用)
• 为 x86 构建的 Android SDK • emulator-5554 • android-x86 • Android 8.1.0 (API 27)(模拟器)

• 未发现问题!

此外 -apk 也无法运行 - 安装后(在同一个 arm-32 设备上)并运行它只是关闭。
请让我知道如何继续并解决问题,谢谢!

@angel1st是否可以在此处共享您的 AAB 和/或 APK 文件,以便我们帮助您进行故障排除?

@truongsinh - 当然,他们在这里:

app-production-releases.zip

我已经上传了两个 APK,不过,所谓的问题是上述 arm-32 版本。

伙计们,在此期间,如果您没有 arm-64 版本的应用程序,会不会有人这么好心并告诉(如果他们知道)8 月 1 日之后在 Google Play 商店中会发生什么-apk 会停止吗?服务于 arm64 设备,否则您将无法上传仅 arm32 版本或两者?

@angel1st我能够在 Android 4.4.2 Galaxy S4 上运行该应用程序 (app-production-armeabi-v7a-release.apk)。 不错的应用程序!

我怀疑这是针对 Galaxy S3 mini/Android OS 4.1.2 的。 同时,我请求此配置以查看是否可以重现该问题。

@angel1st这是信息最丰富的来源: https : //android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html

要求 [64 位内容] 不适用于:

  • 明确针对 Wear OS 或 Android TV 的 APK 或应用程序包,这些外形规格目前不支持 64 位代码。
  • 未分发到运行 Android 9 Pie 或更高版本的设备的 APK 或应用程序包。

从 2019 年 8 月 1 日开始:

  • 所有包含本机代码的新应用和应用更新在发布到 Google Play 时都需要提供 64 位版本和 32 位版本。

换句话说,应用程序会继续分发,但您不能上传现有应用程序的新版本,或在不合规的情况下发布新应用程序。

@angel1st我能够在运行 Android OS 4.1.2 的 Galaxy S3 mini 上重现这个问题。

logcat 是:

[ERROR:flutter/fml/platform/posix/native_library_posix.cc(16)] Could not open library 'libapp.so' due to error 'Cannot load library: load_library[1093]: Library 'libapp.so' not found'.
07-10 00:16:50.298 8739-8739/? E/flutter: [ERROR:flutter/fml/platform/posix/native_library_posix.cc(16)] Could not open library 'libapp.so' due to error 'Cannot load library: load_library[1093]: Library 'libapp.so' not found'.
07-10 00:16:50.298 8739-8739/? E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
07-10 00:16:50.298 8739-8739/? E/flutter: [ERROR:flutter/runtime/dart_vm.cc(238)] Could not setup VM data to bootstrap the VM from.
07-10 00:16:50.298 8739-8739/? E/flutter: [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
07-10 00:16:50.298 8739-8739/? A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.

我同时提交了https://github.com/flutter/flutter/issues/35838

抄送@杰森西蒙斯

@truongsinh - 感谢您的概述。

@blasten - 感谢您的及时反馈。 据我所知,我无法在 ATM 上做任何事情,只能用手指交叉监控 #35838 它会在本月的某个时候解决吗? 我相信使用最新热修复程序编译的任何其他适用于 Android 4.1.2 的 apk 都会出现同样的问题吗?
仅供参考 - 使用以前的 flutter 稳定版本编译的应用程序 apk 没有这个问题(Android 4.1.2 的 S3 mini 是我的测试设备之一)。

其他人今天收到了来自谷歌的邮件,说

“需要采取的措施:在 2019 年 8 月 1 日之前将您的应用更新为 64 位兼容”

虽然已经发布了 32 位和 64 位版本?

它说

到 2019 年 8 月 1 日,所有使用本机代码的应用都必须提供 64 位版本才能发布更新。 在发送这封电子邮件时,您至少有一个应用*不符合要求

*注意:此应用列表反映了 Google 在发送此电子邮件时的最佳估计。 (...)

我猜,谷歌的“最佳估计”不正确?

感谢 Flutter 团队。 我升级 Flutter 并建立在稳定的频道上,警告消失了。
希望测试人员不会有错误,但到目前为止我还没有在真实设备上发现任何错误!

感谢 Flutter 团队,使用修补程序升级 Flutter 修复了构建 .aab 时的此问题

感谢 flutter 团队取得这一成就。 现在继续编程!

@angel1st我在某些三星设备上也遇到了问题。

https://github.com/flutter/flutter/issues/36128

@abdullayev007 - 谢谢! 我建议你看看#35838,它可能有某种关联。

我按照说明做了一切,但它没有安装在 32 位上

任何屏幕截图/日志显示在 32 位设备上安装 32 位 apk 不成功,那是什么设备型号?
IMG-20190710-WA0000

设备是三星M10

@tvolkert请给我任何解决以下问题的解决方案:
https://github.com/flutter/flutter/issues/36063

谢谢

我尝试了来自开发频道的最新版本的 flutter - v1.8.4。 我也创建了一个新项目 - vanilla flutter 项目并尝试从中构建一个发布签名版本。 它构建和应用程序大小仅为 10.4 mb。 但是在这条线索中尝试了上述所有步骤,没有任何帮助。 有人可以给出一组清晰的步骤序列来进行构建,我们可以使用 aab 或 apk 将模拟器和本地设备从 flutter 推送到 Playstore。 已经一个多星期了,我们在 flutter 上构建的项目没有转移到 android 上的 prod,但我们能够发布到 ios 上的 appstore。 一些帮助会很好。

`[✓] Flutter (Channel dev, v1.8.4, on Mac OS X 10.14.5, locale en-US)
• Flutter 1.8.4 版位于 /Users/muthu/muthu/devapps/flutter
• 框架修订 954714c967(7 天前),2019-08-02 10:10:39 -0700
• 引擎修订版 26368225b5
• Dart 版本 2.5.0(构建 2.5.0-dev.1.0 bd049f5b53)

[!] Android 工具链 - 为 Android 设备开发(Android SDK 版本 29.0.1)
• Android SDK 位于 ../Library/Android/sdk
• 未配置 Android NDK 位置(可选;对于本机分析支持很有用)
• 平台 android-29,构建工具 29.0.1
• Java 二进制文件位于:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java 版 OpenJDK 运行时环境(构建 1.8.0_152-release-1343-b01)
✗ Android 许可证状态未知。
尝试重新安装或更新您的 Android SDK 管理器。
请参阅https://developer.android.com/studio/#downloads或访问https://flutter.dev/setup/#android -setup
有关详细说明。

[✓] Xcode - 为 iOS 和 macOS 开发 (Xcode 10.3)
• Xcode 位于 /Applications/Xcode.app/Contents/Developer
• Xcode 10.3,构建版本 10G8
• CocoaPods 1.7.3 版

[✓] Android Studio(3.4 版)
• Android Studio 位于 /Applications/Android Studio.app/Contents
• Flutter 插件版本 38.2.1
• Dart 插件版本 183.6270
• Java 版 OpenJDK 运行时环境(构建 1.8.0_152-release-1343-b01)

[✓] VS 代码(1.36.1 版)
• VS Code 位于 /Applications/Visual Studio Code.app/Contents
• Flutter 扩展版本 3.3.0

[✓] 已连接设备(3 个可用)
• 为 x86 构建的 Android SDK • emulator-5554 • android-x86 • Android 9 (API 28)
(模拟器)`

@muthufmass ,请提交一个新问题,详细说明什么不起作用以及如何重现失败。 谢谢!

有人可以给出一组明确的步骤序列来进行构建,我们可以将其推送到 Playstore

https://flutter.dev/docs/deployment/android

有人可以给出一组明确的步骤序列来进行构建,我们可以将其推送到 Playstore

https://flutter.dev/docs/deployment/android

已经遵循了这些步骤,它不适用于 prod 版本构建。 调试构建有效! 我清楚地发现了一个区别,在调试版本中,存在 flutter 的 .so 文件,但不包含发布版本。 这些就是将 apk 安装到模拟器或带有签名 apk 的设备的问题。

@muthufmass ,请提交一个新问题,详细说明什么不起作用以及如何重现失败。 谢谢!

我希望我在上面分享了明确的步骤。 使用 flutter create 创建全新的应用程序 - 带有最新 flutter sdk 的香草代码。 无法构建发布版本,而调试版本运行流畅。 prod 和 dev 版本的 apk 在大小上存在显着差异。 尝试了以上所有步骤,无法构建运行的发布版本。 构建发生得非常快,发布时文件不到 11 mb,而调试 apk 大约 40 mb+。 调试 apk 有效,而 prod 发布签名的 apk 甚至不安装。

Screen Shot 2019-08-09 at 8 29 12 PM

@muthufmass在您提交新问题时,请包括 Android SDK 版本、设备型号、医生输出以及从flutter create开始的步骤。

@muthufmass以及 adb logcat 输出。

此问题已关闭 - 请提交一个新问题,以便我们可以正确跟踪它。

如果您的项目中有风味,并且想要同时支持 x64 和 x32,只需将 jniLibs 文件夹添加到您的风味文件夹中,它就很好用,就像这样
image

我怎样才能在 adobe animate cc 中做到这一点
需要更多信息

由于各种警告,Google Play 控制台最近开始禁用推出按钮。 其中一个警告是使用 apk 而不是 .aab 文件。 如果项目是在Android Studio 或Unity 中创建的,则有制作.aab 文件的解决方案。 但是如果 apk 是由 Animate CC 或 Haxe/Flash Develop 创建的呢? 有什么办法可以转换吗?

@newapproach我不清楚你的评论是否与 Flutter 有任何关系? 你愿意提交一个包含更多细节的新问题吗? 谢谢!

有同样的问题 - 但 flutter.so 未包含在“armeabi-v7a 文件夹中。
只有 x86 和 armeabi-v7a 的第三方库 - 但没有 arm64。
只想为“armeabi-v7a with
ndk{
abiFilters "armeabi-v7a" // 也不起作用 "armeabi", "x86",
}
并按照@mravn-google 向android-arm 的建议设置为目标平台。

没有指定 arch 且不包含库的 APK
screen shot 2018-07-26 at 21 06 53

带有库但没有 arm 规范的 APK
screen shot 2018-07-26 at 21 10 30

具有指定 arch 和包含库的 APK
screen shot 2018-07-26 at 21 12 58

任何建议如何调试进一步的步骤?

我也发现了这个错误,解决了吗?? 可以帮我吗?

我建议在 Stack Overflow 上询问,或者打开一个新的错误。 我怀疑这个关闭的错误是否适合人们帮助您解决上述问题。 谢谢!

这是我的解决方案:

  1. app gradle
splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true
            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for armeabi-v7a and arm64-v8a.

            // Resets the list of ABIs that Gradle should create APKs for to none.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "armeabi-v7a", "arm64-v8a"

            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }
  1. 运行flutter build apk --release --target-platform=android-arm
  2. app-armeabi-v7a-release.apk上传到 Play 商店
  3. 增加versionCode
  4. 运行flutter build apk --release --target-platform=android-arm64
  5. app-arm64-v8a-release.apk上传到 Play 商店

Google Play 商店将根据设备架构为 App 提供服务。 32 位设备很高兴,64 位设备很高兴,我很高兴知道我的 APK 大小仍然相对较小,同时仍然可以为两种架构提供服务。

如果我们在同一个 APK 中包含对这两种架构的支持,则您的应用程序的大小预计为 10MB 以上

不起作用..当我在像素 2 的 Playstore 上查看它时,它说此设备不支持

它确实有效,许多知名应用程序一直以这种方式部署多个 APK,并让 Play 商店为适当的设备提供适当的应用程序很长时间。

不过,应用程序包是实现此目的的现代方式。

它确实有效,许多知名应用程序一直以这种方式部署多个 APK,并让 Play 商店为适当的设备提供适当的应用程序很长时间。

不过,应用程序包是实现此目的的现代方式。

我不知道为什么它没有出现在我的 Pixel 2 Playstore 上......我完全按照,两次,以防万一..
我使用了应用程序包,但我的应用程序崩溃了,因此我正在寻找替代方案

由于关闭后没有任何近期活动,因此该线程已自动锁定。 如果您仍然遇到类似的问题,请打开一个新的错误,包括flutter doctor -v的输出和问题的最小重现。

此页面是否有帮助?
0 / 5 - 0 等级