最近我一直在Android中进行多义处理,这个问题浮现在脑海:
要在android项目中启用multiDex
如果仅且仅添加以下行:
// gradle build config
multiDexEnabled true
该应用将编译并正常运行。
但是真正的解决方案是:
multiDexEnabled true
androidx.multidex
Application
类。 为什么仅添加multiDexEnabled true
可以正常运行并且项目成功运行?剩下的两个步骤呢?
我不考虑什么吗?
顺便说一句,我的minSdkVersion
是15
答案 0 :(得分:0)
Enable multidex for apps with over 64K methods此处是 Google 本身的链接。
当您的应用程序及其引用的库超过65,536个方法时,您会遇到一个构建错误,表明您的应用程序已达到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 Executable规范将单个DEX文件中可引用的方法总数限制为65,536,其中包括Android框架方法,库方法和您自己代码中的方法。在计算机科学的上下文中,术语Kilo K表示1024(或2 ^ 10)。由于65,536等于64 X 1024,因此该限制称为“ 64K参考限制”。
Android 5.0之前的Multidex支持
Android 5.0(API级别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'
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
取决于是否覆盖Application类,请执行以下操作之一:
如果不覆盖Application类,请编辑清单文件,以在 标记中设置android:name,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="android.support.multidex.MultiDexApplication" >
...
</application>
</manifest>
如果您确实重写了Application类,请如下进行更改以扩展MultiDexApplication(如果可能):
public class MyApplication extends MultiDexApplication { ... }
或者,如果您确实重写了Application类,但是无法更改基类,则可以改写attachBaseContext()方法并调用MultiDex.install(this)以启用multidex。
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
答案 1 :(得分:-1)
当您的应用超出方法/ dex大小限制(64K)时,会发生这种情况。
由于minSdk为15,因此您必须手动添加MultiDex,而Api 21+则不需要。
请执行以下操作以支持21年前的MultiDex
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
使您的应用程序类扩展MultiDexApplication
public class Application extends MultiDexApplication {}
或者,如果根本不想使用MultiDex,则可以使用Proguard剥离未使用的类和方法。