You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

启用Multidex后API19设备出现类找不到问题求助

解决API 19设备上Multidex启用后类找不到的问题

你碰到的这个问题根源其实是低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

火山引擎 最新活动