Flutter: Поддержка APK с 32-битными и 64-битными бинарными файлами в них

Созданный на 15 июн. 2018  ·  286Комментарии  ·  Источник: flutter/flutter

используя flutter build apk --release --flavor pro make apk файл, но arm64-v8a не включает файл libflutter.so. поэтому запуск приложения завершился неудачно.
когда я добавляю --target-platform=android-arm64 : flutter build apk --release --flavor pro --target-platform=android-arm64 , apk-файл включается, так что летай. Но запуск приложения не удался на 32-битном процессоре.
что я могу сделать, apk файл может работать на 64 и 32 процессорах @ 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-битные устройства, хотя она работает на них. Сборка для 64 с указанием --target-platform android-arm64 работает на 64-разрядных устройствах, но дает сбой на 32-разрядных устройствах. Кроме того, в 2019 году Google ограничит загрузку файлов apks 64-разрядной версией.

Команда Flutter, пожалуйста, решите эту основную проблему!

Все 286 Комментарий

AFAIK, в настоящее время Flutter будет добавлять libflutter.so только в одну выбранную папку платформы в выпуске APK. Обходной путь, который сработал для меня, заключался в том, чтобы заставить build.gradle делать только 32-битные (исключая все 64-битные библиотеки + Intel)

release {

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

cc @Hixie

@swavkulinski, как бы вы выпустили файлы to apks в игровой магазин?

Есть такая же проблема - но flutter.so не входит в папку "armeabi-v7a".
Имеет только сторонние библиотеки для x86 и armeabi-v7a, но без arm64.
Хотел бы построить флаттер только для "armeabi-v7a с
ndk {
abiFilters "armeabi-v7a" // тоже не работают "armeabi", "x86",
}
и установите в качестве целевой платформы, как @ mravn-google предлагает для android-arm.

APK без указания арки и без библиотек
screen shot 2018-07-26 at 21 06 53

APK с библиотеками и без спецификации руки
screen shot 2018-07-26 at 21 10 30

APK с указанием арки и включенными библиотеками
screen shot 2018-07-26 at 21 12 58

Есть предложения, как отлаживать дальнейшие шаги?

@xxseabxx у меня такая же проблема

У меня та же проблема, сборка для 32-битных устройств исключает 64-битные устройства, хотя она работает на них. Сборка для 64 с указанием --target-platform android-arm64 работает на 64-разрядных устройствах, но дает сбой на 32-разрядных устройствах. Кроме того, в 2019 году Google ограничит загрузку файлов apks 64-разрядной версией.

Команда Flutter, пожалуйста, решите эту основную проблему!

Команда Flutter, пожалуйста, решите эту основную проблему!

Так что я ошибаюсь, говоря, что flutter может поддерживать только релизные apk для 32 или 64 бит, но не для обоих?

Удачи здесь?

Я думаю, что комментарий xxseabxx может сработать, но я не пробовал ...

У меня такая же проблема.

Во всех своих зависимостях я изолировал по крайней мере один пакет, вызывающий проблему, и соответственно заполнил отчет об ошибке: https://github.com/azihsoyn/flutter_mlkit/issues/36

Чтобы изолировать проблему, для каждой моей зависимости / плагина:

1) Создайте пустой проект флаттера

2) Замените main.dart на

код примера пакета (например: https://pub.dartlang.org/packages/flutter_html_view#-example-tab-)

3) Обновите pubspec.yaml соответственно.

4) run (беги)

$ flutter build apk

Оказалось, что это был flutter_mlkit.

Я хочу иметь возможность ориентироваться как на 32, так и на 64 архитектуры.

Есть такая же проблема. --target-platform = android-arm64 работает для меня, но я хотел бы поддерживать 32-разрядную версию, пока Google не отключит 32-разрядную версию

Команда Flutter, пожалуйста, решите эту основную проблему!

много третьего SDK не работает, я думаю, это срочно

Я могу воспроизвести это при добавлении Mapbox в приложение для Android.

У меня такая же проблема. Я использую baiduMap в своем проекте, модель bebug в порядке, сбой выпуска.
user flutter build apk --release --target-platform = android-arm64 в моем телефоне все в порядке, но 32-разрядный телефон выйдет из строя. Команда Flutter, пожалуйста, устраните эту проблему как можно скорее.

Подобно https://github.com/azihsoyn/flutter_mlkit/issues/36 , он работает для меня, apk может работать как на 32-битном, так и на 64-битном телефоне. @ peace2knowledge

это должно быть очень важной проблемой для выпуска apk

есть ли способ решить эту проблему?

  1. извлечь 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 @ Хикси нежный удар. Я также сталкиваюсь с этим при попытке интеграции с существующим приложением, что на данный момент является нашим наиболее важным вариантом использования.

mindsdk = 21, но еще не обновил целевую платформу

@neiljaywarner поднятие большого пальца на первый комментарий было бы более эффективным для повышения приоритета

  1. извлечь 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"
            }
        }
}
    }

У меня это не сработало - он сгенерировал APK, в котором отсутствовала папка lib (и, таким образом, он был вдвое меньше моего предыдущего apk).

Мы также обнаружили, что если мы реализуем только 32-разрядное решение, которое некоторые опубликовали (например, https://medium.com/flutterpub/flutter-app-couldnt-find-libflutter-so-c95ad81cbccd), это приведет к не -производительное приложение. В частности, в одном из тестов Samsung S6 и S9 мы наблюдаем очень медленную прокрутку большого списка.

Не думаю, что проблема только в отсутствии arm64 libflutter.so .

Я попытался добавить недостающую библиотеку в APK, создав для arm64, скопировав 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 имеет libflutter.so как для armeabi-v7a, так и для arm64-v8a, но вылетает при запуске со следующей ошибкой:

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-файлов - единственное решение, которое мне подходит.

Это довольно неприятная проблема, с которой можно столкнуться после того, как потратили время на написание внешнего интерфейса во флаттере только для того, чтобы обнаружить, что выпуск не создает надлежащим образом apk.

Я столкнусь с той же проблемой, когда займусь iOS?

В какое время можно решить эту проблему?

Дело в том, что наши файлы gradle не знают, как связать все нужные биты для обоих? @ jason-simmons @cbracken может знать?

Или @FaisalAbid может?

Дело в том, что наши файлы gradle не знают, как связать все нужные биты для обоих? @ jason-simmons @cbracken может знать?

Или @FaisalAbid может?

Под правыми битами я предполагаю, что вы имеете в виду больше, чем libflutter.so, согласно этому комментарию: https://github.com/flutter/flutter/issues/18494#issuecomment -449557182

Прямо сейчас я думаю, что единственное решение - собрать 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'
            }
        }

У меня проблема в том, что теперь мне нужно загрузить два apks с разными кодами версий.
Настоящее решение этой проблемы - возможность создавать пакеты Android с несколькими целевыми платформами. Пакеты приложений в настоящее время находятся в мастере флаттера, но я не мог заставить его работать для этого

С 1 августа для игрового магазина потребуется 64-битная версия.

Предполагая, что после 1 августа все еще будут 32-битные устройства, которые захотят запускать наши приложения, как убедиться, что 32-битные И 64-битные версии включены в сборку выпуска?

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

_Все новые приложения и обновления приложений, которые включают собственный код, должны предоставлять 64-битные версии в дополнение к 32-битным версиям при публикации в Google Play._

Это требование сейчас легко удовлетворить с помощью приложений Flutter, просто создав два APK - один для 32-битных устройств и один для 64-битных устройств - и загрузив оба как часть одного выпуска. Google Play автоматически предоставит соответствующий APK на соответствующее устройство. Я делаю это, и это хорошо работает. Я согласен с другими комментаторами, что это не _идеально_, но, IMO, действительно не проблема сделать эту часть вашего рабочего процесса.

Было бы здорово, если бы это можно было исправить в ближайшее время. Подход с несколькими APK - это только временное решение, пока Flutter не создаст APK с несколькими версиями архитектуры .so, как это делают другие проекты Android.

Это требует большого количества ручных операций (коды версий, система сборки, автоматизация), плюс пакеты Android App Bundle должны были избавить разработчиков от этапов ручной сборки.

В настоящее время в этом выпуске упоминаются только 32- и 64-разрядные версии, но есть также x86, x64, плюс некоторые разработчики в Китае все еще говорят о поддержке mips.

Разве Flutter не должен поддерживать как можно больше из 7 архитектур Android с наименьшим размером apk из коробки?

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

@MarcelEdward Должен - однако, IMHO размер APK не является самым важным аспектом, учитывая, что Android теперь полностью поддерживает App Bundles (aab), и конечные пользователи все равно загрузят оптимизированную сборку для своего телефона.

Для размера APK для конкретной платформы, который должен быть как можно более оптимизированным / маленьким.

Во время разработки может быть сложно переустанавливать полноразмерный APK каждый раз, когда вы меняете собственный код. Уловка состоит в том, чтобы использовать abifilters, чтобы ограничить сборку отладки архитектурой ваших тестовых телефонов. Я не уверен, актуально ли это сейчас, учитывая, что Flutter поддерживает горячую перезагрузку.

https://github.com/flutter/flutter/issues/17829 Речь идет о наборах приложений aap, но я могу найти только 32-битную версию при компиляции с помощью apk сборки flutter

Итак, когда я понимаю Richt, мы должны создать две последовательные версии, по крайней мере, с 32 и 64 загружать их обе, а затем приложение Stroe чудесным образом построит aap, чтобы потребитель получил оптимизированную версию для своей конкретной архитектуры.

@MarcelEdward Магазин воспроизведения не создает здесь .

Вы можете увидеть хороший пример этого, взглянув на 13 вариантов Google Maps здесь (обратите внимание, что APKMirror не имеет ничего общего с этой функцией, кроме как простой способ получить список вариантов для данного приложения). Play Store предоставляет соответствующий APK из этих вариантов для вашего устройства в зависимости от его характеристик.

Если вы использовали набор приложений, вам нужно было бы загрузить пакет только один раз вместо загрузки нескольких APK, но я понимаю, что Play Store затем генерирует для вас различные варианты APK, поэтому конечный результат аналогичен, но работы меньше для вас, чтобы автоматизировать себя. (Пакеты приложений также поддерживают новые динамически загружаемые модули, но это уже другая история.)

Таким образом, похоже, что желаемая функция здесь - иметь возможность запускать flutter build с двумя аргументами --target-platform и flutter автоматически помещать обе архитектуры в APK, верно?

@Hixie - это не libflutter.so, генерируемый только один раз для каждой версии flutter и типа выпуска? В этом случае у вас будет 8 вариантов (32,64, x86, x86_64). Я думаю, что их следует просто выбирать при создании и фильтрации приложения flutter в зависимости от целевого телефона или варианта использования. Gradle может неплохо фильтровать.

Архитектура телефона - это что-то довольно низкое, я понятия не имею, какая архитектура есть у людей, которые используют наши приложения. Flutter компилирует 32-битную версию, когда архитектура не указана, поэтому я бы предположил, что 32-битная версия подходит всем. Но теперь игра store потребуется 64-битная версия в августе, поэтому, когда 32-битная версия подходит всем и требуется 64-битная версия, эти две версии должны быть включены в сборку релиза?

У меня нет телефона Android, поэтому я предполагаю, что он будет работать, когда он будет работать на симуляторе. Пока пользователи нашего приложения не заявят иное.

