web-dev-qa-db-de.com

Android App Bundle führt Absturz bei nicht gefundener Ressource in Android App ein

Durch die Verwendung von Android new Android App Bundle habe ich in 2 meiner Google Play Store-Apps Abstürze gefunden, die nicht gefunden wurden: -

Hier ist der Stacktrace aus Stoff für eine der App: -

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 Abhängigkeiten: -

 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:[email protected]') {
    transitive = true;
}


implementation 'petrov.kristiyan:colorpicker-library:1.1.8'}

Eine weitere Sache, die es nur auf Android 4 Betriebssystem nicht auf neuen Versionen von Android .Was ich festgestellt habe, dass andere App das gleiche Problem von hat Ressource nicht gefunden, die vor der Verwendung von Android App Bundle nicht vorhanden war. Gibt es ein Problem in der Bibliothek oder im Code oder liegt es an der Beta-Version von Android App Bundle ?

enter image description here

Ich habe auch festgestellt, dass die Ressource gezeichnet werden kann, aufgrund derer sie abstürzt: - enter image description here

Ich denke, diese Frage hängt auch damit zusammen: - Fehler beim Aufblasen der Klasse Android.support.design.widget.NavigationView nach dem Hinzufügen von SwitchCompat in Android App Bundle

39
gautam kumar

Dies ist mit ziemlicher Sicherheit der Fall, dass Benutzer die App entweder über P2P-Freigabeprogramme teilen (von der Seite laden) oder die APK in das Web hochladen und dann andere Benutzer vom Web herunterladen und installieren.

Leute, die es gewohnt sind, nicht mit Android App Bundle-Apps umzugehen, übertragen einfach die Haupt-APK und geben sie frei. Aber Ihre App-Bundle-App enthält viele "aufgeteilte APKs" für Dinge wie die Ressourcen. Auf diese Weise wird Größe gespart. Sie können alles über diesen Vorgang auf der Hilfeseite nachlesen. Wenn ein Benutzer das Haupt-APK installiert, ohne die richtigen aufgeteilten APKs zu installieren, kommt es beim ersten Versuch der App, eine Ressource zu laden, zum Absturz.

Wenn Sie Benutzer dabei unterstützen möchten, Ihre App und nur das Haupt-APK von der Seite zu laden, können Sie versuchen, diese Situation zu erkennen und dem Benutzer eine Nachricht (ohne Verwendung von Ressourcen) mit der Aufschrift "Bitte von Google Play installieren" anzuzeigen. Oder Sie können einfach entscheiden, dass Sie Benutzer, die APKs gemeinsam nutzen, nicht auf diese Weise unterstützen.

Ich vermute, dass die Websites und P2P-Sharing-Programme auf lange Sicht besser in der Lage sein werden, solche APKs richtig zu teilen, damit ich mich nicht zu lange darum kümmern muss.

Wenn Sie feststellen, dass dies in niedrigeren Versionen vonAndroid weitaus häufiger vorkommt, liegt dies wahrscheinlich nicht an einem Fehler in niedrigeren Versionen vonAndroid. Stattdessen liegt es wahrscheinlich daran, dass in Ländern, in denen Benutzer häufig P2P-Apps gemeinsam nutzen (z. B. Indien), Benutzer mit einer weitaus höheren Wahrscheinlichkeit auch ältere Telefone verwenden.

29
Nick Fortescue

Das Problem ist wahrscheinlich, dass Ihre App von der Seite geladen wurde, d. H. Nicht über den Play Store installiert wurde und inkompatible APKs manuell auf diesen Geräten installiert wurden.

11
Pierre

Dies ist etwas spät, aber Google hat eine neue API für Sideloading crash prevention, mit dem Sie eine unvollständige Installation von Apps erkennen können, die mit einem Android App Bundle erstellt wurden.

