使用Android App Bundle导致安卓应用出现Resource Not Found崩溃
Android App Bundle在Android 4上引发Resource Not Found错误的排查与解决
你在改用Android App Bundle发布两款应用后,遇到了只在Android 4系统上出现的Resource Not Found错误,新版本安卓完全正常,这个问题其实挺常见的,咱们来一步步拆解:
首先看你提供的Fabric堆栈跟踪信息:
Unable to start activity ComponentInfo{/com.Lastyear.MainActivity}: android.content.res.Resources$NotFoundException: File res/drawable/abc_item_background_holo_dark.xml from drawable resource ID #0x7f08002c at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5363) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) at dalvik.system.NativeStart.main(NativeStart.java)
还有你的应用build.gradle依赖配置:
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) testImplementation 'junit:junit:4.12' implementation 'com.android.support.constraint:constraint-layout:1.1.2' implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:customtabs:27.1.1' implementation 'com.android.support:cardview-v7:27.1.1' implementation 'com.squareup.picasso:picasso:2.5.2' implementation 'com.android.support:palette-v7:27.1.1' implementation 'com.afollestad.material-dialogs:core:0.9.6.0' implementation 'com.jakewharton:butterknife:8.8.1' implementation 'com.github.bumptech.glide:glide:3.7.0' implementation 'com.android.support:design:27.1.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' implementation 'com.github.hotchemi:android-rate:1.0.1' implementation 'com.hannesdorfmann.smoothprogressbar:library:1.0.0' implementation 'com.android.support:palette-v7:27.1.1' implementation 'com.google.android.gms:play-services-ads:15.0.1' implementation 'com.muddzdev:styleabletoast:1.0.9' implementation 'com.github.GrenderG:Toasty:1.2.5' implementation 'com.hannesdorfmann.smoothprogressbar:library:1.0.0' implementation 'com.wang.avi:library:2.1.3' implementation 'com.github.medyo:fancybuttons:1.8.4' implementation 'com.irozon.sneaker:sneaker:1.0.1' implementation 'com.sdsmdg.tastytoast:tastytoast:0.1.1' implementation 'de.hdodenhof:circleimageview:2.2.0' implementation 'com.github.barteksc:android-pdf-viewer:2.8.2' implementation 'com.getkeepsafe.taptargetview:taptargetview:1.11.0' implementation('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') { transitive = true; } implementation 'petrov.kristiyan:colorpicker-library:1.1.8' }
问题根源分析
这个问题不是你的代码或者第三方库的问题,而是Android App Bundle针对Android 4系统的兼容性缺陷:
App Bundle的核心特性之一是资源按需拆分,会把资源按语言、密度、ABI等维度拆分成不同的模块,让用户只下载需要的资源。但Android 4的资源解析器无法正确处理这种拆分后的资源模块,尤其是AppCompat库提供的兼容资源(比如你碰到的abc_item_background_holo_dark.xml),就会触发Resources$NotFoundException。
很多开发者改用App Bundle后都遇到了类似的AppCompat资源找不到的问题,和你提到的同类问题本质原因完全一致。
可行的解决方案
给你几个实用的解决办法,你可以根据自己的需求选择:
- 完全禁用App Bundle的资源拆分
在你的模块build.gradle的android块中添加以下配置,这样会生成一个包含所有资源的通用APK,避免旧系统找不到拆分后的资源:
android { // ...其他已有配置 bundle { language { enableSplit = false } density { enableSplit = false } abi { enableSplit = false } } }
- 针对Android 4单独发布传统APK
如果你不想放弃App Bundle的优势,可以借助Google Play的多APK发布功能:
- 为Android 4.x设备单独编译并上传一个传统的完整APK
- 其他更高版本的设备继续使用App Bundle发布
- 升级AppCompat库到最新稳定版
虽然不能彻底解决,但升级到最新的AppCompat稳定版本(比如你当前用的27.1.1可以升级到更高的稳定版),部分版本可能修复了和App Bundle的兼容问题,降低这类错误的出现概率。
内容的提问来源于stack exchange,提问作者gautam
相关产品推荐
相关产品推荐

