升级Android Support Library至27.1.0后遇ListViewCompat类找不到错误
问题描述
升级Android Support Library从26.0.2到27.1.0后,触发java.lang.NoClassDefFoundError,提示无法解析android.support.v7.widget.ListViewCompat类。
Gradle配置
apply plugin: 'com.android.application' android { compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { applicationId 'APPLICATION_ID' minSdkVersion 17 targetSdkVersion 27 versionCode 240 versionName "2.4.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } useLibrary 'org.apache.http.legacy' buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { } compileOptions { targetCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:27.1.0' implementation 'com.android.support:support-v4:27.1.0' implementation 'com.android.support:support-v13:27.1.0' implementation 'com.android.support:support-vector-drawable:27.1.0' implementation 'com.android.support:recyclerview-v7:27.1.0' implementation 'com.android.support:cardview-v7:27.1.0' androidTestImplementation 'com.android.support:support-annotations:27.1.0' implementation 'com.google.android.gms:play-services-location:11.0.4' implementation 'com.google.android.gms:play-services-analytics:11.0.4' implementation 'com.google.android.gms:play-services-gcm:11.0.4' api 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' implementation 'com.android.support:support-media-compat:27.1.0' implementation 'com.squareup.picasso:picasso:2.71828' } apply plugin: 'com.google.gms.google-services'
报错日志
05-18 02:56:15.744 13645-13645/net.kord_music.android E/AndroidRuntime: FATAL EXCEPTION: main Process: net.kord_music.android, PID: 13645 java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/widget/ListViewCompat; at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:400) at com.activeandroid.ModelInfo.scanForModelClasses(ModelInfo.java:187) at com.activeandroid.ModelInfo.scanForModel(ModelInfo.java:152) at com.activeandroid.ModelInfo.<init>(ModelInfo.java:63) at com.activeandroid.Cache.initialize(Cache.java:66) at com.activeandroid.ActiveAndroid.initialize(ActiveAndroid.java:44) at com.activeandroid.ActiveAndroid.initialize(ActiveAndroid.java:34) at com.activeandroid.ActiveAndroid.initialize(ActiveAndroid.java:30) at com.activeandroid.app.Application.onCreate(Application.java:25) at system.G.onCreate(G.java:51) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1028) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5658) at android.app.ActivityThread.-wrap2(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1637) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:156) at android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.widget.ListViewCompat" on path: DexPathList[[zip file "/data/app/net.kord_music.android-1/base.apk"],nativeLibraryDirectories=[/data/app/net.kord_music.android-1/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:380) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 20 more
解决方案
我之前也碰到过一模一样的问题,其实这个错误的核心原因很清晰:android.support.v7.widget.ListViewCompat在Support Library 26.x版本之后就被官方移除了,它的所有功能已经被整合到原生的ListView组件中,官方推荐如果需要更灵活的列表展示,可以用RecyclerView替代。结合你的报错场景,我给你整理了几个针对性的解决步骤:
1. 排查代码中的直接引用
先检查你自己的代码(包括Java/Kotlin文件和XML布局):
- 如果Java代码里有
import android.support.v7.widget.ListViewCompat;,直接替换成import android.widget.ListView;,所有调用ListViewCompat的地方改成ListView即可; - 如果XML布局里用了
<android.support.v7.widget.ListViewCompat>,改成<ListView android:layout_width="match_parent" android:layout_height="match_parent" .../>就行,原生ListView已经包含了ListViewCompat的所有特性。
2. 处理依赖库的隐性引用
从报错日志可以看到,这个类是在ActiveAndroid扫描模型类的时候触发的,说明ActiveAndroid的旧版本依赖了过时的Support Library,间接引用了ListViewCompat。你可以这样处理:
- 尝试升级ActiveAndroid到最新的兼容版本(如果项目中是通过Maven引入的,找最新快照版或者稳定版即可);
- 如果找不到合适的新版本,就在Gradle依赖中排除ActiveAndroid自带的Support Library依赖,强制它使用你当前的27.1.0版本。假设你用的ActiveAndroid版本是
3.1.0-SNAPSHOT,修改依赖声明如下:
(如果你的ActiveAndroid是通过libs目录下的jar包引入的,建议换成Maven依赖,这样才能做依赖排除操作)implementation 'com.activeandroid:activeandroid:3.1.0-SNAPSHOT' { exclude group: 'com.android.support', module: 'appcompat-v7' }
3. 清理项目缓存
有时候旧的编译缓存会导致类加载异常,执行以下操作彻底清理:
- 在Android Studio中点击
Build > Clean Project,然后Build > Rebuild Project; - 或者在项目根目录的终端执行命令:
./gradlew clean build
4. 检查ProGuard配置(仅针对release版本)
因为你的release版本开启了minifyEnabled true,也要确保ProGuard没有误删相关类。可以在proguard-rules.pro中添加以下规则:
-keep class android.widget.ListView { *; }
按照这些步骤操作后,应该就能解决这个NoClassDefFoundError问题了。
内容的提问来源于stack exchange,提问作者Saman
相关产品推荐
相关产品推荐

