Мультидексирование реактивного приложения... безумие

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

Поэтому по разным причинам я решил поддерживать только Android 5.0 (API 21 / LOLLIPOP … аааа! Почему для него есть 3 названия!?) и далее. Я знаю, что существует множество устройств 4.x, но я решил, что если это упростит мою проблему (5.0 была первой реализацией ART / dex2oat), то я готов игнорировать пользователей до 5.0 для сейчас.

Все мои вопросы связаны с тем, чтобы заставить приложение работать на себя при развертывании из магазина приложений.

В настоящее время в моем module/build.gradle Файл, который я изменил по умолчанию:

android {

  compileSdkVersion 25
  buildToolsVersion "23.0.3"

  defaultConfig {
    applicationId "com..."
    minSdkVersion 21
    targetSdkVersion 25   

Кроме этого, я сознательно не испортил ни одну из других настроек. Правила Proguard и настройки минификации остаются без изменений.

У моего приложения есть несколько зависимостей, таких как response-native-maps, которые удобно ставят меня за (казалось бы, безумный) предел в 64k метода. Хорошо, так почему я достиг этого уровня? Что ж, глядя на количество методов в моем APK, я вижу главных виновников:

  • com.google.android.gms: ~ 18 тыс. методов
  • com.facebook: ~13k методов
  • Android: ~34 тыс. методов

Это ставит мне ~65K методов уже! И это только с 1 зависимостью (response-native-maps), принятой во внимание. Остальная часть моих отделов описала это более 147 тыс. Методов (более чем в два раза). И, посмотрев немного глубже в пакет android, вы увидите, что большинство методов находятся в пакете поддержки.

Q1: что такое пакет поддержки? И почему их 4 в приложении с естественной реакцией на общую сумму около 20 тыс. Методов??? Как кто-то может создать даже тривиальное приложение, не поддерживающее мультидекс?

Q2: мне нужно добавить multiDexEnabled true к моему module/build.gradle файл (а также dexOptions -> jumboMode -> true)… право?

Итак, мультидекс включен, и это все, что мне нужно сделать, потому что я нацеливаюсь на API 21. Мне не нужно добавлять compile 'com.android.support:multidex:1.0.1' к моим зависимостям и мне не нужно звонить MultiDex.install(this); так как:

"Поэтому, если ваш minSdkVersion 21 или выше, вам не нужна библиотека поддержки multidex"

(см. https://developer.android.com/studio/build/multidex.html).

Итак, я пытаюсь запустить свое приложение локально на физическом устройстве Android 6, используя react-native run-android --variant=release который должен дать мне то же приложение, что и при выпуске в магазин приложений. И это похоже на работу. Здорово.

Итак, теперь давайте сделаем сборку и отправим ее в магазин воспроизведения и посмотрим на отчет перед запуском... который показывает, что мое приложение упало на 4 или 7 совместимых устройствах (и не тестировалось на 7 других устройствах v4.4). по понятным причинам):

Pixel   Android 7.1 English Native crash of /system/bin/dex2oat
Galaxy S6   Android 5.1 English java.lang.NoClassDefFoundError: Failed resolution of: Lcom/crashlytics/android/Crashlytics;

Первая ошибка совершенно непонятна (для меня) прямо сейчас. Но секунды более интересны в этом контексте:

05-17 05:29:51.998: E/AndroidRuntime(12656): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.crashlytics.android.Crashlytics" on path: DexPathList[[zip file "/data/app/com.myappname-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myappname-1/lib/arm, /vendor/lib, /system/lib]]
05-17 05:29:51.998: E/AndroidRuntime(12656):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)

У меня есть зависимость от response-native-fabric, которая внутренне тянет в этом флешку. Он работает, когда я работаю локально (в обоих режимах отладки и выпуска), и согласно отчету Google Pre-launch, он также работает на некоторых других устройствах (Pixel с Android 7.1, Pixel с Android O и Galaxy S7 Edge с Android 6.0), Так, что происходит? Класс есть или нет?

Поэтому я заглянул в свой APK и нашел 135 файлов dex (135!? Как это возможно?). А потом использовал dexdump чтобы увидеть, если мой пропавший класс на самом деле там... что это:

`Class descriptor  : 'Lcom/crashlytics/android/Crashlytics;’`

Q3: Так что это значит? Некоторые устройства просто не читают все файлы.dex?

Я также протестировал выпущенный APK на устройстве Android 5.0, а также получил ошибку crashlytics.

Кто-нибудь имеет хоть малейшее представление о том, что происходит.

(Я уже упоминал, как сильно я ненавижу Android сейчас?)

0 ответов

Другие вопросы по тегам