安卓应用捆绑包引入资源 未找到 在安卓应用中崩溃

2022-08-31 14:32:33

通过使用Android的新Android App Bundle,我在2个Google Play商店应用程序中收到了错误。Resource Not Found

下面是其中一个应用程序的构造堆栈跟踪:

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 4操作系统上,而不是在较新版本的Android上。我发现其他应用程序也存在同样的问题,这在使用Android的应用程序捆绑包之前并不存在。库或代码中是否存在一些问题,或者这是因为Android应用程序捆绑包的测试版?Resource Not Found

我还发现资源可绘制,由于它崩溃了:-Screenshot showing the highlighted drawable resource that causes the problem.

我认为这个问题也与此有关:在Android应用程序包中添加SwitchCompat后,资源未找到错误res/drawable/abc_switch_thumb_material.xml


答案 1

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

习惯于处理非Android应用程序捆绑包应用程序的人只是转移和共享主要的APK。但是您的App捆绑包应用程序在资源之类的东西上有很多“拆分APK”,这就是大小节省的方式。您可以在帮助页面上阅读有关此过程的所有信息。如果用户在安装主 APK 时未安装正确拆分的 APK,则应用首次尝试加载资源时将发生“找不到资源”崩溃。

如果您想支持用户旁加载您的应用程序,并且只加载主APK,您可以尝试检测到这种情况并向用户显示一条消息(不使用任何资源),内容为“请从Google Play安装”。或者,您可以决定不支持以这种方式共享APK的用户。

我怀疑从长远来看,网站和P2P共享程序会更好地正确共享此类APK,所以我不会花太长时间担心它。

如果你在较低的Android版本上看到这种情况发生得更频繁,这可能不是由于较低Android版本中的错误。相反,这可能是因为在用户通常P2P共享应用程序的国家(例如印度),用户也更有可能使用旧版本的手机。


答案 2

这有点晚了,但Google已经引入了新的API for,它允许您检测使用Android应用程序包构建的应用程序的不完整安装。Sideloading crash prevention

例如,假设某个应用使用 Android 应用捆绑包,通过拆分 APK 优化应用下载大小。当用户从 Google Play 商店下载应用时,系统会确保设备下载并安装在该特定设备上运行该应用所需的全套拆分版 APK。当您绕过 Google Play 旁加载应用时,平台没有足够的数据来验证应用安装,并且无法保证应用的正确功能。

首先,在项目中包含 Play Core 库 1.6.0 或更高版本。

在应用项目的 build.gradle 文件中包含以下内容:

buildscript {
    dependencies {
        ...
        // Use bundletool 0.9.0 or higher when building with the
        // Android Gradle plugin.
        classpath 'com.android.tools.build:bundletool:0.9.0'
    }
}

您可以使用以下3种方法中的1种

1) 通过清单注册支票

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication" >
    <application
        ...
        android:name="com.google.android.play.core.missingsplits.MissingSplitsDetectingApplication" >
    </application>
    ...
</manifest>

2) 在自定义应用程序类中应用检查

public class MyCustomApplication extends Application {
    @Override
    public void onCreate() {

        if (MissingSplitsManagerFactory.create(this).disableAppIfMissingRequiredSplits()) {
            // Skip app initialization.
            return;
        }

        super.onCreate();
        ...
    }
}

3) 对内容提供商应用检查

public class ExampleProvider extends ContentProvider {
    @Override
    public boolean onCreate() {

        if (MissingSplitsManagerFactory.create(getContext()).isMissingRequiredSplits()) {
            // Skip provider initialization.
            return false;
        }

        super.onCreate();
        ...
    }
}

阅读更多 : https://developer.android.com/reference/com/google/android/play/core/release-notes?hl=en-419#1-6-0


推荐