在项目功能迭代中,项目文件增多,引用的的框架,第三方库会使你的apk包中的方法急剧上升,很快的就超过65k。
应用能正常运行在高版本的手机上,android 5.0-9.0 。当用一台android 4.4的手机运行程序时,无法正常启动应用。
运行时报错如下
RuntimeException: Unable to instantiate activity
ClassNotFoundException: Didn't find class on path: DexPathList[[zip file apk"],nativeLibraryDirectories=[/data/app-lib/bao-2, /vendor/lib, /system/lib, /data/datalib]]
面向百度/google寻找问题解决方案,基本所列解决方案如下:
1、统一使用的jar包版本。例如surpportv4的版本,保持版本一致
2、清除build文件夹重新编译、运行
3、manifest文件中的声明采用全路径,不用简写
4、更新gradle版本、adt版本
然而这些方法对我的项目,均未能见效。不慌,还有一个大招:重启手机、重启电脑。
最后从官方文档找到解决方案
如果 minSdkVersion 设置为 21 或更高值
模块级 build.gradle 文件中将 multiDexEnabled 设置为 true,如此处所示:
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
...
}
如果 minSdkVersion 设置为 20 或更低
必须按如下方式使用 Dalvik 可执行文件分包支持库:
- 修改模块级 build.gradle 文件以启用 Dalvik 可执行文件分包,并将 Dalvik 可执行文件分包库添加为依赖项,如此处所示:
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.3'
}
- 修改 Application
按如下方式对其进行更改以扩展 MultiDexApplicatio(如果可能):
public class MyApplication extends MultiDexApplication { ... }
或者,如果替换了 Application 类,但无法更改基本类,则可以改为替换 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 Dalvik 可执行文件分包:
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
构建应用后,Android 构建工具会根据需要构建主 DEX 文件 (classes.dex
) 和辅助 DEX 文件(classes2.dex
和 classes3.dex
等)。然后,构建系统会将所有 DEX 文件打包到您的 APK 中。
运行时,Dalvik 可执行文件分包 API 使用特殊的类加载器来搜索适用于您的方法的所有 DEX 文件(而不是仅在主 classes.dex
文件中搜索)。
至此,您的应用可以运行在不同的Android版本了,不用担心方法数超限,启动闪退了
参考链接:
https://blog.csdn.net/xiaxl/article/details/83089944
https://www.cnblogs.com/wingyip/p/4496028.html
https://developer.android.com/studio/build/multidex
http://frogermcs.github.io/MultiDex-solution-for-64k-limit-in-Dalvik/
网友评论