Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
React native 对react本机应用程序进行多重索引。。。疯狂_React Native_Classnotfoundexception_Android Multidex - Fatal编程技术网

React native 对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本机设置

我试图理解android版本控制/多重索引/等等的疯狂,因为目前我的应用程序坏了

因此,出于各种原因,我决定只支持android 5.0(API 21/棒棒糖…啊!为什么它有3个名字!?)及更高版本。我知道有很多4.x设备,但我决定,如果它简化了我遇到的问题(5.0是第一个ART/dex2oat实现),那么我现在准备忽略5.0之前的用户

我所有的问题都是在从应用商店部署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种方法
这让我已经有了~65K种方法!这只考虑了1个依赖项(react native maps)。我的DEP的其余部分将此设置为超过147k个方法(超过限制的两倍)。更深入地看一下android软件包,可以发现大多数方法都在支持软件包中

问题1:什么是支持包?为什么react原生应用程序中有4个方法,总共有约20k个方法???任何人如何在不打开multidex的情况下构建一个简单的react本机应用程序

问题2:我需要将
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;’`