一、概述

Android 应用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可执行字节码文件,其中包含用来运行您的应用的已编译代码。Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及您自己代码中的方法。在计算机科学领域内,术语千(简称 K)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此这一限制也称为“64K 引用限制”,详细介参考谷歌官方配置文档。

谷歌中文官方配置使用文档

二、Multidex使用简单配置

// 1. Gralde 配置

android {

defaultConfig {

...

minSdkVersion 15

targetSdkVersion 29

multiDexEnabled true

}

...

}

dependencies {

implementation 'androidx.multidex:multidex:2.0.1'

}

// 2. 清单配置

package="com.example.myapp">

android:name="com.xxx.MyApplication" >

...

// 3. Application初始化

public class MyApplication extends SomeOtherApplication {

@Override

protected void attachBaseContext(Context base) {

super.attachBaseContext(base);

MultiDex.install(this);

}

}

如果就这么简单我写这个也没什么意义,最主要看下面的高配置,和我所遇到的坑。

四、将一些找不到的类打包到主Dex,使用multiDexKeepProguard 属性

如果APP安装失败,调试日志出现 NoClassDefFoundError、ClassNotFoundException、NoSuchMethodException等异常,就需要将这些找不到的类,配置到主的DEX 文件中,以至于在APP初始化的时候能找到这些类。

配置方法(和混淆(proguard)一样):

在build.gradle文件同级目录下创建一个multidex-config.pro(根据官方命名)配置文件。

在文件中添加找不到的类,如下所示:

-keep class com.example.MyClass

如果想一次配置包下的类都打包到主Dex,还可以这样写:

-keep class com.example.** { *; }

在build.gradle文件配置

android {

buildTypes {

release {

multiDexKeepProguard file('multidex-config.pro')

...

}

}

}

AOP过滤配置(针对一些特殊的场景)

aspectjx {

// 这里太关键了

exclude 'com.alipay'

exclude 'com.google.android.gms.analytics'

}

五、总结

Multidex使用有很多坑,尽量将自己的APP去三方平台做云真机兼容性测试。如阿里移动测试、testin云测试等,推荐去云测试上去做真机调试,调试完有调试日志。

在三方平台用真机调试一些不能过的机型,调试运行失败后,下载调试日志,就可以找到上面我讲的那几个错误。

如果没有类找不到那些异常,对于下面这些错误:

DexOpt: --- END 'cn.xxx.xxx-1.apk.classes4.zip' --- status=0x000e, process failed

MultiDex installation failure

java.io.IOException: unable to open DEX file

是Dex太大,在低端机型加载失败所致。如果你的Dex不能在小了,你就放弃这些机型吧(字节跳动有方案,不过还没开源,有兴趣可以去微信关注了解一下)。

看一下我的测试成果,其实还是有些机型不行的,但对我们APP的用户来讲,应该是没什么影响的了。

78f2e2d9484a

测试成果.jpg

Logo

一站式 AI 云服务平台

更多推荐