React native 对react本机应用程序进行多重索引。。。疯狂
我试图理解android版本控制/多重索引/等等的疯狂,因为目前我的应用程序坏了 因此,出于各种原因,我决定只支持android 5.0(API 21/棒棒糖…啊!为什么它有3个名字!?)及更高版本。我知道有很多4.x设备,但我决定,如果它简化了我遇到的问题(5.0是第一个ART/dex2oat实现),那么我现在准备忽略5.0之前的用户 我所有的问题都是在从应用商店部署react本机应用程序时让其工作的背景下提出的 目前,在我的React native 对react本机应用程序进行多重索引。。。疯狂,react-native,classnotfoundexception,android-multidex,React Native,Classnotfoundexception,Android Multidex,我试图理解android版本控制/多重索引/等等的疯狂,因为目前我的应用程序坏了 因此,出于各种原因,我决定只支持android 5.0(API 21/棒棒糖…啊!为什么它有3个名字!?)及更高版本。我知道有很多4.x设备,但我决定,如果它简化了我遇到的问题(5.0是第一个ART/dex2oat实现),那么我现在准备忽略5.0之前的用户 我所有的问题都是在从应用商店部署react本机应用程序时让其工作的背景下提出的 目前,在我的模块/build.gradle文件中,我已将默认的react本机设置
模块/build.gradle
文件中,我已将默认的react本机设置更改为:
android {
compileSdkVersion 25
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com..."
minSdkVersion 21
targetSdkVersion 25
除此之外,我并没有故意弄乱任何其他设置。Proguard规则和缩小设置不变
我的应用程序有一些依赖项,比如react native maps,这让我轻松地超过了64k方法的限制(看起来很疯狂)。好吧,那我为什么要达到这个水平呢?好吧,看看我的APK中依赖项的方法计数,我看到了主要的罪魁祸首:
- com.google.android.gms:~18k方法
- com.facebook:~13k种方法
- android:~34k种方法
multiDexEnabled true
添加到我的module/build.gradle
文件(以及dexOptions->jumboMode->true
)…对吗
好的,启用了多索引,这就是我需要做的,因为我的目标是API21。我不需要在依赖项中添加compile'com.android.support:multidex:1.0.1'
,也不需要调用multidex.install(this)
;因为:
因此,如果Minsdk版本为21或更高,则不需要multidex支持库
(见附件)
好的,所以我尝试在物理android 6设备上本地运行我的应用程序,使用react native run android--variant=release
,该应用程序应该与我发布到应用商店时的应用程序相同。而且它似乎起了作用。酷
因此,接下来让我们做一个构建并将其提交到play store,并查看发布前报告……其中显示我的应用程序在4台或7台兼容设备上崩溃(可以理解,没有在其他7台v4.4设备上测试):
第一个错误现在(对我来说)是完全不可理解的。但在这种情况下,第二个更有趣:
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)
我对react native fabric有依赖性,它内部拉入这个crashlytics罐子。当我在本地运行时(在调试和发布模式下),它可以工作,根据谷歌发布前的报告,它也可以在其他一些设备上工作(Pixel使用安卓7.1,Pixel使用安卓O,Galaxy S7 Edge使用安卓6.0)。发生了什么事?班级在不在
所以我查看了一下我的APK,发现了135个dex文件(135!?怎么可能?)。然后使用dextump
查看我丢失的类是否真的存在…它是:
`Class descriptor : 'Lcom/crashlytics/android/Crashlytics;’`
问题3:这意味着什么?有些设备不能读取所有的.dex文件
我还在安卓5.0设备上测试了发布的APK,也得到了crashlytics错误
有人知道发生了什么事吗
(我有没有提到我现在有多讨厌Android?解决方案是什么?我面临着一个类似的问题。我不会将此作为答案发布,因为我忘记了细节。但基本上,我发现有一个版本的android(我想是22个)有一个严重的错误,从来没有被修复过。索引工作不正常,我的apk文件只包含我的类的一个子集,这就是为什么我得到如此多的ClassNotFoundExceptions。
`Class descriptor : 'Lcom/crashlytics/android/Crashlytics;’`