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