切换到Android应用程序包分发后,应用程序有时会与Resources $ NotFoundException崩溃

Ale*_*xey 29 android google-play

应用程序每月活跃用户超过20000.几个月来它一直在Google Play上播放.在我最近从使用.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)
Run Code Online (Sandbox Code Playgroud)

导致崩溃的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" />
Run Code Online (Sandbox Code Playgroud)

崩溃发生在所有Android版本上,从4.1.2到9.0.

除了其他设备,我还收到了谷歌Pixel和Nexus 5X的崩溃,两者都没有根源.我碰巧拥有这两种设备.我已经尝试从Google Play和侧载服务(如pureapk)安装我的应用程序,但我无法重现崩溃.

问题类似于Android应用程序包在Android应用程序中引入资源未发现崩溃,但在该问题中,作者能够通过使用矢量drawable compat解决他的问题.这不是我的情况.

虽然测试这个假设很难,但似乎不知何故从apk中缺少整个资源文件夹.我无法重现这个问题,所以我将重新分发应用程序并等待几天,看看崩溃是如何变化的,我宁愿不对实时用户进行测试.

当这个错误发生时,它通常会在同一设备的行中多次发生,这让我相信得到此错误的用户无法启动应用程序.此外,我知道以前使用该应用程序的一些用户不能再使用它了.

总而言之:
1.在谷歌播放
2 切换到Android应用程序包分发后崩溃开始出现.应用程序崩溃它第一次尝试恢复可绘制资源 - 一个简单的png图像
3.崩溃不是android-version具体; 它发生在root和非root设备上
4.如果用户遇到这个bug,他可能会永远陷入困境

是什么导致这次崩溃?有解决方法吗?

Nic*_*cue 25

这几乎可以肯定是用户通过P2P共享程序共享应用程序,或者将APK上传到网络,然后是其他用户从网上下载和安装.

过去常常处理非Android App Bundle应用的用户只需转移并共享主APK.但是你的应用程序包应用程序有很多"拆分APK"用于资源等事情,这就是节省大小的方式.您可以在帮助页面上阅读有关此过程的所有信息.如果用户在未安装正确拆分APK的情况下安装主APK,则在应用首次尝试加载资源时将发生"未找到资源"崩溃.

如果您想支持用户侧载您的应用程序而只支持主APK,您可以尝试检测此情况并向用户显示消息(不使用任何资源),并显示"请从Google Play安装".或者您可能只是决定不支持以这种方式共享APK的用户.

我怀疑从长远来看,网站和P2P共享程序将更好地分享这些APK,所以我不会花太多时间担心它.

  • 相信我,Google Play确实使用拆分APK(我在Google Play上工作).这些独立的APK用于调试,而不是传递给用户的内容.有关详细信息,请参阅此帮助页面:https://developer.android.com/guide/app-bundle/#dynamic_delivery (7认同)
  • 嗨@NickFortescue。我们在我们的应用程序中看到了同样的问题。看来,OEM 备份工具(来自三星和华为)是问题所在,因为圣诞节后崩溃率增加了(新设备!?)。该问题的最佳做法是什么?因为我们需要资产的PNG,所以我们不能完全切换到VectorDrawables。我不知道,如果恢复的应用程序显示 PlayStore 作为安装源。如果没有,我可以向用户显示 AlertDialog 以重新安装应用程序,但在不知情的情况下,我无能为力。- PS:在我们的应用程序中,我们禁止备份。 (2认同)