我正在试图弄清楚android版本/ multidexing / etc的疯狂,因为目前我的应用程序已经坏了。
因此,由于各种原因,我决定只支持android 5.0(API 21 / LOLLIPOP ......唉!为什么有3个名字!?)及以后。我知道有很多4.x设备,但我已经决定,如果它简化了我的问题(5.0是第一个ART / dex2oat实现),那么我准备忽略5.0之前的用户现在
我所有的问题都是在从应用程序商店部署反应原生应用程序时使用。
目前,在我的module/build.gradle
文件中,我已将默认的react-native设置更改为:
android {
compileSdkVersion 25
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com..."
minSdkVersion 21
targetSdkVersion 25
除此之外,我并没有故意搞砸任何其他设置。 Proguard规则和缩小设置不变。
我的应用程序有一些依赖项,例如react-native-maps,这让我轻松地超过(看似疯狂的)64k方法限制。好的,为什么我达到这个水平?那么,看看我的APK中的依赖项的方法计数,我看到主要的罪魁祸首:
这给我带来了〜65K方法!而且只考虑了1个依赖(react-native-maps)。我的其余部分将这超过147k的方法(超过限制的两倍)。深入了解android包是看到大多数方法都在支持包中。
Q1:什么是支持包?为什么在反应原生应用程序中有4个总计约20k的方法???如何在没有打开multidex的情况下构建一个简单的反应本机应用程序?
Q2:我需要将multiDexEnabled true
添加到我的module/build.gradle
文件(以及dexOptions -> jumboMode -> true
)...对吗?
好的,所以启用了multidex,这就是我需要做的所有事情,因为我的目标是API 21.我不需要将compile 'com.android.support:multidex:1.0.1'
添加到我的依赖项中,我也不需要调用{{1 }};因为:
“因此,如果您的minSdkVersion为21或更高,则不需要multidex支持库”
(见https://developer.android.com/studio/build/multidex.html)。
好的,所以我尝试使用MultiDex.install(this)
在物理android 6设备上本地运行我的应用程序应该给我与应用程序商店发布时相同的应用程序。它似乎工作。凉。
所以,接下来让我们做一个构建并将其提交到游戏商店并查看预启动报告...这显示我的应用程序在4个或7个兼容设备上崩溃(并且未在其他7个v4上测试.4设备可以理解):
react-native run-android --variant=release
第一个错误现在完全不可理解(对我来说)。但是在这种情况下秒秒更有趣:
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;
我依赖于react-native-fabric,它在内部引入了这个crashlytics jar。它适用于我本地运行(在调试和发布模式下),并根据谷歌预发布报告,它也适用于其他一些设备(Pixel with Android 7.1,Pixel with Android O和Galaxy S7 Edge with Android 6.0) 。发生什么了?班级在哪里?
所以我查看了我的APK并找到了135个dex文件(135!?这怎么可能?)。然后使用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)
来查看我的遗失类是否真的存在......它是:
dexdump
问:问:这是什么意思?有些设备只是没有读取所有的.dex文件?
我还在Android 5.0设备上测试了发布的APK,并且还遇到了崩解错误。
有没有人对发生的事情有任何线索。
(我现在提到我有多讨厌Android了吗?)