- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android分包MultiDex策略详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1.分包背景 。
这里首先介绍下MultiDex的产生背景.
当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多.
但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的Android系统做兼容.
为了解决方法数超限的问题,需要将该dex文件拆成两个或多个,为此谷歌官方推出了multidex兼容包,配合AndroidStudio实现了一个APK包含多个dex的功能.
我们在Android开发中,会不断的在App代码里面增加新功能,引入新的类库,如果不加控制的话,那么会碰到编辑器IDE爆出一下错误:
1
2
|
Error:Execution failed
for
task
':ttt:transformClassesWithDexForDebug'
.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [
0
,
0xffff
]:
65536
|
这个错误是Android应用的对方法总数有限制造成的。Android平台的Java虚拟机Dalvik在执行DEX格式的Java应用程序时,使用原生类型short来索引DEX文件中的方法。这意味着单个DEX文件可被引用的方法总数被限制为65536。通常APK包含一个classes.dex文件,因此Android应用的方法总数不能超过这个数量,这包括Android框架、类库和你自己开发的代码.
这个问题可以通过将一个DEX文件分拆成多个DEX文件解决.
2. 分包策略实现 。
Gradle 配置:
1
2
3
4
5
6
7
8
9
10
|
defaultConfig {
applicationId
"XXX"
minSdkVersion
14
targetSdkVersion
23
multiDexEnabled
true
}
.......
dependencies {
compile
'com.android.support:multidex:1.0.0'
}
|
在应用的Application 类重写方法:
1
2
3
4
5
|
@Override
protected
void
attachBaseContext(Context base) {
super
.attachBaseContext(base);
MultiDex.install(
this
);
}
|
3.分包效果说明 。
经过以上的配置,你的应用已经可以实现多个DEX文件了。当应用构建时,构建工具会分析哪些类必须放在第一个DEX文件,哪些类可以放在附加的DEX文件中。当它创建了第一个DEX文件后,如果有必要会继续创建附加的DEX文件,如classes2.dex, classes3.dex。Multidex的支持类库将被包含在应用的第一个DEX文件中,帮助实现对其它DEX文件的访问.
虽然Google解决了应用总方法数限制的问题,但并不意味着开发者可以任意扩大项目规模。Multidex仍有一些限制:
DEX文件安装到设备的过程非常复杂,如果第二个DEX文件太大,可能导致应用无响应。此时应该使用ProGuard减小DEX文件的大小.
由于Dalvik linearAlloc的Bug,应用可能无法在Android 4.0之前的版本启动,如果你的应用要支持这些版本就要多执行测试。 同样因为Dalvik linearAlloc的限制,如果请求大量内存可能导致崩溃。Dalvik linearAlloc是一个固定大小的缓冲区。在应用的安装过程中,系统会运行一个名为dexopt的程序为该应用在当前机型中运行做准备。dexopt使用LinearAlloc来存储应用的方法信息。Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB或16MB。当方法数量过多导致超出缓冲区大小时,会造成dexopt崩溃.
-Multidex构建工具还不支持指定哪些类必须包含在首个DEX文件中,因此可能会导致某些类库(例如某个类库需要从原生代码访问Java代码)无法使用.
4.对开发者的建议 。
开发者应该避免使用Google Guava这样的类库,它包含了13000多个方法.
尽量使用专为移动应用设计的Lite/Android版本类库,或者使用小类库替换大类库,例如用Google-gson替换Jackson JSON。而对于Google Protocol Buffers这样的数据交换格式,其标准实现会自动生成大量的方法。采用Square Wire的实现则可以很好地解决此问题.
在出现应用分包后低版本手机无法使用,高版本正常使用的问题时,可以考虑检查一下分包的配置是否正确.
总结 。
以上就是本文关于Android分包MultiDex策略详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关内容,如有不足之处,欢迎留言指出.
原文链接:http://www.cnblogs.com/renhui/p/7738421.html 。
最后此篇关于Android分包MultiDex策略详解的文章就讲到这里了,如果你想了解更多关于Android分包MultiDex策略详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想在我的应用程序中使用 multidex,起初我使用 depedencies :'com.google.android:multidex:0.1',但是编译后出现这个错误: Error:Execut
我的应用程序在 pre-21 上崩溃并出现 java.lang.NoClassDefFoundError app.module.SomeClass 错误。 我已经启用了 Multidex: build
按照以下位置提到的说明进行操作:https://developer.android.com/studio/build/multidex.html#mdex-gradle 我遇到错误找不到符号 clas
我收到以下错误。 致命异常:main 2.1.0 版的 VM 支持 multidex 安装 VM 支持 multidex,MultiDex 支持库被禁用。 安装 VM 支持 multidex,Mult
我已经尝试了互联网上的所有解决方案,但其中任何一个都有效,这是我的 gradle: android { compileSdkVersion 25 buildToolsVersion '
> Could not resolve all files for configuration ':app:debugCompileClasspath'. > Could not find co
为了启用多索引,我在 CustomApplication 类中有以下代码: @Override public void onCreate() { MultiDex.install(this);
找不到 multidex.jar (com.android.support:multidex:1.0.2)。在以下位置搜索: https://jcenter.bintray.com/com/andro
这是我的build.gradle,当我运行应用程序时,它报告这个错误消息: 错误:任务 ':app:transformClassesWithJarMergingForDebug' 执行失败。 com.
我正在尝试启用 MultiDex。我添加了 multiDexEnabled true和 compile 'com.android.support:multidex:1.0.3'构建.gradle。我做
我曾经在几天前收到 DexIndexOverflowException,我所做的是: a) 在我的 build.gradle 文件中将 multiDexEnabled true 添加到 default
我有以下争吵: 因此,对于一个较大的项目,我需要有多个应用程序,其中包含一个可重用的库模块,用于多种用途。不幸的是,我的库模块中的类和库的基本数量似乎超出了项目的 dex 限制具有以下 gradle
我下载了 SugarORM 源代码以将其用作库模块(因此我可以覆盖应用程序的“attachBaseContext”方法。 我已经看到问题SugarORM and multidex ,问题是我不知道
我在启用 multidex 时遇到问题。我正在使用 Android Studio,我在 DrawerLayoutWidget 上收到“找不到类”。这是设置 build.gradle apply plu
我在我的应用程序中遇到了 multidex 支持的问题,实际上应用程序安装正常,但在此过程中,一些 Activity 崩溃了,应用程序重新启动了主要 Activity 。在 logcat 中我发现了这
我有这个错误。 Error:Execution failed for task ':myApp:createDebugMainDexClassList'. com.android.ide.common
我正在创建一个新的 android 项目,并决定使用新的 AndroidX 替代支持库,可以在此处找到相关文档:https://developer.android.com/jetpack/androi
我最近发现了 Android 的新 MultiDex 功能,可用于处理具有超过 65,000 个引用的应用程序。请参阅:https://developer.android.com/tools/buil
我更新了所有内置工具、支持库和 google Play 服务。但我仍然收到以下错误: Error:Execution failed for task ':app:shrinkReleaseMultiD
我正在使用 CircledImageView 库。它在 lollipop+ android 版本上运行良好。但是在 kitkat 中它崩溃了。所以在谷歌搜索之后。我发现我必须在我的应用程序中实现 mu
我是一名优秀的程序员,十分优秀!