-
multidex你遇到的坑
-
multidex与你不得不说的秘密
-
multidex原理及实现就和你没得关系了,当然你想了解也可以。
Android SDK 为 21 或更高的问题解决了,那Android SDK 低于 21 的呢。咱接着往下看喽。
Android 5.0 之前的 Multidex 支持
为你的应用程序配置 multidex
如果你的 minSdkVersion 设置为 21 或更高,则默认启用 multidex,你不需要 multidex 库。
但是,如果你的 minSdkVersion 设置为 20 或更低,那么你必须使用 multidex 库并对你的应用项目进行以下修改:
1.修改模块级 build.gradle 文件以启用 multidex 并添加 multidex 库作为依赖项,如下所示:
- 使用AndroidX
android {
defaultConfig {
…
minSdkVersion 15
targetSdkVersion 30
multiDexEnabled true
}
…
}
dependencies {
implementation “androidx.multidex:multidex:2.0.1”
}
- 不使用AndroidX(已弃用)
android {
defaultConfig {
…
minSdkVersion 15
targetSdkVersion 30
multiDexEnabled true
}
…
}
dependencies {
implementation ‘com.android.support:multidex:1.0.3’
}
2.根据你是否覆盖 Application 类,执行以下操作之一:
- 如果你不覆盖 Application 类,请编辑你的清单文件以在 < application > 标记中设置 android:name,如下所示:
<manifest xmlns:android=“http://schemas.android.com/apk/res/android”
package=“com.scc.demo”>
<application
android:name=“androidx.multidex.MultiDexApplication” >
…
- 如果你确实覆盖了 Application 类,请将其更改为扩展 MultiDexApplication(非必须),如下所示:
public class MyApplication extends MultiDexApplication { … }
- 或者,如果你确实覆盖了 Application 类但无法更改基类,那么你可以覆盖 attachBaseContext() 方法和 callMultiDex.install(this) 以启用 multidex:
public class MyApp extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
注意: 在 MultiDex.install() 完成之前,不要通过反射或 JNI 执行 MultiDex.install() 或任何其他代码。 Multidex 跟踪不会跟随这些调用,导致 ClassNotFoundException 或由于 DEX 文件之间的类分区错误而导致验证错误。
现在,当你构建应用程序时,Android 构建工具会根据需要构建一个主要的 DEX 文件 (classes.dex) 和支持的 DEX 文件(classes2.dex、classes3.dex 等)。构建系统然后将所有 DEX 文件打包到你的 APK 中。
在运行时,multidex API 使用特殊的类加载器来搜索所有可用的 DEX 文件以查找你的方法(而不是仅在主 classes.dex 文件中搜索)。
multidex 库的限制
multidex 库有一些已知的限制,当你将其合并到应用程序构建配置中时,你应该注意并测试这些限制:
-
在启动期间将 DEX 文件安装到设备的数据分区上很复杂,如果辅助 DEX 文件很大,可能会导致应用程序无响应 (ANR) 错误。为避免此问题,请启用代码收缩以最小化 DEX 文件的大小并删除未使用的代码部分。
-
在 Android 5.0(API 级别 21)之前的版本上运行时,使用 multidex 不足以解决 linearalloc 限制(问题 78035)。此限制在 Android 4.0(API 级别 14)中有所增加,但这并没有完全解决。在低于 Android 4.0 的版本上,你可能会在达到 DEX 索引限制之前达到线性分配限制。因此,如果你的目标 API 级别低于 14,请在平台的这些版本上进行__彻底测试*,因为你的应用程序可能在启动时或加载特定类组时出现问题。
代码缩减可以减少或可能消除这些问题。
在主 DEX 文件中声明所需的类
如果你收到 java.lang.NoClassDefFoundError,那么你必须通过在构建类型中使用 multiDexKeepFile 或 multiDexKeepProguard 属性声明它们,根据主 DEX 文件中的要求手动指定这些附加类。 如果某个类在 multiDexKeepFile 或 multiDexKeepProguard 文件中匹配,则该类将添加到主 DEX 文件中。
multiDexKeepFile 属性
你在multiDexKeepFile其中指定的文件应每行包含一个类,格式为com/example/MyClass.class. 例如,你可以创建一个如下所示的文件multidex-config.txt:
com/scc/MyClass.class
com/scc/MyOtherClass.class
然后,你可以为构建类型声明该文件,如下所示:
android {
buildTypes {
release {
multiDexKeepFile file(‘multidex-config.txt’)
…
}
}
}
注意: Gradle 读取相对于build.gradle文件的路径,因此如果multidex-config.txt与build.gradle文件位于同一目录中,则上述示例有效。
multiDexKeepProguard 属性
该multiDexKeepProguard文件使用与 Proguard 相同的格式,并支持整个 Proguard 语法。
你在multiDexKeepProguard其中指定的文件应包含 -keep 任何有效 ProGuard 语法中的选项。例如, -keep com.scc.MyClass.class。你可以创建一个名为的文件 multidex-config.pro,如下所示:
-keep class com.scc.MyClass
-keep class com.scc.MyClassToo
如果要指定包中的所有类,文件如下所示:
-keep class com.scc.** { *; } // com.scc 包中的所有类
然后,你可以为构建类型声明该文件,如下所示:
android {
buildTypes {
release {
multiDexKeepProguard file(‘multidex-config.pro’)
…
}
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
下面是辛苦给大家整理的学习路线
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ndroid开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
下面是辛苦给大家整理的学习路线
[外链图片转存中…(img-dAxb9d8h-1712364428358)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!