启用Multidex后API19设备出现类找不到问题求助
你碰到的这个问题根源其实是低API设备上触发了对高版本系统类的引用,但你之前的multidex-config.txt配置方向完全错了——你添加的都是Android系统自带的类(比如JobScheduler是API 21才引入的,RippleDrawable也是API 21+),这些类根本不在你的应用Dex包里,所以配置multiDexKeepFile对它们完全无效。下面给你一步步的解决思路:
1. 修正Multidex保留类的配置
你需要把引用了这些高版本系统类的第三方库类加入主Dex,而不是系统类本身。比如报错里提到的com.google.android.gms.internal.zzcfr(它直接引用了JobScheduler)、android.support.v7.widget.AppCompatImageHelper(引用了RippleDrawable),要把这些类放到主Dex中:
修改你的multidex-config.txt内容为:
com/google/android/gms/internal/zzcfr.class android/support/v7/widget/AppCompatImageHelper.class
如果单个类配置太繁琐,推荐用multiDexKeepProguard代替multiDexKeepFile,它支持Proguard语法,能更灵活地保留整个包或类:
在Gradle的buildTypes中替换配置:
multiDexKeepProguard file('multidex-proguard-rules.pro')
然后创建multidex-proguard-rules.pro文件,添加:
-keep class com.google.android.gms.internal.zzcfr { *; } -keep class android.support.v7.widget.AppCompatImageHelper { *; }
2. 检查Google Play Services依赖版本
你使用的Google Play Services版本可能存在兼容性问题,建议升级到和compileSdkVersion匹配的稳定版本,或者只引入你实际需要的模块(避免引入冗余代码)。比如如果你用Firebase,不要引入整个play-services,拆分引入:
// 示例:只引入Firebase核心和Analytics模块 implementation 'com.google.firebase:firebase-core:16.0.8' implementation 'com.google.firebase:firebase-analytics:16.0.8'
这样既能减少方法数,也能降低低版本设备上出现兼容性问题的概率。
3. 确认Multidex基础配置无遗漏
虽然你已经做了基础配置,但再核对一遍细节:
- 确保
minSdkVersion确实是16(你当前配置符合要求,Multidex在API 21+是系统原生支持的,所以S7运行正常) - 自定义Application类的
attachBaseContext方法要在super调用前执行MultiDex.install:
@Override protected void attachBaseContext(Context base) { MultiDex.install(base); super.attachBaseContext(base); }
或者直接让Application继承MultiDexApplication:
public class MyApplication extends MultiDexApplication { // 你的业务代码 }
4. 低版本设备的额外排查步骤
如果以上步骤还没解决问题,可能是第三方库的代码在API 19上没有正确做版本判断就触发了高API类的引用,可以尝试:
- 禁用低版本设备上不需要的功能(比如Google Play Services中的JobScheduler相关功能,如果你的应用用不到的话)
- 清理项目缓存:执行
./gradlew clean后重新构建,避免旧的Dex缓存干扰
内容的提问来源于stack exchange,提问作者Eselfar




