Android 为什么只添加启用了多重索引就可以了

Android 为什么只添加启用了多重索引就可以了,android,android-multidex,Android,Android Multidex,最近,我一直在为android中的多重索引而挣扎,我想到了这个问题: 在android项目中启用多索引 如果您仅且仅添加此行: // gradle build config multiDexEnabled true 该应用程序将编译并运行良好。 但真正的解决办法是: 添加启用了多索引的true 添加支持库androidx.multidex 重写应用程序类。 为什么只添加启用了多重索引的true works和project运行成功?剩下的那两步呢 我不是在考虑什么吗 顺便说一句,我的Minsdk

最近,我一直在为android中的多重索引而挣扎,我想到了这个问题:

在android项目中启用多索引

如果您仅且仅添加此行:

// gradle build config
multiDexEnabled true
该应用程序将编译并运行良好。 但真正的解决办法是:

添加启用了多索引的true 添加支持库androidx.multidex 重写应用程序类。 为什么只添加启用了多重索引的true works和project运行成功?剩下的那两步呢

我不是在考虑什么吗


顺便说一句,我的Minsdk版本是15

当你的应用程序超过了methods/dex大小限制64K时,就会发生这种情况。 由于minSdk为15,因此必须手动添加多索引,这在Api 21+上是不需要的

执行以下操作以支持Pre-21上的MultiDex 依赖关系{ 实现'com.android.support:multidex:1.0.3' }

使应用程序类扩展多索引应用程序

public class Application extends MultiDexApplication {}
或者,如果您根本不想使用MultiDex,您可以使用Proguard剥离未使用的类和方法。

这是Google自己的链接

当您的应用程序及其引用的库超过65536个方法时,您会遇到一个生成错误,表明您的应用程序已达到Android生成架构的限制:

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.
较旧版本的生成系统报告不同的错误,这表明存在相同的问题:

Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
这两种错误情况都显示一个通用数字:65536。此数字表示单个Dalvik可执行DEX字节码文件中的代码可以调用的引用总数。本页介绍如何通过启用称为multidex的应用程序配置来克服此限制,该配置允许应用程序生成和读取多个DEX文件

关于64K参考极限

Android应用程序APK文件包含Dalvik可执行DEX文件形式的可执行字节码文件,其中包含用于运行应用程序的编译代码。Dalvik可执行文件规范将单个DEX文件中可引用的方法总数限制为65536,包括Android框架方法、库方法和您自己代码中的方法。在计算机科学的上下文中,术语Kilo,K表示1024或2^10。由于65536等于64 X 1024,因此该限值被称为“64K参考限值”

Android 5.0之前的多索引支持

Android 5.0 API level 21之前的平台版本使用Dalvik运行时执行应用程序代码。默认情况下,Dalvik将应用程序限制为每个APK的单个classes.dex字节码文件。为了克服此限制,您可以将multidex支持库添加到项目中:

dependencies {
    def multidex_version = "2.0.1"
    implementation 'androidx.multidex:multidex:$multidex_version'
}
如果未使用AndroidX,请添加以下支持库依赖项:

implementation 'com.android.support:multidex:1.0.3'
修改模块级build.gradle文件以启用multidex,并将multidex库添加为依赖项,如下所示: 根据是否重写应用程序类,执行以下操作之一:

如果不重写应用程序类,请编辑清单文件以在标记中设置android:name,如下所示:

public class MyApplication extends MultiDexApplication { ... }
或者,如果确实重写了应用程序类,但无法更改基类,则可以重写attachBaseContext方法并调用MultiDex.installthis以启用MultiDex

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

你的MinSDK版本是什么?低到足以让gradle抛出multidex错误,通常为16。我知道它是什么,何时发生,以及解决方案是什么。我想知道为什么只添加启用多重索引的true works和应用程序编译。。。不添加任何其他要执行的步骤。使用Proguard.:你的意思是它有效是因为。。。我已经在5.0或更高版本的设备上进行了测试?不管明斯克?
public class MyApplication extends MultiDexApplication { ... }
public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}