android - 拆分 apk 后出现 ResourceNotFoundException
问题描述
在将 App-Bundle 集成到我的专业应用程序中后,我在为 ImageView 充气时通过 Crashlytics 遇到了很多关于应用程序第一个屏幕的问题。
这是ResourceNotFoundException。
Caused by: android.view.InflateException: Binary XML file line #48: Binary XML file line #48: Error inflating class ImageView
Caused by: android.view.InflateException: Binary XML file line #48: Error inflating class ImageView
Caused by: android.content.res.Resources$NotFoundException: Drawable (missing name) with resource ID #0x7f08009d
Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f08009d
at android.content.res.ResourcesImpl.getResourceName(ResourcesImpl.java:242)
at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:739)
at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:609)
at android.content.res.Resources.loadDrawable(Resources.java:885)
at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:953)
at android.content.res.TypedArray.getDrawable(TypedArray.java:928)
at android.widget.ImageView.<init>(ImageView.java:188)
at android.widget.ImageView.<init>(ImageView.java:171)
at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:72)
at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:68)
at androidx.appcompat.app.AppCompatViewInflater.createImageView(AppCompatViewInflater.java:187)
at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:107)
at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1267)
at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1317)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:470)
at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:141)
at io.example.SplashScreen.onCreate(SplashScreenActivity.kt:50)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
2019-03-11 12:13:52.605 14143-14143/? E/AndroidRuntime:在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit 的 java.lang.reflect.Method.invoke(Native Method)。主要(ZygoteInit.java:767)
当然一开始我无法重现,然后我用bundletool做了很多尝试。我见过类似的线程,但没有充分挖掘问题。
我发现从密度较低的捆绑包中生成 apk 可以重现崩溃。
通过我的尝试,我提取了 Nexus6P 规格如下
{
"supportedAbis": ["x86"],
"supportedLocales": ["en_US"],
"screenDensity": 560,
"sdkVersion": 26
}
然后我将 screenDensity 更改为 320 甚至 120,这会导致崩溃。深入了解我们拥有的*.apks生成文件:
- base-en.apk
- 基础 ldpi.apk
- 基础master.apk
我目前有 mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi 文件夹。
我尝试添加 drawable-ldpi 文件夹但徒劳无功。
我检查了 base-ldpi.apk 以查看未找到的资源,它很好地存在于 apk 中。
作为快速修复,我可以从 gradle 配置中禁用密度拆分,甚至关闭应用程序包,但我希望有一个更好的结局。
任何想法 ?谢谢 :)
解决方案
推荐阅读
- angular - Angular 在显示网站前几秒钟加载白屏
- django - 如何在 Live 服务器上部署 django 项目?
- javascript - Formdata 维度数组追加
- html - 无法向菜单添加过渡
- mysql - 登录/注册表单只允许每个人使用 MYSQL 登录一次
- php - Laravel - 使用子查询创建模型
- go - 如果未提供证书,单元测试 tls.LoadX509KeyPair 将失败
- php - 寻找在模型视图和控制器之间传递数据的最佳方式
- python - 根据Python中的计数器值将列表拆分为多个子列表
- ios - 如何从弹出视图控制器获取数据到自定义表格视图单元格?