博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 分包 MultiDex 策略总结
阅读量:5265 次
发布时间:2019-06-14

本文共 2139 字,大约阅读时间需要 7 分钟。

1.分包背景

我们在Android开发中,会不断的在App代码里面增加新功能,引入新的类库,如果不加控制的话,那么会碰到编辑器IDE爆出一下错误:

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 配置:

defaultConfig {          applicationId "XXX"       minSdkVersion 14       targetSdkVersion 23       multiDexEnabled true}.......dependencies {    compile 'com.android.support:multidex:1.0.0'}

在 应用的Application 类重写方法:

@Overrideprotected void attachBaseContext(Context base) {   super.attachBaseContext(base);   MultiDex.install(this);}

配置好相关方法后,必须Clean或者Rebuild下项目,否则可能看到的还是存在问题的现象。

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的实现则可以很好地解决此问题。
  • 在出现应用分包后低版本手机无法使用,高版本正常使用的问题时,可以考虑检查一下分包的配置是否正确。

参考文章:

  1. https://developer.android.com/studio/build/multidex.html
  2. https://developer.android.com/topic/libraries/support-library/features.html#multidex

转载于:https://www.cnblogs.com/renhui/p/7738421.html

你可能感兴趣的文章
20145203盖泽双 《Java程序设计》第6周学习总结
查看>>
Delphi 7 过期的问题
查看>>
使用libjpeg把iplImage转jpeg
查看>>
大数据测试指标(一)
查看>>
Java Socket 检测远程地址可否通信
查看>>
Gridview用法大总结(牛年珍藏版)
查看>>
[代码]强制浏览器重定向到另一页
查看>>
javaweb中的乱码问题
查看>>
(47)zabbix报警媒介:Ez Texting
查看>>
MySQL数据库 基本操作
查看>>
请大家规范电子邮件用法养成好的邮件习惯
查看>>
微信游戏和微信公众号小说如何有效做好域名防封,给大家分享我的有效经验...
查看>>
前端跨域知识总结
查看>>
C# 通过 Quartz .NET 实现 schedule job 的处理
查看>>
关于java之socket输入流输出流可否放在不同的线程里进行处理
查看>>
dom操作
查看>>
python基础——流程控制语句
查看>>
Raspberry Pi GPIO Protection
查看>>
架构漫谈阅读感想
查看>>
《掌握需求过程》阅读笔记---01
查看>>