@ MarcelEdward2 Это не просто 32-битная

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

На данный момент Flutter по умолчанию создает APK, содержащий собственный код, скомпилированный только для armeabi-v7a. Это будет нормально работать на arm64-v8a, хотя и со снижением производительности по сравнению с тем, что скомпилировано для arm64-v8a изначально. Тем не менее, он будет работать под эмулятором ARM на x86 или x86_64, если устройство его связывает. Если на устройстве x86 / x86_64 нет эмулятора ARM, оно вообще не будет работать.

Опять же, августовское требование не требует создания одного универсального APK или AAB, содержащего обе архитектуры. Просто требуется, чтобы каждый выпускаемый вами выпуск содержал (по крайней мере) один APK, подходящий для 64-разрядных устройств. Модификации во Flutter, позволяющие создать один универсальный APK / AAB с поддержкой нескольких архитектур, были бы хороши с точки зрения рабочего процесса разработчика, но вы можете удовлетворить это требование с такими улучшениями или без них.

Отредактировано для добавления: лично я считаю, что первоклассная поддержка пакетов приложений - лучший способ улучшить ситуацию с несколькими архитектурами.

appbundle выглядит как решение в будущем ... Думаю, следующий шаг: # 29303

Насколько я понимаю, эта ошибка очень связана с переходом на .aab в качестве формата вывода по умолчанию для flutter build и включением этого .aab затем как 32-разрядных, так и 64-разрядных сборок:
https://developer.android.com/studio/projects/dynamic-delivery

Насколько я понимаю, часть этой работы, возможно, уже ведется. @dnfield может знать.

/ cc @mklim

Похоже, что .aab поможет, но, возможно, в этом нет необходимости. Проблема так проста, как просто добавить в APK 32- и 64-битные бинарные файлы arm?

А, понятно. Это потому, что нам потенциально потребуется включить снимок AOT для целевой арки. И прямо сейчас мы просто помещаем это в активы, мы не помещаем версию для каждой архитектуры в libs . Если бы мы могли поместить снимок AOT в папку библиотек для конкретной архитектуры, которая могла бы работать, в противном случае мы бы хотели использовать формат .aab по этой причине.

Мы хотим сделать это в любом случае, чтобы поддержать создание .AAR для сценариев использования add2app. Я буду тыкать в это.

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 в игровой магазин

  3. приращение versionCode

  4. запустить flutter build apk --release --target-platform=android-arm64

  5. загрузить app-arm64-v8a-release.apk в игровой магазин

Магазин Google Play будет обслуживать приложение в соответствии с архитектурой устройства. 32-битные устройства довольны, 64-битные устройства довольны, и мне приятно знать, что размер моего APK остается относительно небольшим, но при этом обслуживает обе архитектуры.

Если мы включим поддержку обеих архитектур в один и тот же APK, ожидайте, что размер вашего приложения будет не менее 10 МБ.

@ edTheGuy00 Сомневаюсь, что интересно, насколько велика загрузка в игровой магазин. Телефоны Android в любом случае будут запрашивать 125+ временного свободного места и откажутся использовать внешнее хранилище для распаковки. Это все, что пользователи будут знать о размере приложения. На самом деле не имеет значения, сколько приложение использует после установки. Он запросит 125 МБ + свободного места для установки.

Пожалуйста, дайте возможность включить все возможные архитектуры. Меня не волнует, будет ли загрузка в игровой магазин 250 МБ.

Было бы неплохо, если бы флаттер использовал гигабитное пространство на внешнем хранилище для установки на телефон Android. То есть если флаттер может повлиять на установку на андроид телефоне

Я думаю, что сценарий flutter.gradle должен включать все ABI в окончательный APK (универсальный APK), а затем по умолчанию включать разделенные APK. Инструменты Android выберут правильный APK для загрузки на подключенное устройство, и все будет хорошо. Окончательный универсальный APK может быть загружен в игровой магазин или разделены APK для каждого ABI.

А пока в качестве решения вы можете добавить это в конец своего build.gradle в каталоге android\app .

// 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: моментальный снимок несовместим с текущей конфигурацией виртуальной машины:
снимок требует 'product use_bare_instructions no- "asserts" causal_async_stacks arm-eabi softfp'
но на виртуальной машине есть 'product use_bare_instructions no- "asserts" causal_async_stacks arm64-sysv' "

А, понятно. Это потому, что нам потенциально потребуется включить снимок AOT для целевой арки. И прямо сейчас мы просто помещаем это в активы, мы не помещаем версию для каждой архитектуры в libs . Если бы мы могли поместить снимок AOT в папку библиотек для конкретной архитектуры, которая могла бы работать, в противном случае мы бы хотели использовать формат .aab по этой причине.

Мы хотим сделать это в любом случае, чтобы поддержать создание .AAR для сценариев использования add2app. Я буду тыкать в это.

@dnfield у вас уже были какие-то успехи в этом?

В данный момент прорабатываем плагин. Мы пытались сделать некоторые из них приоритетными, чтобы исправить проблемы с Android X, но должны увидеть, что из этого выйдет еще несколько.

Мы с @gerryhigh занимались этим. Пожалуйста, не обращайте внимания на мои последние ответы. Проблема заключается как раз в том, что libflutter.so не включен для 64-битной версии, но для AOT вам нужно запустить процесс сборки дважды: один раз для 32-битной версии и еще раз для 64-битной. Затем вы получаете два набора скомпилированного кода Dart в активах вашего приложения, а также две версии libflutter.so. Я думаю, что конечной целью было бы настроить задачи компиляции для Flutter, чтобы он выполнял два отдельных этапа сборки и автоматически разделял установку APK.

Но на данный момент единственное решение - дважды запустить сборку и загрузить несколько APK в Play Store.

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

Этого можно добиться, включив разделенные APK. Более подробную информацию можно найти здесь: https://developer.android.com/studio/build/configure-apk-splits.

@slightfoot да, это лучшее решение, которое я нашел, как упоминалось в моем комментарии там https://github.com/flutter/flutter/issues/18494#issuecomment -477502287

@slightfoot, если я правильно понимаю, было бы невозможно создать универсальный APK, поскольку некоторый код находится в папке с ресурсами, что не позволяет разделять файлы в соответствии с целевой архитектурой в качестве папки lib?

Снимки, созданные для каждой архитектуры, различаются. Просто скопируйте движок libflutter.so Вызовет невозможность загрузки снимка, если архитектура снимка не соответствует архитектуре движка флаттера.
Таким образом, в настоящее время у нас нет возможности создать универсальный apk, содержащий все архитектуры, если не разделить файлы моментальных снимков и не включить файл моментальных снимков для каждой архитектуры.

Я немного не понимаю, почему это вообще проблема.

Сборки отладки создают libflutter.so в x86_64, x86, armeabi-v7a и arm64-v8a.

Сборки релизов должны делать то же самое.

AGP (Android Gradle Plugin) уже включает функцию фильтрации архитектур, поэтому, если пользователь желает сделать это для сборки выпуска, он может изменить свой build.gradle.

@eseidel @dnfield Я действительно не думаю, что это решено с помощью пакетов Android App Bundle - они еще не являются выходом Android по умолчанию, и при запуске из IDE apks будут использоваться довольно долго, но я уверен.

AAB - еще одна причина, по которой Flutter должен включать все архитектуры libflutter.so, поскольку Play Store может отфильтровать, какую архитектуру он предоставляет устройствам.

@athornz проблема не в libflutter.so а в том, что ваш код дротика компилируется до AOT snapshot отладочные сборки включают виртуальную машину Dart, поэтому весь ваш код дротика просто запускает JIT на виртуальной машине , но релизные сборки компилируют ваш код дротика в моментальный снимок и помещают этот моментальный снимок в папку с ресурсами. В идеале моментальный снимок должен быть скомпилирован для каждой архитектуры и размещен рядом с libflutter.so но на данный момент это не так. Таким образом, хотя вы можете включить libflutter.so для всех архитектур, моментальный снимок будет работать только для той архитектуры, для которой он был скомпилирован.

Есть планы исправить эту проблему?

Магазин Google Play просит разработчика предоставить поддержку 64-битной версии после 1 августа 2019 года.

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

Требование 64-битности: что это значит для разработчиков
С 1 августа 2019 г .:
_Все новые приложения и обновления приложений, которые включают собственный код, должны предоставлять 64-битные версии в дополнение к 32-битным версиям при публикации в Google Play._
Расширение: Google Play продолжит принимать только 32-разрядные обновления для существующих игр, использующих Unity 5.6.6 или более раннюю версию, до августа 2021 года.
С 1 августа 2021 г .:
Google Play перестанет обслуживать приложения без 64-битных версий на 64-битных устройствах, то есть они больше не будут доступны в Play Store на этих устройствах.
Сюда входят игры, созданные с помощью Unity 5.6.6 или более ранней версии.

@trevorwang, мы уже можем создать 64-битную версией в Play Store. Так что это не проблема.

@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 для China Market.

@trevorwang вы можете создать для каждой цели и четко указать, для какой архитектуры предназначен каждый APK. Именно так это делается для большинства сайтов-зеркал APK.

Ограничение на 64 бита - это всего лишь ограничение Google Play Store. Вы по-прежнему можете развернуть APK только для armeabi-v7a, и каждый сможет запустить ваше приложение.

Создание отдельных APK-файлов для каждой архитектуры - это обходной путь и определенно решение не для всех.

Как только вступит в силу ограничение Google Play 64bit, эта проблема затронет большинство разработчиков Flutter, поэтому нам действительно нужно решение, которое позволяет использовать несколько архитектур в одном apk / пакете.

Просто быстрое напоминание

Команда Flutter использует количество положительных отзывов о проблеме GitHub в качестве ориентира для определения ее приоритета.

Я считаю, что этот вопрос должен быть приоритетным.

Спасибо за работу @gerryhigh и @slightfoot

Я добавил флаттер в существующее приложение и исправил эту проблему с помощью следующего обходного пути.
_Пожалуйста, добавьте это в свой модуль приложения основного проекта. _

Это сценарий для режима отладки, пожалуйста, измените его соответствующим образом для выпуска.

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/", "")
                }
            }
        }
    }
}

Какие-нибудь недавние события?

Что я в итоге сделал, так как хотел

  • отдельные apks для каждой архитектуры
  • не нужно изменять код версии вручную
  • запустите одну команду для создания apks
  1. Добавил это в gradle. Он добавляет 1 или 2 в конце versionCode, поэтому версия 1004 становится 10041 для arm и 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. Для создания apks я использую более длинную команду терминала (которую вы можете вставить в скрипт). Он запускает сборку дважды и в конце создает копии apks:
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, и когда я загружаю его в Google, он выдает предупреждение и не позволяет мне тестировать его в альфа-версии.

Я использовал codemagic для этого, есть ли способ подписать его и поместить в пакет? или расставить все точки с помощью codemagic?

Я столкнулся с той же проблемой, которой, как я думал, вообще не должно быть.

Как так получилось, что это на веху «Цели».

П2: Мы считаем, что эти задачи стоит решить в ближайшие годы. Он включает в себя выявленные нами проблемы, которые могут блокировать полную доставку широких приложений, ориентированных на потребителя, проблемы с правильностью и ошибки, связанные с полировкой и качеством. Дата этой вехи совершенно произвольна и предназначена только для того, чтобы правильно отсортировать веху.

