切换到Android应用程序包分发后,应用程序有时会与Resources $NotFoundException崩溃
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了切换到Android应用程序包分发后,应用程序有时会与Resources $NotFoundException崩溃,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8155字,纯文字阅读大概需要12分钟。
内容图文
![切换到Android应用程序包分发后,应用程序有时会与Resources $NotFoundException崩溃](/upload/InfoBanner/zyjiaocheng/708/0084b31963f84227802bad52756ef85d.jpg)
应用程序每月活跃用户超过20000.
几个月来它一直在谷歌上播放.
在我最近从使用.apk的分发切换到使用.aab进行分发之后,我开始接收崩溃和谷歌游戏商店的随机崩溃.在引入崩溃的构建中没有进行任何其他重大更改.
崩溃发生在应用程序的第一个屏幕上,同时膨胀xml布局.有问题的xml布局是一个简单的初始屏幕,只包含一个图像视图和一个textview. imageview是android.widget.ImageView,不是compat版本,它显示png图像,而不是矢量图像.图像存在于所有可绘制的文件夹变体中:drawable,drawable-mdpi,…,drawable-xxxhdpi.
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company/com.company.ui.splash.SplashActivity}: android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class ImageView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class ImageView
Caused by android.view.InflateException: Binary XML file line #14: Error inflating class ImageView
Caused by android.content.res.Resources$NotFoundException: Drawable (missing name) with resource ID #0x7f0800b2
Caused by android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f0800b2
at android.content.res.ResourcesImpl.getResourceName(ResourcesImpl.java:255)
at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:785)
at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:631)
at android.content.res.Resources.loadDrawable(Resources.java:897)
at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:955)
at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
at android.widget.ImageView.<init>(ImageView.java:189)
at android.widget.ImageView.<init>(ImageView.java:172)
at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:71)
at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:67)
at android.support.v7.app.AppCompatViewInflater.createImageView(AppCompatViewInflater.java:181)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:105)
at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1035)
at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1092)
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.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
at com.company.ui.splash.SplashActivity.onCreate(SplashActivity.java:58)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
导致崩溃的xml文件的一部分:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/center"
android:layout_centerHorizontal="true"
android:src="@drawable/logo" />
崩溃发生在所有Android版本上,从4.1.2到9.0.
除了其他设备,我还收到了谷歌Pixel和Nexus 5X的崩溃,两者都没有根源.我碰巧拥有这两种设备.我已经尝试从Google Play和侧载服务(如pureapk)安装我的应用程序,但我无法重现崩溃.
问题类似于Android App Bundle introduces Resource Not found crash in Android app,但在那个问题中,作者能够通过使用矢量drawable compat来解决他的问题.这不是我的情况.
虽然测试这个假设很难,但似乎不知何故从apk中缺少整个资源文件夹.我无法重现这个问题,所以我将重新分发应用程序并等待几天,看看崩溃是如何变化的,我宁愿不对实时用户进行测试.
当这个错误发生时,它通常会在同一设备的行中多次发生,这让我相信得到此错误的用户无法启动应用程序.此外,我知道以前使用该应用程序的一些用户不能再使用它了.
所以,总结一下:
1.在google play上切换到android应用程序包分发后,崩溃开始出现
2.应用程序首次尝试恢复可绘制资源时崩溃 – 一个简单的png图像
3.崩溃不是特定于android版本的;它发生在有根和无根设备上
如果用户得到这个bug,他可能会永远陷入困境
是什么导致这次崩溃?有解决方法吗?
==========
更新:阅读下面的答案后我得出结论,唯一的解决方法是检测sideload安装,然后打开活动,没有任何可绘制的资源或样式链接到Google Play和官方网站与旧学校apk文件.然后,用户可以从其他来源重新下载应用程序.
这是我用来检测应用程序是否被侧载的代码(如果您的应用程序中没有本机库,则可能需要删除nativeLibrariesPresent部分):
private fun isValidInstallation(): Boolean {
var resourcesPresent: Boolean
try {
// Any drawable id will suffice
val logo = ResourcesCompat.getDrawable(resources, R.drawable.logo_white, null)
resourcesPresent = logo != null
} catch (e: Exception) {
resourcesPresent = false
}
if (!resourcesPresent) {
Timber.e("No drawable resources detected inside app")
}
var nativeLibrariesPresent: Boolean
try {
val nativeLibraryDir = File(applicationInfo.nativeLibraryDir)
val primaryNativeLibraries = nativeLibraryDir.list()
nativeLibrariesPresent = primaryNativeLibraries.isNotEmpty()
} catch (e: Exception) {
nativeLibrariesPresent = false
}
if (!nativeLibrariesPresent) {
Timber.e("No native libraries detected inside app")
}
return resourcesPresent && nativeLibrariesPresent
}
在主要活动中执行任何操作之前,您需要启动替代活动:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!isValidInstallation()) {
val intent = Intent(this, InvalidInstallationActivity::class.java)
startActivity(intent)
finish()
return
}
setContentView(R.layout.activity_main)
...
InvalidInstallationActivity可以使用xml布局,如果不按语言(语言{enableSplit = false})拆分aab,它可以使用字符串资源,但它不能使用任何可绘制资源.
解决方法:
这几乎可以肯定是用户通过P2P共享程序共享应用程序,或者将APK上传到网络,然后是其他用户从网上下载和安装.
过去常常处理非Android App Bundle应用的用户只需转移并共享主APK.但是你的应用程序包应用程序有很多“拆分APK”用于资源等事情,这就是节省大小的方式.您可以阅读有关此过程on the help page的所有信息.如果用户安装主APK而未安装正确的分割APK,则在应用首次尝试加载资源时将发生“未找到资源”崩溃.
如果您想支持用户侧载您的应用程序而只支持主APK,您可以尝试检测此情况并向用户显示消息(不使用任何资源),并显示“请从Google Play安装”.或者您可能只是决定不支持以这种方式共享APK的用户.
我怀疑从长远来看,网站和P2P共享程序将更好地分享这些APK,所以我不会花太多时间担心它.
内容总结
以上是互联网集市为您收集整理的切换到Android应用程序包分发后,应用程序有时会与Resources $NotFoundException崩溃全部内容,希望文章能够帮你解决切换到Android应用程序包分发后,应用程序有时会与Resources $NotFoundException崩溃所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。