Angenommen, eine App verwendet Android App Bundles zur Optimierung der App-Downloadgröße mithilfe von aufgeteilten APKs. Wenn ein Nutzer die App aus dem Google Play Store herunterlädt, stellt er sicher, dass das Gerät die App herunterlädt und installiert Vollständiger Satz geteilter APKs, die erforderlich sind, um diese App auf diesem bestimmten Gerät auszuführen Wenn Sie Google Play umgehen, um eine App seitlich zu laden, verfügt die Plattform nicht über ausreichende Daten, um die App-Installation zu validieren, und die ordnungsgemäße Funktionalität der App wird nicht garantiert.

Fügen Sie zunächst die Play Core-Bibliothek 1.6.0 oder höher in Ihr Projekt ein.

Fügen Sie Folgendes in die build.gradle-Datei Ihres App-Projekts ein:

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'
    }
}

Sie können eine der drei folgenden Methoden verwenden

1) Registriere Schecks durch das Manifest

<?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) Wenden Sie Prüfungen in einer benutzerdefinierten Anwendungsklasse an

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

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

        super.onCreate();
        ...
    }
}

3) Wenden Sie Prüfungen auf Inhaltsanbieter an

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

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

        super.onCreate();
        ...
    }
}

Lesen Sie mehr: https://developer.Android.com/reference/com/google/Android/play/core/release-notes?hl=en-419#1-6-

7
EAK TEAM

Die akzeptierte Antwort ist absolut richtig - Stamm dieses Problems ist das Seitenladen der APK-Datei.

Trotzdem suchen immer noch viele Menschen nach einer Lösung und fragen, wie sie mit diesem Fall richtig umgehen sollen.

In meiner App habe ich Folgendes getan:

  1. Erstellen Sie ein 1x1-Image mit dem Namen pixel.png und legen Sie es in allen folgenden Ordnern ab: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi.

  2. Erstellen Sie ein einfaches Activity, das eine statische Nachricht anzeigt, z.

    Diese Kopie der App ist beschädigt und kann nicht gestartet werden.

    Bitte installieren Sie die Originalversion von Google Play

  3. Rufen Sie dann einfach getDrawable(R.drawable.pixel) aus Activity.onCreate() in der try/catch-Klausel auf.

  4. Wenn die Ausnahme abgefangen wurde, beenden Sie einfach das aktuelle Activity und starten Sie ein neues ab Schritt # 2.

Getan!

Screenshot

Diese Lösung funktioniert gut, jetzt liegen mir sogar Daten von Firebase Analytics vor, die dies bestätigen.

Von den 46.000 neuen Benutzern (Ereignis first_open) haben 266 Benutzer diesen Fehler (der abgefangen wurde) erhalten und 221 Benutzer haben auf die Schaltfläche geklickt, die zu Google Play führt.

Hier ist mein Quellcode (auch verfügbar auf GitHub ):

DrawablesValidator.Java

import Android.annotation.SuppressLint;
import Android.app.Activity;
import Android.content.Intent;
import Android.content.res.Resources;
import Android.net.Uri;
import Android.os.Bundle;
import Android.support.annotation.NonNull;
import Android.util.TypedValue;
import Android.view.Gravity;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.Button;
import Android.widget.LinearLayout;
import Android.widget.Space;
import Android.widget.TextView;
import Android.widget.Toast;

public class DrawablesValidator extends Activity {
    public static void ensureDrawablesValid(@NonNull Activity activity) {
        try {
            // IMPORTANT create 1x1 image named pixel.png and put it to all folders
            //           drawable-mdpi
            //           drawable-hdpi
            //           drawable-xhdpi
            //           drawable-xxhdpi
            //           drawable-xxxhdpi
            activity.getDrawable(R.drawable.pixel);
        } catch (Resources.NotFoundException ex) {
            // NOTE optionally, report exception to Crashlytics or just an event to Analytics

            activity.finish();
            activity.startActivity(new Intent(activity, DrawablesValidator.class));
        }
    }

