android - 为什么只添加 multiDexEnabled 工作正常
问题描述
最近我一直在为 android 中的 multidexing 苦苦挣扎,我想到了这个问题:
在 android 项目中启用 multiDex
如果您仅且仅添加此行:
// gradle build config
multiDexEnabled true
该应用程序将编译并正常工作。
但真正的解决方案是:
- 添加
multiDexEnabled true
- 添加支持库
androidx.multidex
- 覆盖
Application
类。
为什么只添加multiDexEnabled true
作品和项目成功运行?剩下的两个步骤呢
我不是在考虑什么吗?
顺便说一句,我minSdkVersion
是 15
解决方案
为具有超过 64K 方法的应用程序启用 multidex这是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'
- 修改模块级build.gradle文件以启用 multidex 并将 multidex 库添加为依赖项,如下所示:
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
根据您是否覆盖 Application 类,执行以下操作之一:
如果您不覆盖 Application 类,请编辑清单文件以在标记如下:
<?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);
}
}
推荐阅读
- python - 根据缺少的日期时间值添加空数据框行
- html - 如何使一个 HTML 元素与另一个元素成比例地动态调整大小?
- java - 通过 Jest 将 Elasticsearch 索引的一部分重新索引到新索引上
- delphi - 如何使用 CNG 从智能卡(USB 令牌)获取证书存储?
- python - 如何使用用户输入使用 Tkinter 编写输出?
- jmeter - 如何计算在 JMeter 中完成一个线程组所花费的总时间?
- sql - 在 SQL Server 中计算年龄范围
- javascript - 使用 axios 在同一站点上单独的身份验证会话
- r - 在 ggplot 中将 geom_line mean 添加到重新排序的 geom_point 图
- microsoft-graph-api - Microsoft Graph delta:重复的日历事件返回不正确的开始/结束