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