Это уже критическая проблема, которая в конце этого года станет серьезной проблемой, когда Google установит ограничение на 64-разрядную версию.

Я достигла важной вехи в этом. Точной даты пока нет.

Чтобы пояснить: возможно, но сложно соблюдать новые правила сегодня. Мы хотим сделать это проще.

Итак, метод @andreidiaconu работал у меня, пока я вручную

Но я использовал codemagic для сборки и развертывания.

Так что это пустая трата, Flutter нужно, чтобы это построили.

На данный момент меня лично не волнует, насколько это сложно. Если это сложно, то он будет автоматизирован с помощью скрипта. Вопрос в том, возможно ли это и как, потому что консоль Google Play предупреждает меня:

Этот выпуск не соответствует требованиям 64-разрядной версии Google Play.
Следующие APK или пакеты приложений доступны для 64-разрядных устройств, но они имеют только 32-разрядный собственный код: 6.
С 1 августа 2019 года все выпуски должны соответствовать требованиям 64-разрядной версии Google Play.
Включите в свое приложение 64-битный и 32-битный собственный код. Используйте формат публикации Android App Bundle, чтобы автоматически гарантировать, что архитектура каждого устройства получает только необходимый собственный код. Это позволяет избежать увеличения общего размера вашего приложения.

Мне не нужно решение, для которого требуются разные коды версий, и мне нужно решение, которое работает с пакетами приложений Android (AAB).

Предупреждение
Этот выпуск не соответствует требованиям 64-разрядной версии Google Play.

Следующие APK или пакеты приложений доступны для 64-разрядных устройств, но они имеют только 32-разрядный собственный код: 3.

Любое решение?

Я достигла важной вехи в этом. Точной даты пока нет.

Чтобы пояснить: возможно, но сложно соблюдать новые правила сегодня. Мы хотим сделать это проще.

Следует ли обновить документы с инструкциями о том, как это сделать как для apk, так и для пакетов приложений? Все, что я видел до сих пор, - это кучи кода и конфигурации, которые я не совсем уверен, куда их поместить. Я, наверное, смог бы разобраться с этим методом проб и ошибок, но это далеко не идеально.

та же проблема

Спасибо за работу @gerryhigh и @slightfoot

Я добавил флаттер в существующее приложение и исправил эту проблему с помощью следующего обходного пути.
_Пожалуйста, добавьте это в свой модуль приложения основного проекта. _

Это сценарий для режима отладки, пожалуйста, измените его соответствующим образом для выпуска.

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 и предложению битные собственные библиотеки в сборки выпуска с небольшим дополнением к ./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 окажется в разделе "intermediate / ...", но не в финальном apk.

@noinskit Похоже, что мое предыдущее решение было подвержено ошибкам. После запуска flutter clean он сгенерировал aab только с 32-битными библиотеками. Замена assembleRelease на mergeReleaseJniLibFolders похоже, работает также после очистки сборки true.

@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-v8a и armeabi-v7a , как и ожидалось, есть libflutter.so, но в финальном выпуске APK по-прежнему отсутствует libflutter.so в arm64-v8a.

Вот скриншот

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-разрядные версии. Он успешно собирается, я могу загрузить его в консоль Google Play, и я могу установить его как на 32-, так и на 64-разрядные телефоны. Но приложение по какой-то причине вылетает при запуске на устройстве android-arm64 (похоже, работает на старом 32-битном телефоне Android, с которым я тестировал).

Вот ошибка, которую я получаю на 64-битном устройстве:

Сообщение об отмене : '[

Не уверен, что я могу сделать ... Возможно, пока придется придерживаться только поддержки 64-битных устройств.

@Torrunt эта ошибка возникает из-за того, что движок пытается отбросить моментальный снимок AOT для 32-битной версии и найти ее для 64-битной версии.

Мы работаем над тем, чтобы создать AAB, в котором есть и то, и другое, чтобы магазин мог правильно их разделить.

@SPodjasek Используя это, размер моего файла app-release.apk увеличился с 11,1 МБ до 15,7 МБ

@SPodjasek Используя это, размер моего файла app-release.apk увеличился с 11,1 МБ до 15,7 МБ

Да, поскольку он принудительно включает libflutter.so для 32- и 64-битных версий. Если вам это не нужно, придерживайтесь текущего значения по умолчанию, чтобы включить только 32-битную версию, и дождитесь, пока команда flutter справится с этим должным образом.

похоже, есть несколько возможностей:

  • подождите, пока команда флаттера решит проблему архитектуры 32 против 64, заставляя Google Play Store снова принимать сборки флаттера
  • мы должны ограничить устройства Android, используемые только 32-битными, поэтому приложения flutter будут работать только на 32-битных устройствах
  • мы должны как-то убедить Google не применять 64-битную версию в игровом магазине. (Интересно, какая разница между 32 и 64 битами, что-то вроде больших чисел?)
  • установить 32 приложения как-то на 64-битные устройства, но не в игровой магазин ...

Примечание для людей, использующих --target-platform для сборки для android-arm и android-arm64 отдельно и загружающих два APK.
Обратите внимание, что некоторые плагины используют собственные библиотеки, которые могут быть нацелены на оба, и flutter не фильтрует папки с библиотеками, поэтому ваш «32-битный» APK на самом деле также будет нацелен на arm64, и он выйдет из строя, поскольку libflutter.so отсутствует, а снимки AOT есть построен для armv7.

Итак, вам нужно явно отфильтровать целевой abi в вашем файле build.gradle.

Я думаю, что flutter build apk --target-platform ... логически должен выполнять эту фильтрацию.

Используя решение @SPodjasek , я получил ошибку при сопоставлении arm-eabi с arm64-sysv . Я думаю, что лучшее решение, которое сработало для меня, на данный момент просто строится для 32-битной версии, пока все не будет решено ( здесь ):

На вашем app уровне build.gradle :

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

Резюмируя вопрос из темы - собрать такой APK и для armeabi-v7a, и для arm64-v8a не получится. Flutter использует моментальные снимки AOT, которые зависят от ABI, поэтому с APK единственным возможным решением было бы использовать несколько сборок APK.
Решением было бы использовать App Bundles, которые на данный момент также имеют некоторые проблемы (№ 31922).
После объединения # 32787 теперь можно использовать App Bundles.

Как установить вкус и целевой файл (например, -t lib / another_main.dart) при создании пакета приложений Android через Android Studio? оо

Это будет поддерживаться через flutter build appbundle после объединения https://github.com/flutter/flutter/pull/32787 !

@swavkulinski, как бы вы выпустили файлы to apks в игровой магазин?

Тогда это было еще возможно. Теперь вам нужно ограничиться до 64 бит. Мы были заблокированы сторонней библиотекой NDK, которая была только 32-битной.

@blasten
Добавит ли это также поддержку flutter build apk --release ? Или в долгосрочной перспективе планируется постепенно отказаться от поддержки APK в пользу пакетов App Bundle? Мне очень нравится относительная простота толстого APK.

@zimmi Правильно. Пакеты приложений должны быть способом продвижения вперед. При необходимости вы все равно можете использовать flutter build apk --release . Что в толстом APK проще по сравнению с AAB?

Что в толстом APK проще по сравнению с AAB?

AAB не является установочным файлом. Сам Android не может его использовать. Это формат файла только для магазина Google Play. Так нужен apk когда:

  • Установка прямо на устройство.
  • Прямое распространение app.
  • Распространяется через любой другой рынок приложений, кроме магазина Google Play. (Амазонка и весь Китай).

Я понимаю. Спасибо за предысторию.

Кроме того, вы можете извлечь APK из AAB с помощью bundletool .

@blasten
Спасибо за подтверждение!
Что касается комментария о простоте: что сказал @audkar . Также с AAB разработчик должен подумать о возможных сценариях отказа, вызванных отсутствием активов. Тестировать на всех возможных конфигурациях устройств сложно, поэтому, если эти сбои случаются, скорее всего, в производственной среде.

Размер приложения может быть ценой, которую некоторые готовы заплатить за это спокойствие.

Я уверен, что есть лучшие места для обсуждения достоинств каждого подхода, чем этот вопрос, хотя я не хочу мешать этому.

/ cc @jonahwilliams нам может потребоваться поддержка толстых APK в build apk .
Должны ли мы также изменить значение по умолчанию для build apk ?

Обязательно нужна жирная поддержка apk. Существует множество инструментов (бета-версия и т. Д.), Которые еще не работают с пакетами приложений.

flutter build appbundle теперь в мастере, хочет ли кто-нибудь добровольно попробовать?