    // NOTE don't care about translations of text messages here, don't put them to strings.xml
    //      we assume, that if user is smart enough to get APK from outside and install it,
    //      then user will definitely understand few messages in English :)
    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle state) {
        super.onCreate(state);

        int dp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());
        int dp8 = dp * 8;
        int dp16 = dp * 16;
        int dp80 = dp * 80;

        LinearLayout root = new LinearLayout(this);
        root.setOrientation(LinearLayout.VERTICAL);
        root.setGravity(Gravity.CENTER_HORIZONTAL);
        root.setPadding(dp80, dp16, dp80, dp16);

        Space spaceTop = new Space(this);

        TextView title = new TextView(this);
        title.setPadding(0, dp8, 0, dp8);
        title.setTextSize(20);
        title.setText("Re-install app");

        TextView message = new TextView(this);
        message.setPadding(0, dp8, 0, dp8);
        message.setTextSize(16);
        message.setText("This copy of app is corrupted and can't be launched." +
                "\n\n" +
                "Please, install original version from Google Play");

        Button button = new Button(this);
        button.setPadding(dp16, dp8, dp16, dp8);
        button.setText("Continue");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName())));
                } catch (Exception ex) {
                    Toast.makeText(getApplicationContext(), "Can't open Google Play", Toast.LENGTH_SHORT).show();
                }
            }
        });

        Space spaceBottom = new Space(this);

        int wc = ViewGroup.LayoutParams.WRAP_CONTENT;
        int mp = ViewGroup.LayoutParams.MATCH_PARENT;

        root.addView(spaceTop, lp(0, 0, 1, -1));
        root.addView(title, lp(wc, wc, 0, -1));
        root.addView(message, lp(mp, wc, 0, -1));
        root.addView(button, lp(wc, wc, 0, Gravity.END));
        root.addView(spaceBottom, lp(mp, wc, 1, -1));

        setContentView(root);
    }

    private LinearLayout.LayoutParams lp(int width, int height, int weight, int gravity) {
        LinearLayout.LayoutParams result = new LinearLayout.LayoutParams(width, height);
        result.weight = weight;
        result.gravity = gravity;
        return result;
    }
}
6
Oleksii K.

Da dies nur auf Android 4 Geräten nach der Migration auf Android App Bundle geschieht, habe ich nach dem Hinzufügen eine Möglichkeit gefunden:

public class App extends Application {

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }

Und in build.gradle: -

Android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

wie in diesem Beitrag erklärt: - Mit Android vector Drawables bei Pre-Lollipop-Absturz

Zur zweiten Frage: - Fehler "Resource Not Found", res/drawable/abc_switch_thumb_material.xml nach dem Hinzufügen von SwitchCompat im Android App Bundle

Dies geschieht in allen Android Versionen. Ich habe die Apk seitlich geladen und in der Lage, den gleichen Fehler in logcat zu reproduzieren. Dies kann also nur durch Entfernen des SwitchCompat aus meinem Projekt behoben werden. Ich weiß, dass es sich um eine vorübergehende Korrektur handelt, und Google sollte mit Sicherheit etwas dagegen unternehmen, damit zumindest kein Absturz auftritt nach dem seitenladen der apk wäre vielleicht die umleitung zum play store die bessere option. Das Abstürzen der App nach der Migration auf Android App Bundle wirkt sich jedoch auf jeden Fall auf die Stabilität der App aus, da dies von vielen Benutzern regelmäßig durchgeführt wird.

3
gautam kumar

Sie können überprüfen , ob Benutzer die App gemeinsam nutzen , indem Sie Play Console anmelden. Play Console Wählen Sie Ihre App aus, auf der Sie das App-Bundle veröffentlichen statt apk.

Wählen Sie Android Vital -> ANRs & Abstürze und klicken Sie auf die Registerkarte Abstürze.

wählen Sie aus dem Spiel installieren

enter image description here

0
Ashish Singh

https://ourcodeworld.com/articles/read/331/Android-error-no-resource-found-that-matches-the-given-name-at-icon-with-value-drawable-icon

Über den obigen Link habe ich erfahren, dass sich die in der App verwendeten Symbole im Ordner mit den zeichnungsfähigen Ressourcen befinden sollten, während sich die Startsymbole im Ordner mit den mipmap-Ressourcen befinden sollten. Ich habe meine Icons übertragen und es hat bei mir funktioniert.

0