MultiDex分包跟版本有关?

来源:9-4 构建速度优化

she_says

2021-07-19

“minSdkVersion设置在21以下,获得更多的Android系统兼容性,导致构建过程中需要执行MultiDex分包,是一个很耗时的过程。在开发期间把这个值改为21及以上”

我的问题是MultiDex分包不是只要方法数超限就会分吗?版本在21以下要显示说明,在21及以上默认分。

写回答

1回答

allenfeng

2021-07-19

你好,关于分包是否开启,你的理解是对的。

视频中表述的不够详尽,这里针对做minSdkVersion<21时候的分包耗时问题做进一步的说明:


在5.0及更高版本的手机上,系统会在应用安装时执行预编译,扫描查找所有classesN.dex 文件合并成一个。后续应用启动时直接加载这个合成后的产物就可以一次性把所有类加载进来满足运行过程中的使用。

反观低于5.0版本的手机上,并没有上述机制。应用启动后,系统默认只能识别classes.dex,那么在使用Multidex加载所有Dex进来之前,我们是无法访问到所有类的。 这时候就要严格确保MultiDex加载完成之前的代码执行流程中要用到的所有类都放在主Dex中,以避免ClassNotFound异常。

所以,若是minSdkVersion<21,为了确定哪些类放在主Dex,哪些类放在其他Dex,编译过程就要额外进行复杂的计算, 进而加大整个编译耗时。


综上,要解决这个耗时问题,可以临时指定minSdkVersion>=21。


进一步的资料,可以参考:

https://developer.android.com/studio/build/multidex#dev-build

https://developer.android.com/studio/build/multidex#keep




1
2
别人家的小孩_
回复
she_says
请问这个和minSdkVersion,我感觉没啥关系,如果系统是android 10 的但是minSdkVersion是21以下的,难道不会扫描查找所有classesN.dex 文件合并成一个吗
2022-11-08
共2条回复

Android 应用程序构建实战+原理精讲

深度掌握 Gradle 使用,系统性学习 Android 应用构建知识

450 学习 · 116 问题

查看课程