У нас было некоторое обсуждение поддержки списка платформ в 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? При загрузке пакетов приложений в консоль Google Play через Codemagic файл mapping.txt отсутствует, поэтому нет автоматического тестирования или отчетов перед запуском, которые есть при загрузке apk :(

так что вопрос:

Будет ли команда Flutter делать обновление для 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:
Мгновенный сбой при открытии.

журнал adb:
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, мне очень непонятно, почему люди продолжают говорить, что

Пакет приложений - это не что иное, как автоматизированный разделенный APK, и в папке с ресурсами нет разделения. Таким образом, снимки по-прежнему нацелены только на одну архитектуру.

Возможно, мне что-то не хватает, но, на мой взгляд, единственное решение сейчас - создать APK для каждой архитектуры с соответствующей фильтрацией ndk в файле gradle. А затем загрузите каждый из этих APK.

Если мы не сможем решить эту проблему с помощью APK, то и комплект приложений не сможет работать.

@ndusart Не думаю, что это правда. Документы пакета приложений говорят:

res /, lib / и assets /: эти каталоги идентичны каталогам в типичном APK. Когда вы загружаете пакет приложений, Google Play проверяет эти каталоги и упаковывает только те файлы, которые соответствуют конфигурации целевого устройства, сохраняя при этом пути к файлам.

Таким образом, он может как-то разделить активы.

@jereksel, это просто говорит о том, что эти каталоги в пакете приложений работают точно так же, как в apk, и папка assets/ не разделяется. Он используется для хранения активов в очень конкретной файловой структуре в приложении, он не предназначен для анализа ОС или чего-либо еще.

Если я ошибаюсь, просто скажите мне, как мы можем разделить эту папку на основе целевого ABI.

И эта цитата просто подтверждает то, что я говорю, если это невозможно сейчас с APK, это будет невозможно с использованием пакета приложений, поскольку эти папки работают одинаково в обоих направлениях.

Я не видел, чтобы активы разделились, но я обнаружил следующее:

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/ чтобы разделить его, но в настоящее время это возможно только делать на языке.

Тем не менее, это еще не кажется стабильным, и на этом не следует основываться прямо сейчас. Моментальные снимки виртуальной машины должны быть либо депортированы в папку lib/ если это возможно, либо команда flutter должна содержать полную функцию для создания APK для конкретной цели (над этим все еще есть работа. за доступность для большого количества людей) и отложите создание пакета приложений, когда он будет готов.

@blasten

Я переключился на главный канал, обновил и собрал appbundle. К сожалению, приложение падает после загрузки из магазина Google Play со следующим 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 теперь в мастере, хочет ли кто-нибудь добровольно попробовать?

У нас было некоторое обсуждение поддержки списка платформ в build apk , поэтому вы можете сделать что-то вроде этого: flutter build apk --target-platform android-arm,android-arm64

@blasten

Я переключился на главный канал, обновил и собрал appbundle. К сожалению, приложение падает после загрузки из магазина Google Play со следующим 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 теперь в мастере, хочет ли кто-нибудь добровольно попробовать?
У нас было некоторое обсуждение поддержки списка платформ в build apk , поэтому вы можете сделать что-то вроде этого: flutter build apk --target-platform android-arm,android-arm64

У меня такая же проблема, хотя логов пока нет.

@skybur проблема, с которой вы https://github.com/flutter/flutter/issues/33119. Если это так, этот патч должен исправить это.

@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 в игровой магазин
  3. приращение versionCode
  4. запустить flutter build apk --release --target-platform=android-arm64
  5. загрузить app-arm64-v8a-release.apk в игровой магазин

Магазин Google Play будет обслуживать приложение в соответствии с архитектурой устройства. 32-битные устройства довольны, 64-битные устройства довольны, и мне приятно знать, что размер моего APK остается относительно небольшим, но при этом обслуживает обе архитектуры.

Если мы включим поддержку обеих архитектур в один и тот же APK, ожидайте, что размер вашего приложения будет не менее 10 МБ.

Ребята, нужно сказать вам одну важную вещь. Если вы воспользуетесь методом цитирую. Вам может потребоваться закомментировать настройку, если вы хотите продолжить отладку своего приложения. Я столкнулся с ошибкой, когда сборка Gradle не смогла создать пакет Android и зависла на несколько часов, сделав несколько gradlew clean ... и т.д., и, наконец, обнаружила, что это следует закомментировать!

Надеюсь, это помогло кому-то выпрыгнуть.

flutter build appbundle теперь в мастере, хочет ли кто-нибудь добровольно попробовать?

У нас было некоторое обсуждение поддержки списка платформ в build apk , поэтому вы можете сделать что-то вроде этого: flutter build apk --target-platform android-arm,android-arm64

flutter build appbundle работает! Мне не нужно добавлять эту настройку, просто набираю код. Однако для компиляции требуется немного много времени, но это единственный способ пройти Google Play сейчас.

@Tokenyet Удалось ли вам загрузить приложение из Play Store и запустить его после загрузки .aab ? Если это так, не могли бы вы вставить вывод flutter doctor ?

@blasten

Я переключился на главный канал, обновил и собрал appbundle. К сожалению, приложение падает после загрузки из магазина Google Play со следующим 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 теперь в мастере, хочет ли кто-нибудь добровольно попробовать?
У нас было некоторое обсуждение поддержки списка платформ в build apk , поэтому вы можете сделать что-то вроде этого: flutter build apk --target-platform android-arm,android-arm64

Точно то же самое здесь, когда я пытаюсь запустить мое приложение из Play Store (созданного как appbundle). Какие журналы вам нужны, чтобы решить эту проблему?

Это будет полезно:

  1. Загрузите bundletool с https://developer.android.com/studio/command-line/bundletool
  2. Запустите flutter build appbundle (укажите, передаете ли вы какой-либо флаг или внесли ли вы _custom_ изменения в любой скрипт Gradle)
  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. Это шаги , вставьте логарифм в свой комментарий.

Я не могу воспроизвести проблему, хотя я тестировал только локально, используя 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

Что касается текущего flutter@master AAB, 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

Тестирую в Test Lab, у меня тоже все зеленые.
Все еще ждем, пока Play Store обработает эту версию, чтобы протестировать этот канал.

@Tokenyet Удалось ли вам загрузить приложение из Play Store и запустить его после загрузки .aab ? Если это так, не могли бы вы вставить вывод flutter doctor ?

Я могу загрузить приложение из Play Store и запустить его. Вы можете [попробовать] (https://play.google.com/store/apps/details?id=com.bumbystudio.starry_clock). (Edit: Ой, это не срабатывает ... из PlayStore)

Ниже мои flutter doctor сколько вам нужно. Надеюсь, это помогло.

[√] Flutter (Мастер каналов, v1.6.1-pre.88, в Microsoft Windows [версия 10.0.17134.765], язык zh-TW)

[√] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3)
[√] Android Studio (версия 3.3)
[√] VS Code, 64-разрядная версия (версия 1.30.2)
[!] Подключенное устройство
! Нет доступных устройств

У меня это отлично работает!

buildTypes {
выпуск {
// ЗАДАЧА: Добавьте свою собственную конфигурацию подписи для сборки выпуска.
// Подпись с помощью ключей отладки на данный момент, так что flutter run --release работает.
SigningConfig signatureConfigs.debug
}
debug {
ndk {
abiFilters 'armeabi-v7a'
}
}
}

@SPodjasek по- прежнему, нам нужно разделить assets/ на основе ABI. Как это можно сделать сейчас?

Я установил на свое устройство, и кажется, что он не работает. Все, что у меня было, было
черный экран.

Спасибо,

Пурушотаман Рамануджам

В чт, 23 мая 2019 г., 18:43 Tokenyet, [email protected] написал:

@Tokenyet https://github.com/Tokenyet удалось ли вам загрузить приложение?
из Play Store и запустить его после загрузки .aab? Если это
случай, не могли бы вы вставить вывод flutter doctor?

Я могу загрузить приложение из Play Store и запустить его. Вы могли бы дать это
попытка
https://play.google.com/store/apps/details?id=com.bumbystudio.starry_clock
.

Ниже мой доктор трепетания, как вам нужно. Надеюсь, это помогло.

[√] Flutter (мастер канала, v1.6.1-pre.88, в Microsoft Windows [Версия
10.0.17134.765], локаль zh-TW)

[√] Android toolchain - разработка для устройств 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=AAIHDZYY47H6PUQQJYEO4J3PW2J7RA5CNFSM4FFE2B7KYY3PNVWWK3TUL52HS4DFMVODNVWWK3TUL52HS4DFMVR03TUL52X63DFMVR08
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAIHDZZXV67JCNVJYLVA3WLPW2J7RANCNFSM4FFE2B7A
.

@ndusart На данный момент это невозможно - возможно, отправьте запрос функции в

@SPodjasek , вот что я говорю, все идет не так.

Кажется, что все обсуждения заканчиваются словами: «Не волнуйтесь, когда мы сможем создавать пакеты приложений, все будет хорошо», но это совершенно не так сейчас и в ближайшем будущем.
Немного разочаровывает то, что команда флаттера позволяет людям думать, что это возможно.

flutter должен иметь возможность легко создавать разделенный APK, либо выполняя разделение самостоятельно, либо перемещая моментальные снимки виртуальной машины в папку lib/ и позволяя разделению просто работать (тогда мы могли бы также использовать пакеты приложений )

Подведем итоги:

  1. Flutter будет поддерживать толстые APK через flutter build 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 , чтобы вы могли объединить оба типа, если я не ошибаюсь ...

Если снэпшоты перенести в lib, то, может быть, # 30846 тоже поправят?

@blasten
Я переключился на главный канал, обновил и собрал appbundle. К сожалению, приложение падает после загрузки из магазина Google Play со следующим 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 теперь в мастере, хочет ли кто-нибудь добровольно попробовать?
У нас было некоторое обсуждение поддержки списка платформ в build apk , поэтому вы можете сделать что-то вроде этого: flutter build apk --target-platform android-arm,android-arm64

У меня такая же проблема, хотя логов пока нет.

То же самое. Произошла ошибка. Обновил мастер и запустил flutter build appbundle . Избавился от ошибки, но приложение вылетает при открытии.

Я попытался загрузить appbundle с использованием последней основной версии flutter в магазин приложений с последними изменениями. 64-битная ошибка исчезла, но мое приложение сразу вылетает.

Что действительно странно, так это то, что 64-битная версия с использованием приведенных ниже команд работает нормально.
Скачать flutter build apk --target-platform android-arm64
flutter install api

Он вылетает только тогда, когда приложение установлено через appbundle в магазине приложений. На данный момент я вернул магазин приложений к 32-битному apk.

В моем gradle.build нет ничего особенного

minSdkВерсия 21
targetSdk, версия 28
versionCode flutterVersionCode.toInteger ()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled истина

Я использую Flutter (мастер каналов, v1.6.4-pre.13, в Mac OS X 10.14.5 18F132, локаль en-US)

Есть ли способ протестировать эти пакеты перед загрузкой в ​​магазин приложений? Это известная проблема, над которой работает Google, или мне нужно внести некоторые изменения в мой файл Gradle?

@chitwoob Следуйте инструкциям: https://github.com/flutter/flutter/issues/18494#issuecomment -495049530

@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 в игровой магазин
  3. приращение versionCode
  4. запустить flutter build apk --release --target-platform=android-arm64
  5. загрузить app-arm64-v8a-release.apk в игровой магазин

Магазин Google Play будет обслуживать приложение в соответствии с архитектурой устройства. 32-битные устройства довольны, 64-битные устройства довольны, и мне приятно знать, что размер моего APK остается относительно небольшим, но при этом обслуживает обе архитектуры.

Если мы включим поддержку обеих архитектур в один и тот же APK, ожидайте, что размер вашего приложения будет не менее 10 МБ.

Выполнение этих шагов приводило к тому, что «сборка Gradle не смогла создать пакет Android». ошибка
_ После часа отладки обнаружил исправление. _

Чтобы создать разные приложения для 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. Создайте APK выпуска с помощью flutter build apk --release
Это создаст apk на основе x86 в папке build/app/outputs/apk/app.apk
Загрузите этот apk в магазин Google Play.
x86 сделано до сих пор

На этом этапе не запускайте flutter clean
Я делал это и получал ошибки при сборке x64 apk

Шаг 3. Теперь откройте pubspec.yaml и измените version с
version: 1.0.0+1 до version: 1.0.0+2

Цифра рядом с + - это код версии.

Шаг 4: Теперь запустите команду
flutter build apk --release --target-platform=android-arm64

После завершения этой команды перейдите к build/app/outputs/apk/release/ . Там вы найдете apk с именем app-arm64-v8a-release.apk . Это ваш 64-битный apk-файл с другим кодом версии.

Теперь загрузите этот apk x64 в магазин игр .... и готово. Вы загрузили приложения x86 и x64 в Play Store.

Будет длинный комментарий, но это полностью устранило проблему.

[...]
Чтобы создать разные приложения для 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. Создайте APK выпуска с помощью flutter build apk --release
[...]

Согласитесь с вашим ответом. У меня работает, хотя мне не нужно было следовать шагу 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. Создайте APK выпуска с помощью flutter build apk --release
[...]

Согласитесь с вашим ответом. У меня работает, хотя мне не нужно было следовать шагу 1 (я использовал build.gradle по умолчанию)

Затем вам просто нужно увеличить номер сборки и версию, чтобы Google Play их принял.

У меня все еще проблемы с flutter build appbundle на руке.

Не работает. Я так расстроен. Приложение вылетало при попытке развернуть на эмуляторе x86, а также на реальном устройстве arm. Пробовал с основным / бета / стабильным каналом. Релиз не готов. Для нас это все еще шоу-пробка. Команда Appbundle создает устанавливаемый пакет для игры, но во время выполнения приложение показывает только заставку, а затем зависает. Команда Flutter, пожалуйста, предоставьте четкое решение или WA.

@mormih, спасибо за терпение - мы работаем над воспроизведением. Если вы не возражаете, не могли бы вы отправить мне электронное письмо ([email protected]) со следующей информацией, это поможет:

  • Ваша хост-платформа, которую вы используете для создания.
  • Команда, которую вы используете для создания приложения.
  • Запустите команду сборки с помощью --bug-report (например, flutter build appbundle --bug-report ) и прикрепите связанный файл bugreport.zip
  • Прикрепите сгенерированный пакет приложений, чтобы мы могли попробовать запустить его на локальных устройствах.
  • Прикрепите результаты adb bugreport после попытки запустить приложение

Спасибо!

@tvolkert У меня также есть проблема, когда он вылетает со следующим сообщением:

Проверка не удалась: vm. Необходимо иметь возможность инициализировать виртуальную машину.

Моя хост-платформа - это Mac и macOS 10.14.5. Удалось ли вам воспроизвести его, или вы хотите, чтобы я выполнил шаги, которые вы написали выше? Кроме того, возможно, для этого должен быть специальный билет, поскольку это отдельная проблема от OP .. Ура

@mormih Я не уверен, но пробовали ли вы также включить x86 в список abi?

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

flutter build appbundle (на мастере) у меня тоже не сработало, заставка зависла, как другие заметили ...

Единственный обходной путь, который я нашел для выпуска (в магазине Play) как для 32-, так и для 64-битной версии, заключается в следующем. (Частично описано в теме, но может кому-то помочь):

  1. Создайте apk с фильтром v7 + команда apk сборки по умолчанию:
    В вашем файле app / build.gradle:
    defaultConfig { ... ndk{ abiFilters "armeabi-v7a" } }
    а затем запустить
    flutter build apk
    (по умолчанию --release)

  2. Добавьте номер сборки в pubspec.yaml.
    Например, от version: 1.1.0+6 до version: 1.1.0+7

  3. Создайте apk с фильтром v8 на + build с arm64 в качестве целевой платформы:
    теперь обновите build.gradle, например:
    defaultConfig { ... ndk{ abiFilters "arm64-v8a" } }
    а затем запустить
    flutter build apk --release --target-platform android-arm64

Включает накладные расходы на загрузку 2 apks (и, таким образом, создание 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
без изменения градиента на каждой сборке


Что касается кода версии, я бы предпочел установить один по умолчанию и получить остальные из этого
Например, установите arm32 с 1.0.0 + 10000 и сгенерируйте код версии для arm64 который равен 1.0.0 + 10001.
Это должно быть легко сгенерировать с помощью bash (или в fastfile, если вы используете fastlane)

Вы можете установить номер сборки, используя аргументы --build-number или через fastlane, если вы используете один

Этот сценарий кода версии помогает мне в CI / CD 😄

CMIIW

Для меня это сработало очень хорошо
https://github.com/flutter/flutter/issues/10728#issuecomment -461375218

Будет длинный комментарий, но это полностью устранило проблему.

Это было моим решением:

  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 в игровой магазин
  3. приращение versionCode
  4. запустить flutter build apk --release --target-platform=android-arm64
  5. загрузить app-arm64-v8a-release.apk в игровой магазин

Магазин Google Play будет обслуживать приложение в соответствии с архитектурой устройства. 32-битные устройства довольны, 64-битные устройства довольны, и мне приятно знать, что размер моего APK остается относительно небольшим, но при этом обслуживает обе архитектуры.
Если мы включим поддержку обеих архитектур в один и тот же APK, ожидайте, что размер вашего приложения будет не менее 10 МБ.

Выполнение этих шагов приводило к тому, что «сборка Gradle не смогла создать пакет Android». ошибка
_ После часа отладки обнаружил исправление. _

Чтобы создать разные приложения для 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. Создайте APK выпуска с помощью flutter build apk --release
Это создаст apk на основе x86 в папке build/app/outputs/apk/app.apk
Загрузите этот apk в магазин Google Play.
x86 сделано до сих пор

На этом этапе не запускайте flutter clean
Я делал это и получал ошибки при сборке x64 apk

Шаг 3. Теперь откройте pubspec.yaml и измените version с
version: 1.0.0+1 до version: 1.0.0+2

Цифра рядом с + - это код версии.

Шаг 4: Теперь запустите команду
flutter build apk --release --target-platform=android-arm64

После завершения этой команды перейдите к build/app/outputs/apk/release/ . Там вы найдете apk с именем app-arm64-v8a-release.apk . Это ваш 64-битный apk-файл с другим кодом версии.

Теперь загрузите этот apk x64 в магазин игр .... и готово. Вы загрузили приложения x86 и x64 в Play Store.

У меня тоже работает без шага 1. Спасибо всем. Я использовал фильтры ndk ndk {
abiFilters "armeabi-v7a", "x86"
}
в файле сборки gradle. Не знаю, нужно это или нет. Помимо этого, я выполнил все шаги из шага 2 и загрузил два apk, один для 32-битной версии, а другой для 64-битной.

Раньше я загружал appbundle, на этот раз загружал файлы apk. Работает нормально. Мне нужно проверить с помощью appbundle, а также попытаться исправить, не загружая два apk.

Примечание :
Перед тем, как выполнить этот процесс, мое приложение вылетело на следующих 64-битных устройствах arm
Редми Мичиган,
Redmi 3S Prime
Честь 8x

Работал в следующих устройствах arm-64 bit
Samsung Галактика J4
Samsung On8

Привет, команда Flutter,

Пожалуйста. также рассмотрите другие рынки приложений, например, в Китае. В Китае нам не разрешено использовать Google Play Store, вместо этого у нас есть много рынков приложений, таких как XiaoMi, HuaWei и Ali ... и т. Д.

На этих рынках приложений нам НЕ разрешается предоставлять выпуски apk для разных архитектур, мы можем загружать только ОДИН И ТОЛЬКО ОДИН apk для каждого выпуска, и этот выпуск будет иметь приоритет над apk предыдущего выпуска. Это означает, что текущая работа заключается в использовании «armeabi-v7a».

Поправьте меня, если я ошибаюсь, используя "armeabi-v7a", все 64-битные устройства будут работать с 32-битным libflutter.so, и я думаю, это будет медленнее.

Поэтому я бы посоветовал, может ли команда flutter предоставить метод, позволяющий нам создать apk, который включает как 32-разрядную, так и 64-разрядную версию libflutter.so, хотя размер apk будет больше. (В Китае у нас обычно очень высокая скорость интернета, и мы мало платим за бесконечные планы использования 4G, и людей обычно не волнует размер apk)

Привет, команда Flutter,

Пожалуйста. также рассмотрите другие рынки приложений, например, в Китае. В Китае нам не разрешено использовать Google Play Store, вместо этого у нас есть много рынков приложений, таких как XiaoMi, HuaWei и Ali ... и т. Д.

На этих рынках приложений нам НЕ разрешается предоставлять выпуски apk для разных архитектур, мы можем загружать только ОДИН И ТОЛЬКО ОДИН apk для каждого выпуска, и этот выпуск будет иметь приоритет над apk предыдущего выпуска. Это означает, что текущая работа заключается в использовании «armeabi-v7a».

Поправьте меня, если я ошибаюсь, используя "armeabi-v7a", все 64-битные устройства будут работать с 32-битным libflutter.so, и я думаю, это будет медленнее.

Поэтому я бы посоветовал, может ли команда flutter предоставить метод, позволяющий нам создать apk, который включает как 32-разрядную, так и 64-разрядную версию libflutter.so, хотя размер 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 не позволяет загружать два apks с одинаковыми кодами версий.

Я сослался на это видео, чтобы загрузить несколько апков в Google Play.
https://www.youtube.com/watch?v=rMl_oLlf_g0

К вашему сведению:

Наш текущий план - выпустить бета-версию с использованием одного из последних выпусков разработчиков в ближайшие 10 дней или около того. Затем мы планируем подождать, пока у нас не будет обновленного документированного процесса доставки на Android, который не вызывает предупреждения о 64-битных сборках из магазина Play, чтобы иметь способ упаковать APK, поддерживающий 64-битную версию, и доказать мы можем выпустить галерею, используя этот процесс, и, как только мы это сделаем, проследить процесс выпуска новой бета-версии, которую мы затем переведем в стабильную версию через неделю или около того.

Это означает, что у нас, вероятно, будет бета-версия в начале июня и бета-версия в конце июня или начале июля, которая вскоре станет стабильной.

@Hixie Здесь возникла еще одна проблема
пакет приложений последней версией флаттера (на данный момент основной) не генерирует версии x86, x86_64
Файлы, создаваемые основной веткой
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-битные устройства, хотя она работает на них. Сборка для 64 с указанием --target-platform android-arm64 работает на 64-разрядных устройствах, но дает сбой на 32-разрядных устройствах. Кроме того, в 2019 году Google ограничит загрузку файлов apks 64-разрядной версией.

Команда Flutter, пожалуйста, решите эту основную проблему!

defaultConfig {
....
versionName flutterVersionName
ndk.abi - фильтры 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
// готов!

Я скомпилировал свое приложение с последней основной веткой flutter и загрузил его в игровой магазин в виде пакета приложений, но на устройстве происходит сбой приложения, этот журнал взят из тестовой лаборатории

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. В дереве Flutter обновите локальную главную ветку git fetch upstream && git merge upstream/master

Увидев неоднократные вопросы, на которые уже были даны ответы в предыдущих комментариях, я написал короткую статью, в которой описал, какие варианты у нас есть сейчас https://medium.com/@truongsinh/flutter -android-64-bit-so-what-the-fuss -15da6f8e3a46. Вот TL; DR:
1_Awm6pB8jR3wGdHMC4DsatQ

@truongsinh , мы также завершаем поддержку использования flutter build appbundle для создания пакета приложений, содержащего 32- и 64-разрядные двоичные файлы для развертывания в Play Store. См. Https://github.com/flutter/flutter/issues/31922 для получения дополнительной информации - попробуйте и дайте нам знать, если у вас возникнут какие-либо проблемы.

@truongsinh , мы также завершаем поддержку использования flutter build appbundle для создания пакета приложений, содержащего 32- и 64-разрядные двоичные файлы для развертывания в Play Store. См. # 31922 для получения дополнительной информации - попробуйте и дайте нам знать, если у вас возникнут проблемы.

Да, я все еще жду, пока flutter build appbundle создаст приложение, которое не зависает и не дает сбоев: D

Да, я все еще жду, когда приложение сборки flutter создаст приложение, которое не зависает и не дает сбой: D

Подтверждено 🙂. Если у вас есть воспроизводимый случай этого события, на который мы можем взглянуть, это было бы здорово. Если вы захотите создать неподписанный файл .aab из версии 1.7.1 и отправить его мне по электронной почте ([email protected]), я был бы признателен!

К вашему сведению, следующее объявление было отправлено на [email protected] относительно нашей поддержки 64-разрядных

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

У меня тоже есть эта проблема.

Когда я создаю пакет приложений в Android Studios, я могу нормально загрузить его на свой симулятор, но он вылетает из приложения, когда я загружаю его из игрового магазина.

Привет, ребята, люди, которые используют ветку мастера flutter и создают пакеты приложений
если вы отлаживаете свое приложение, ваше приложение работает нормально
некоторые сбои лица при загрузке из игрового магазина, если это произойдет, вы проверили свой пакет приложений, работает ли он на вашем устройстве, потому что режим отладки создает двоичные файлы JIT, а режим выпуска создает двоичные файлы AOT, в настоящее время их размещение также отличается, я думаю, чтобы правильно протестировать ваше приложение
создать apk из пакета приложений только для определенной конфигурации на основе вашего устройства и полностью удалить приложение отладки с вашего устройства и установить это новое приложение вывода из пакета приложений, если оно выйдет из строя, оно выйдет из строя при загрузке из магазина воспроизведения или иным образом, надеюсь, это поможет другим. .

Ссылка для вывода в APK из вашего пакета приложений из строки cmd
https://developer.android.com/studio/command-line/bundletool

К вашему сведению, сбои в пакетах приложений лучше отслеживать в https://github.com/flutter/flutter/issues/31922. Однако кросс-постинг здесь:

Всем привет,

TL; DR:

Мы определили проблему со сбоями при загрузке из Play Store и работаем над исправлением, которое будет доставлено в те же сроки, что указаны выше в https://github.com/flutter/flutter/issues/31922#issuecomment -498880614

Объяснение высокого уровня

Для интересующихся довольно длинным объяснением является то, что на устройствах под управлением Android Marshmallow или более поздней версии Play Store обнаружит приложения, упакованные в виде пакетов приложений, содержащих несколько ABI, и установит эти приложения на устройство в форме «разделенного» APK-файлы ". При этом содержащиеся в нем файлы .so не извлекаются из zip-архива APK, что отличается от поведения неразделенных APK. Поскольку текущий механизм поиска файлов .so предполагает, что движок Flutter был извлечен из APK, он не работает в случае разделенных APK.

Решение состоит в том, чтобы просто dlopen библиотеки, и Android абстрагируется от того, где находятся библиотеки (т.е. внутри архива или нет). Однако необходимые файлы .so никогда не были настоящими библиотеками - они были просто двоичными блоками данных, которые мы загружали в виртуальную машину Dart. Поэтому в рамках этого мы создаем для них библиотеки ELF (например, https://github.com/dart-lang/sdk/commit/6d608fb52bc1926a73d986d73ab228b77cfb7ca2 и https://github.com/flutter/flutter/pull/33696).

4. Сборка флаттера apk --release --target-platform = android-arm64

Я получаю эту ошибку после добавления фрагмента кода в build.gradle
Gradle build failed to produce an Android package.

  1. сборка флаттера 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

Может кто-нибудь решить проблему? У меня есть приложение на флаттере, которое работает только с 32-битным apk, но 64-битные не работают или не устанавливаются. Тестирую на 64-битном сотовом телефоне

@CgarciaTC, пожалуйста, посетите https://github.com/flutter/flutter/issues/18494#issuecomment -500101807 для получения последнего обновления

Всем привет,

Мы считаем, что все исправления оказались на вершине дерева на канале master . Если вы хотите попробовать их, вот как:

  • flutter build appbundle

    По умолчанию App Bundle содержит ваш код Dart и среду выполнения Flutter, скомпилированную для armeabi-v7a (32-разрядная версия ) и версия ).

  • 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

    В результате получится толстый APK, содержащий ваш код, скомпилированный для всех целевых ABI. Такие APK-файлы будут больше по размеру, чем их разделенные аналоги, из-за чего пользователь будет загружать собственные двоичные файлы, которые не применимы к архитектуре их устройства.

apk сборка флаттера --split-per-abi
Эта команда приведет к созданию двух APK:
сборка / приложение / выходы / apk / релиз / приложение-armeabi-v7a-release.apk
сборка / приложение / выходы / apk / релиз / приложение-arm64-v8a-release.apk

@tvolkert - в этом конкретном сценарии как насчет каждого номера версии выпуска? Насколько мне известно, они должны отличаться, поэтому мы можем загрузить их в Google Play. Эта часть как-то управляется, когда собираются апки? Если нет, то как с этим поступить?

@ angel1st он управляется автоматически при создании APK в соответствии с инструкциями в https://developer.android.com/studio/build/configure-apk-splits#configure -APK-versions.

@tvolkert есть ли информация о том, когда это появится в стабильном канале?

Можно подтвердить, что это работает (после переключения на главный) на нескольких устройствах Android. Какая палочка-выручалочка, спасибо.

@tvolkert Большое спасибо. Есть ли сроки для выпуска этого в стабильную версию Flutter?

@ harsha973, вы серьезно помечаете и задаете тот же вопрос, на который он ответил на 2 сообщения выше вашего. Не только невежественный, но и находящийся на грани неуважения.

@PerLycke извините за это.

Я проверил главный канал, обновил флаттер, и теперь я не могу создать приложение, используя команду:
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-битном материале, я столкнулся с той же проблемой, что и
запустить 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://github.com/flutter/flutter/issues/34598

Сегодня я прочитал документацию по флаттеру и обнаружил:

Из командной строки:

Введите компакт-диск
(Заменятьс каталогом вашего приложения.)
Запускаем flutter build apk --split-per-abi
(Команда сборки flutter по умолчанию --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
Framework • ревизия bc7bc94083 (4 недели назад) • 2019-05-23 10:29:07 -0700
Двигатель • ревизия 8dc3a4cde2
Инструменты • Dart 2.3.2 (сборка 2.3.2-dev.0.0 e3edfd36b2)

Запускаем «flutter pub upgrade» в consumos_app ... 19,8 с

Бегущий трепещущий доктор ...
Сводка доктора (чтобы увидеть все подробности, запустите flutter doctor -v):
[√] Flutter (бета-версия канала, v1.6.3, в Microsoft Windows [версия 10.0.17134.829], локаль es-AR)
[√] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3)
[√] Android Studio (версия 3.4)
[√] IntelliJ IDEA Ultimate Edition (версия 2019.1)
[√] VS Code (версия 1.26.1)
[√] VS Code, 64-разрядная версия (версия 1.33.1)
[!] Подключенное устройство
! Нет доступных устройств

Думаю, скоро эта функция будет доступна.

Я видел это в документации и подумал опубликовать здесь. Я не тестировал.
Я запустил команду и не работал. Он говорит:

Не удалось найти параметр с именем «split-per-abi».
Запустите 'flutter -h' (или 'flutter -h'), чтобы просмотреть доступные команды и параметры флаттера.

трепещущий доктор:

Flutter 1.6.3 • бета-версия канала • https://github.com/flutter/flutter.git
Framework • ревизия bc7bc94 (4 недели назад) • 23.05.2019 10:29:07 -0700
Двигатель • ревизия 8dc3a4cde2
Инструменты • Dart 2.3.2 (сборка 2.3.2-dev.0.0 e3edfd36b2)
Запускаем «flutter pub upgrade» в consumos_app ... 19,8 с
Бегущий трепещущий доктор ...
Сводка доктора (чтобы увидеть все подробности, запустите flutter doctor -v):
[√] Flutter (бета-версия канала, v1.6.3, в Microsoft Windows [версия 10.0.17134.829], локаль es-AR)
[√] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3)
[√] Android Studio (версия 3.4)
[√] IntelliJ IDEA Ultimate Edition (версия 2019.1)
[√] VS Code (версия 1.26.1)
[√] VS Code, 64-разрядная версия (версия 1.33.1)
[!] Подключенное устройство
! Нет доступных устройств

Думаю, скоро эта функция будет доступна.

Напоминаем, что это только на канале dev / версии 1.7.4 и новее. У вас beta channel / версия 1.6.3

Я просто попробовал это (сборка и публикация с использованием Codemagic), и это очень хорошо сработало. Спасибо!

Google по-прежнему жалуется, что я не использую appbundle. Учитывая это предупреждение, публикация apks, возможно, не имеет особого смысла?

Я бы использовал appbundle, но это останавливает автоматическое тестирование Google (создание отчета перед запуском). Стоит ли открывать для этого новый выпуск?

@nohli Мы обновили документацию, чтобы отразить последнюю информацию о пакетах приложений / APK: https://flutter.dev/docs/deployment/android#building -the-app-for-release.

Не стесняйтесь сообщать о проблеме с автоматическим тестированием Google.

Я создаю свое приложение из пакета, но после запуска на 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 или более поздней версии (в настоящее время - для разработчиков или основных каналов).

@ wal33d006 см. заявление об отказе от ответственности вверху страницы - оно применяется только к v1.7.4 или более поздней версии (в настоящее время - для разработчиков или основных каналов).

@tvolkert Я даже не могу создать свое приложение через каналы разработки или мастера.

Это мой результат, когда я строю его на dev или master каналах:

Сообщение компилятора:
файл: ///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);
    ^
    файл: ///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);
    ^
    файл: ///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);
    ^
    файл: ///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 .
  • «Итерируемый» происходит от « dart: core ».
  • 'DiagnosticsNode' взят из ' package: flutter / src / foundation / diagnostics.dart ' ('file: ///Users/waleed/Developer/flutter-sdk/flutter/packages/flutter/lib/src/foundation/diagnostics.dart ').
    Попробуйте изменить тип параметра или привести аргумент к IterableФункция () '.
    informationCollector: (информация StringBuffer) {
    ^
    Компилятор неожиданно завершил работу.

ОШИБКА: сбой при сборке за исключением.

  • Где:
    Строка скрипта '/Users/waleed/Developer/flutter-sdk/flutter/packages/flutter_tools/gradle/flutter.gradle': 638

  • Что пошло не так:
    Не удалось выполнить задачу ': app: compileflutterBuildReleaseArm '.

    Процесс 'command' / Users / waleed / Developer / flutter-sdk / flutter / bin / flutter 'завершен с ненулевым значением выхода 1

  • Пытаться:
    Запустите с параметром --stacktrace, чтобы получить трассировку стека. Запустите с параметром --info или --debug, чтобы получить больше результатов журнала. Запустите с --scan, чтобы получить полную информацию.

  • Получите дополнительную помощь на https://help.gradle.org

СТРОИТЬ НЕ УДАЛСЯ через 14 с.
Запуск задачи Gradle 'bundleRelease' ...
Запуск задачи Gradle 'bundleRelease' ... Готово 15.0 с.
Пакет задач Gradle Ошибка выпуска с кодом выхода 1

@ wal33d006 package:cached_network_image теперь версия 0.8.0 и вы используете 0.5.1 - похоже, что при работе с более новой версией Flutter вам нужно обновить ограничение версии в ваши pubspec.yaml и flutter packages upgrade

@tvolkert вы говорите, что в v1.7.4 файл libflutter.so автоматически добавляется для 64- flutter build appbundle ?

@ nimesh1997 да, хотя сборка, которая делает ее стабильной, скорее всего, будет более новой версией.

@tvolkert Я изменил свой канал на главный канал ###, а также обновил версию ### package: cached_network_image до 0.8.0, изменив внутри pubspec.yaml. Но при запуске флаттера пакеты обновляются. Ошибка отображается ниже следующим образом:
** Поскольку 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 Когда flutter версии 1.7.4 будет доступен в стабильном канале и когда указанная ниже ошибка будет устранена в flutter версии 1.7.4 из-за этой ошибки, он не будет работать на 64-битных устройствах (libflutter.so отсутствует)?

Это результат, который я получаю, когда запускаю flutter v1.7.4 или новее: -

Сообщение компилятора:
файл: ///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 .
  • «Итерируемый» происходит от « 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Функция () '.
    informationCollector: (информация StringBuffer) {
    ^
    файл: ///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».
    context: '$ runtimeType не удалось загрузить $ {Instructions.uri}',
    ^
    Компилятор неожиданно завершил работу.

Ошибка компиляции, журналы не создаются, и flutter doctor -v не указывает на ошибки. что я должен делать?

Если вы развертываете приложение в Play Store, рекомендуется использовать приложение
объединяет или разделяет APK, чтобы уменьшить размер APK.
Чтобы создать пакет приложений, запустите:
набор приложений flutter build --target-platform android-arm, android-arm64
Узнайте больше на: https://developer.android.com/guide/app-bundle.
Чтобы разделить APK по ABI, запустите:
сборка flutter 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,4 с
Устранение зависимостей ... 4,3 с
registerResGeneratingTask устарел, используйте registerGeneratedResFolders (FileCollection)
registerResGeneratingTask устарел, используйте registerGeneratedResFolders (FileCollection)
registerResGeneratingTask устарел, используйте registerGeneratedResFolders (FileCollection)
Выполнение задачи Gradle 'assemblyRelease' ...
Выполнение задачи Gradle 'assemblyRelease' ... Готово 9,0 с

При сборке Gradle не удалось создать пакет Android.

@ leonardop21 попробуйте с

flutter run -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.

(дротик: 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

(дротик: 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 (пакет: flutter_tools / src / base / process.dart)

13 _asyncThenWrapperHelper.

(дротик: 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

(дротик: 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.

(дротик: 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.

(дротик: 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: 116: 13)

28 _RawReceivePortImpl._handleMessage

(дротик: изолят-патч / изолят_патч.dart: 173: 5)

Мы обновили нашу документацию, чтобы показать, как вы можете создавать APK с 32-битными и 64-битными двоичными файлами. https://flutter.dev/docs/deployment/android#building -the-app-for-release.

Используйте канал dev : v1.7.9 или выше. Команда работает над продвижением последних изменений в бета-версию к этой пятнице (28.06.2019).

Сообщение компилятора:
файл: ///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, textureCoordinates: _uvBuffer);
    ^
    Компилятор неожиданно завершил работу.

ОШИБКА: сбой при сборке за исключением.

  • Где:
    Строка скрипта '/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 'assemblyRelease' ...
Запуск задачи Gradle 'assemblyRelease' ... Готово 23.3s
Ошибка сборки задачи Gradle с кодом выхода 1

[✓] Flutter (Channel dev, v1.7.10, в Mac OS X 10.13.6 17G65, локаль en-US)
• Flutter версии 1.7.10 в / Users / systemgnk / Desktop / flutter
• Версия Framework 9a3a7490c8 (2 дня назад), 2019-06-25 15:59:15 +0200
• Ревизия двигателя ae8e6d9f46
• Dart версии 2.4.0

[✓] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3)
• Android SDK в / Users / systemgnk / Library / Android / sdk.
• Расположение Android NDK не настроено (необязательно; полезно для поддержки встроенного профилирования)
• Платформа android-28, build-tools 28.0.3
• Бинарный файл Java находится по адресу: / Applications / Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java.
• Java-версия OpenJDK Runtime Environment (сборка 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-deploy 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 Runtime Environment (сборка 1.8.0_152-release-1248-b01)

[✓] Подключенное устройство (доступно 4)
• Android SDK для x86 • 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.
apk, который загружен в игровой магазин, не имеет предупреждений для 64-битной версии и запускается после установки с тестовой страницы игрового магазина.

У меня есть другие проблемы с SDK для dev channel flutter, такие как не всплывающее диалоговое окно разрешения для местоположения, а карта Google не отображается в 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 в игровой магазин
  3. приращение versionCode
  4. запустить flutter build apk --release --target-platform=android-arm64
  5. загрузить app-arm64-v8a-release.apk в игровой магазин

Магазин Google Play будет обслуживать приложение в соответствии с архитектурой устройства. 32-битные устройства довольны, 64-битные устройства довольны, и мне приятно знать, что размер моего APK остается относительно небольшим, но при этом обслуживает обе архитектуры.

Если мы включим поддержку обеих архитектур в один и тот же APK, ожидайте, что размер вашего приложения будет не менее 10 МБ.

ГДЕ? ГДЕ мы добавляем раздел splits в файл gradle ?? Я добавил его между flutter {} и зависимостями {}, и он не будет создавать первый APK, как сказано:

Просмотрите настройки своего проекта Gradle в папке android /.

Очевидно, что это неправильно, поскольку это единственное изменение, которое я внес в проект с момента моей последней сборки.

@ ArtfulDodgerB92 Спасибо за решение. какой канал вы использовали для сборки apk и версии?

ГДЕ? ГДЕ мы добавляем раздел splits в файл gradle ?? Я добавил его между flutter {} и зависимостями {}, и он не будет создавать первый APK, как сказано:

Просмотрите настройки своего проекта Gradle в папке android /.

Очевидно, что это неправильно, поскольку это единственное изменение, которое я внес в проект с момента моей последней сборки.

@ ArtfulDodgerB92 он должен находиться внутри раздела android{} , как написано здесь: https://developer.android.com/studio/build/configure-apk-splits.html

К вашему сведению, следующее объявление было отправлено на [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

Круто как сгенерировать релизный apk?

Сейчас это доступно на бета-канале, в выпуске v1.7.8+hotfix.2

Круто как сгенерировать релизный apk?

Вот инструкция https://flutter.dev/docs/deployment/android

Сейчас это доступно на бета-канале, в выпуске v1.7.8+hotfix.2

Круто как сгенерировать релизный apk?

Вот инструкция https://flutter.dev/docs/deployment/android

я пробовал, но не работал на 32

я пробовал, но не работал на 32

Что вы имеете в виду под 32 ? Например: «Я могу сгенерировать толстый apk, и этот apk работает на 64-битном устройстве, но вылетает на 32-битном устройстве»?

Можете ли вы опубликовать результат flutter doctor , шаг за шагом (например, это шаг 2 программы progard https://flutter.dev/docs/deployment/android#step-2---enable- obfuscation-andor-minification), вы создаете APK или AAB, и какое устройство вы тестируете?

нам еще нужно поставить
ndk { abiFilters 'armeabi-v7a' , 'x86', 'armeabi' } в градиенте больше не требуется после исправления на бета-версии ??

@ksamj, который не нужен.

я пробовал, но не работал на 32

Что вы имеете в виду под 32 ? Например: «Я могу сгенерировать толстый apk, и этот apk работает на 64-битном устройстве, но вылетает на 32-битном устройстве»?

Можете ли вы опубликовать результат flutter doctor , шаг за шагом (например, это шаг 2 программы progard https://flutter.dev/docs/deployment/android#step-2---enable- obfuscation-andor-minification), вы создаете APK или AAB, и какое устройство вы тестируете?

Сводка доктора (чтобы увидеть все подробности, запустите flutter doctor -v):
[✓] Flutter (бета-версия канала, v1.7.8 + hotfix.2, в Mac OS X 10.14.5 18F132, локаль ru-RU)

[✓] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3)
[✓] Xcode - разработка для iOS и macOS (Xcode 10.2.1)
[✓] Инструменты iOS - разработка для устройств iOS
[✓] Android Studio (версия 3.4)
[✓] Подключенное устройство (1 доступно)

• Проблем не обнаружено!

Сводка доктора (чтобы увидеть все подробности, запустите flutter doctor -v):
[✓] Flutter (бета-версия канала, v1.7.8 + hotfix.2, в Mac OS X 10.14.5 18F132, локаль ru-RU)

[✓] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3)
[✓] Xcode - разработка для iOS и macOS (Xcode 10.2.1)
[✓] Инструменты iOS - разработка для устройств iOS
[✓] Android Studio (версия 3.4)
[✓] Подключенное устройство (1 доступно)

• Проблем не обнаружено!
Сводка доктора (чтобы увидеть все подробности, запустите flutter doctor -v):
[✓] Flutter (бета-версия канала, v1.7.8 + hotfix.2, в Mac OS X 10.14.5 18F132, локаль ru-RU)

[✓] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3)
[✓] Xcode - разработка для iOS и macOS (Xcode 10.2.1)
[✓] Инструменты iOS - разработка для устройств iOS
[✓] Android Studio (версия 3.4)
[✓] Подключенное устройство (1 доступно)

• Проблем не обнаружено!
построить apk
Все сделал как по инструкции но на 32 бит не устанавливается

Все сделал как по инструкции но на 32 бит не устанавливается

Любой снимок экрана / журнал, показывающий, что установка 32-битного apk на 32-битное устройство не была успешной, и что это за модель устройства?

Всем привет,

v1.7.8+hotfix.2 выпущен в стабильный канал, поэтому теперь это исправление доступно для всех каналов. Спасибо всем за терпение и помощь!

Все сделал как по инструкции но на 32 бит не устанавливается

Любой снимок экрана / журнал, показывающий, что установка 32-битного apk на 32-битное устройство не была успешной, и что это за модель устройства?

спасибо за помощь, я попытался создать appbundle, и он сработал.

@tvolkert Та же проблема, проверьте ее. https://github.com/flutter/flutter/issues/31962#issuecomment -509458960

@ nimesh1997 эта проблема не имеет к этому никакого отношения. Если вы не нашли ответы, приведенные в связанной проблеме, полезными, возможно, вам стоит опубликовать вопрос Stackoverflow с вашей проблемой.

@tvolkert - просто чтобы прояснить - вышеуказанное исправление можно использовать для создания отдельных apks в соответствии с инструкциями документации flutter , правильно?
Следовательно, не потребуется вносить какие-либо другие изменения в файл Gradle, как описано в предыдущих частичных решениях.
Спасибо вам и остальной команде за отличную работу и своевременную доставку!

Я только что скомпилировал одно из своих приложений с последним исправлением. В результате скомпилированный app-production-armeabi-v7a-release.apk не может работать на Galaxy S3 mini (Android OS 4.1.2) - после заставки приложение закрывается без какого-либо уведомления.
Однако я могу успешно запустить тот же самый apk на телефоне 64, например, Galaxy S8.
вот как я запускаю флаттер из командной строки:

сборка флаттера apk --target = "lib / config / main_production.dart" --flavor = production --split-per-abi

а вот и мой flutter doctor -v

[√] Flutter (стабильный канал, v1.7.8 + исправление 2, в Microsoft Windows [версия 10.0.17763.557], локаль en-US)
• Flutter версии 1.7.8 + hotfix.2 в E: \ DevToolsflutter
• Версия Framework 2e540931f7 (7 дней назад), 2019-07-02 09:31:07 -0700
• Ревизия двигателя b1cb0d9e9b
• Dart версии 2.4.0

[√] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3)
• Android SDK в E: \ DevTools \ Android \ Sdk.
• Расположение Android NDK не настроено (необязательно; полезно для поддержки встроенного профилирования)
• Платформа android-28, build-tools 28.0.3
• ANDROID_SDK_ROOT = E: \ DevTools \ Android \ Sdk
• Бинарный файл Java: E: \ DevTools \ android-studio \ jre \ bin \ java
• Java-версия OpenJDK Runtime Environment (сборка 1.8.0_152-release-1343-b01)
• Принимаются все лицензии Android.

[√] Android Studio (версия 3.4)
• Android Studio в E: \ DevTools \ android-studio
• Плагин Flutter версии 37.0.1
• Плагин Dart версии 183.6270
• Java-версия OpenJDK Runtime Environment (сборка 1.8.0_152-release-1343-b01)

[√] Подключенное устройство (1 доступно)
• Android SDK для x86 • emulator-5554 • android-x86 • Android 8.1.0 (API 27) (эмулятор)

• Проблем не обнаружено!

Вдобавок - толстый apk тоже не запускается - после установки (на том же устройстве arm-32) и запуска он просто закрывается.
Пожалуйста, дайте мне знать, как продолжить и решить проблему, спасибо!

@ angel1st, возможно ли, что вы можете поделиться здесь своим файлом AAB и / или APK, чтобы мы могли помочь вам в устранении неполадок?

@truongsinh - конечно, вот они:

app-production-releases.zip

Я загрузил оба APK, хотя предполагаемая проблема связана с версией arm-32, как указано выше.

Ребята, а пока кто-нибудь будет так любезен и расскажет (если они знают), что будет после 1 августа в Google Play Store, если у вас нет версии вашего приложения для arm-64 - перестанет ли apk обслуживаться на устройствах arm64 или вы не сможете загрузить версию только для arm32 или обе?

@ angel1st Мне удалось запустить приложение (app-production-armeabi-v7a-release.apk) на Android 4.4.2 Galaxy S4. Хорошее приложение!

Я подозреваю, что это очень характерно для 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-битный материал] не распространяется на:

  • APK-файлы или пакеты приложений, явно ориентированные на Wear OS или Android TV, форм-факторы которых в настоящее время не поддерживают 64-разрядный код.
  • APK-файлы или наборы приложений, которые не распространяются на устройства под управлением Android 9 Pie или более поздней версии.

С 1 августа 2019 г .:

  • Все новые приложения и обновления приложений, которые включают собственный код, должны предоставлять 64-разрядные версии в дополнение к 32-разрядным версиям при публикации в Google Play.

Другими словами, приложения продолжают распространяться, хотя вы не можете загрузить новую версию существующего приложения или опубликовать новое приложение без соблюдения требований.

@ angel1st Мне удалось воспроизвести эту проблему на Galaxy S3 mini под управлением Android OS 4.1.2.

Логарифм:

[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 .

Копия @ jason-simmons

@truongsinh - спасибо за обзор.

@blasten - спасибо за оперативный отзыв. Насколько я понимаю, я ничего не могу сделать с банкоматом, кроме монитора №35838, скрестив пальцы, он разрешится в какой-то момент в этом месяце? Я считаю, что такая же проблема возникнет с любым другим apk для Android 4.1.2, скомпилированным с последним исправлением?
К вашему сведению - apk приложения, скомпилированный с предыдущей стабильной версией Flutter, не имеет этой проблемы (S3 mini с Android 4.1.2 - одно из моих тестовых устройств).

Кто-то еще получил сегодня письмо от Google, в котором говорилось

«Требуется действие: обновите свои приложения до 64-разрядной версии до 1 августа 2019 г.»

хотя уже публикуем как 32-битную, так и 64-битную версии?

Это говорит

К 1 августа 2019 г. все приложения, использующие собственный код, должны предоставить 64-разрядную версию для публикации обновления. На момент отправки этого письма по крайней мере одно из ваших приложений * еще не соответствует требованиям.

* Примечание. Этот список приложений отражает наилучшую оценку Google на момент отправки этого письма. (...)

Я полагаю, "наилучшая оценка" Google не верна?

Спасибо команде Flutter. Я обновляю Flutter и использую стабильный канал, и предупреждение исчезло.
надеюсь, что у тестеров не будет ошибок, но пока я не обнаружил ошибок с реальным устройством!

Спасибо, Team Flutter, обновление Flutter исправлением устраняет эту проблему при сборке .aab

Спасибо команде flutter за это достижение. Теперь продолжим программировать!

@ angel1st У меня также возникают проблемы с некоторыми устройствами Samsung.

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

@ abdullayev007 - спасибо! Предлагаю вам взглянуть на №35838, возможно, это как-то связано.

Все сделал как по инструкции но на 32 бит не устанавливается

Любой снимок экрана / журнал, показывающий, что установка 32-битного apk на 32-битное устройство не была успешной, и что это за модель устройства?
IMG-20190710-WA0000

Аппарат Samsung M10

@tvolkert Пожалуйста, дайте мне какое-нибудь решение для устранения следующей проблемы:
https://github.com/flutter/flutter/issues/36063

Спасибо

Я попробовал последнюю версию flutter от dev channel - v1.8.4. Я также создал новый проект - проект vanilla flutter и попытался создать на его основе версию, подписанную релизом. Размер его сборки и приложения составляет всего 10,4 мб. Но попробовал все вышеперечисленные шаги на этом пути, ничего не помогло. Может ли кто-нибудь дать четкий набор шагов для создания сборки, которую мы можем отправить в игровой магазин с помощью aab или apk с эмулятором и локальным устройством из флаттера. Прошло больше недели, у нас есть проект, построенный на флаттере, который не переходит в прод на android, но мы можем опубликовать его в appstore на ios. Некоторая помощь будет отличной.

`[✓] Flutter (Channel dev, v1.8.4, в Mac OS X 10.14.5, локаль en-US)
• Flutter версии 1.8.4 в / Users / muthu / muthu / devapps / flutter
• Версия Framework 954714c967 (7 дней назад), 2019-08-02 10:10:39 -0700
• Ревизия двигателя 26368225b5
• Dart версии 2.5.0 (сборка 2.5.0-dev.1.0 bd049f5b53)

[!] Android toolchain - разработка для Android-устройств (Android SDK версии 29.0.1)
• Android SDK по адресу ../Library/Android/sdk.
• Расположение Android NDK не настроено (необязательно; полезно для поддержки встроенного профилирования)
• Платформа android-29, build-tools 29.0.1
• Бинарный файл Java находится по адресу: / Applications / Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java.
• Java-версия OpenJDK Runtime Environment (сборка 1.8.0_152-release-1343-b01)
✗ Статус лицензии Android неизвестен.
Попробуйте переустановить или обновить Android SDK Manager.
См. 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 Runtime Environment (сборка 1.8.0_152-release-1343-b01)

[✓] VS Code (версия 1.36.1)
• VS Code в / Applications / Visual Studio Code.app/Contents
• Расширение Flutter версии 3.3.0

[✓] Подключенное устройство (доступно 3)
• Android SDK для x86 • emulator-5554 • android-x86 • Android 9 (API 28)
(эмулятор) `

@muthufmass , сообщите о новой проблеме с подробностями о том, что не работает, и о том, как воспроизвести сбой. Спасибо!

Может ли кто-нибудь дать четкую последовательность шагов для создания сборки, которую мы можем отправить в игровой магазин

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

Может ли кто-нибудь дать четкую последовательность шагов для создания сборки, которую мы можем отправить в игровой магазин

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

Эти шаги уже выполнены, он не работает над сборкой выпуска продукта. отладочная сборка работает! Я четко нахожу разницу, в отладочной сборке файлы флаттера .so присутствуют, но не в версии выпуска. Это те, которые создают проблему для установки apk в эмулятор или на устройства с подписанным apk.

@muthufmass , сообщите о новой проблеме с подробностями о том, что не работает, и о том, как воспроизвести сбой. Спасибо!

Надеюсь, я поделился очищенными шагами выше. Создание нового приложения с использованием flutter create - ванильный код с последней версией flutter sdk. Невозможно создать выпускную версию, а отладочные версии работают без сбоев. Значительная разница между prod и dev версией apk по размеру. Пробовал все вышеперечисленные шаги, но не смог создать работающую версию выпуска. Сборка происходит очень быстро, размер файла с выпуском составляет менее 11 МБ, а с отладочным apk - около 40 МБ +. Отладка apk работает, а apk с подписью prod release даже не устанавливается.

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

@muthufmass при flutter create .

@muthufmass, а также вывод adb logcat.

Эта проблема закрыта - отправьте нам новую проблему, чтобы мы могли ее отслеживать.

поднял отдельный тикет https://github.com/flutter/flutter/issues/37935

Если у вас были ароматы в вашем проекте и вы хотите поддерживать как x64, так и x32, просто добавьте папку jniLibs в свою папку вкусов, и она отлично работает, например
image

как я могу сделать это в Adobe Animate CC
нужна дополнительная информация

Консоль Google Play недавно начала отключать кнопку развертывания из-за различных предупреждений. И одно из этих предупреждений - использование apk вместо файла .aab. Есть решения для создания файла .aab, если проект был создан в Android Studio или Unity. Но что, если apk был создан Animate CC или Haxe / Flash Develop? Есть ли способ конвертировать?

@newapproach мне непонятно, имеет ли ваш комментарий какое-либо отношение к Flutter? Не могли бы вы подать новый выпуск с более подробной информацией? Спасибо!

Есть такая же проблема - но flutter.so не входит в папку "armeabi-v7a".
Имеет только сторонние библиотеки для x86 и armeabi-v7a, но без arm64.
Хотел бы построить флаттер только для "armeabi-v7a с
ndk {
abiFilters "armeabi-v7a" // тоже не работают "armeabi", "x86",
}
и установите в качестве целевой платформы, как @ mravn-google предлагает для android-arm.

APK без указания арки и без библиотек
screen shot 2018-07-26 at 21 06 53

APK с библиотеками и без спецификации руки
screen shot 2018-07-26 at 21 10 30

APK с указанием арки и включенными библиотеками
screen shot 2018-07-26 at 21 12 58

Есть предложения, как отлаживать дальнейшие шаги?

Я тоже нашел эту ошибку, она исправлена ​​?? Могли бы мне помочь?

Я рекомендую спросить о переполнении стека или открыть новую ошибку. Я сомневаюсь, что эта закрытая ошибка будет тем местом, где люди могут помочь вам решить указанную выше проблему. Спасибо!

Это было моим решением:

  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 в игровой магазин
  3. приращение versionCode
  4. запустить flutter build apk --release --target-platform=android-arm64
  5. загрузить app-arm64-v8a-release.apk в игровой магазин

Магазин Google Play будет обслуживать приложение в соответствии с архитектурой устройства. 32-битные устройства довольны, 64-битные устройства довольны, и мне приятно знать, что размер моего APK остается относительно небольшим, но при этом обслуживает обе архитектуры.

Если мы включим поддержку обеих архитектур в один и тот же APK, ожидайте, что размер вашего приложения будет не менее 10 МБ.

не работает .. когда я просматриваю его в игровом магазине на пикселе 2, он говорит, что не поддерживается для этого устройства

Это действительно работает, многие известные приложения развертывают несколько APK таким образом и позволяют Play Store обслуживать соответствующий файл на соответствующем устройстве в течение длительного времени.

Однако пакеты приложений - это современный способ сделать это.

Это действительно работает, многие известные приложения развертывают несколько APK таким образом и позволяют Play Store обслуживать соответствующий файл на соответствующем устройстве в течение длительного времени.

Однако пакеты приложений - это современный способ сделать это.

Тогда я не знаю, почему он не появляется в игровом магазине Pixel 2 ... Я следую точно, дважды, на всякий случай ...
Я использовал набор приложений, и мое приложение вылетает, поэтому я ищу альтернативы

Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Если вы все еще сталкиваетесь с подобной проблемой, откройте новую ошибку, включая вывод flutter doctor -v и минимальное воспроизведение проблемы.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги