Пакет Android App Bundle представляет сбой "Ресурс не найден" в приложении для Android

Используя новый Android App Bundle для Android, я обнаружил, что ресурс не найден в двух из моих приложений в магазине Google Play: -

Вот трассировка стека из ткани для одного из приложений: -

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. Я обнаружил, что другое приложение имеет ту же проблему с Resource Not Found, которая не существовала до использования пакета приложений Android. Есть ли проблема в библиотеке или коде, или это из-за бета-версии пакета приложений Android?

[! [введите описание изображения здесь] [1]] [1]

Я также обнаружил, что ресурс доступен для рисования, из-за чего происходит сбой: -  введите описание изображения здесь

Я думаю, что этот вопрос также связан с этим: - Resource Not Found error res / drawable / abc_switch_thumb_material.xml после добавления SwitchCompat в Android App Bundle


person gautam    schedule 22.05.2018    source источник
comment
Вы можете попытаться воспроизвести проблему локально, используя bundletool и эмулятор со спецификациями, соответствующими устройству, которое видит сбой. Добавление еще некоторого контекста, такого как зависимости и потенциальная структура модуля, упрощает понимание того, что здесь происходит.   -  person keyboardsurfer    schedule 25.05.2018
comment
Я попытался воспроизвести ошибку с помощью bundletool, но не могу сделать это ни на одном из проверенных устройств. Тем временем я добавил скриншот и зависимости.   -  person gautam    schedule 03.07.2018
comment
Я знаю, что это уже немного поздно, но как вам удалось загрузить файл aab на firebase?   -  person Filipe Silvestrim    schedule 17.06.2019


Ответы (8)


Это почти наверняка пользователи совместно используют (загружают неопубликованные приложения) приложение либо через программы обмена P2P, либо загружают APK в Интернет, а затем другие пользователи загружают и устанавливают его из Интернета.

Люди, которые привыкли иметь дело с приложениями, отличными от Android App Bundle, просто передают и делятся основным APK. Но в вашем приложении App Bundle есть много «разделенных APK» для таких вещей, как ресурсы, вот как происходит экономия размера. Вы можете прочитать все об этом процессе на странице справки. Если пользователь устанавливает основной APK без установки правильных разделенных APK, то при первой попытке приложения загрузить ресурс произойдет сбой «Ресурсы не найдены».

Если вы хотите поддержать пользователей, загружающих ваше приложение и только основной APK, вы можете попытаться обнаружить эту ситуацию и отобразить сообщение пользователю (без использования каких-либо ресурсов), в котором говорится: «Пожалуйста, установите из Google Play». Или вы можете просто решить, что не собираетесь поддерживать пользователей, которые делятся APK таким образом.

Я подозреваю, что в долгосрочной перспективе веб-сайты и программы обмена P2P станут лучше при правильном обмене такими APK, поэтому я не буду слишком долго беспокоиться об этом.

Если вы видите, что это происходит гораздо чаще в более ранних версиях Android, вероятно, это не из-за ошибки в более ранних версиях Android. Вероятно, это связано с тем, что в странах, где пользователи обычно используют P2P-приложения (например, в Индии), пользователи также с гораздо большей вероятностью будут использовать телефоны старых версий.

person Nick Fortescue    schedule 31.10.2018
comment
Есть ли способ обнаружить боковую загрузку? У меня были похожие проблемы, и я прибегал к распространению APK вместо пакетов. Сообщения о сбоях (и приходящие электронные письма о сбоях) отнимают много времени и вызывают беспокойство. Невозможно легко определить, жалуется ли пользователь из-за ошибки в приложении или проблемы, связанной с пакетом / боковой загрузкой. Я бы счел это недостатком в дизайне пакета, поскольку они должны были это предусмотреть и предоставить встроенный механизм для обнаружения этого (и, возможно, автоматически загрузить оставшиеся APK или отобразить красивую ошибку). - person strangetimes; 02.12.2018
comment
См. Этот ТАК вопрос. stackoverflow.com/questions/10809438/ - person Nick Fortescue; 03.12.2018
comment
Нет, это не так. У меня такая же проблема, и я регистрирую пакет установщика, он правильно настроен на com.android.vending. - person Stéphane; 03.05.2019
comment
@NickFortescue Я подтвердил, что эта проблема возникает даже у пользователей, которые НЕ загружают приложение неопубликованно. У меня есть отчеты, особенно с устройств Vivo. Я подозреваю, что Play неправильно генерирует APK. Какие шаги я могу предпринять, чтобы помочь в этом? - person NoHarmDan; 04.09.2019
comment
Это кажется невероятным, но интересным. Я больше не работаю в Play, но наиболее полезным будет отчет об ошибке с затронутого устройства - см. developer.android.com/studio/debug/bug-report. Затем обратитесь в службу поддержки разработчиков Play через консоль Play, чтобы передать его соответствующей команде. Также убедитесь, что пользователь установил приложение прямо из Play Store. - person Nick Fortescue; 05.09.2019
comment
Если вы не можете получить отчет об ошибке, сведения об учетной записи Gmail, используемой для Google Play на затронутом телефоне, и модели телефона будут очень полезны. Это поможет разработчикам Google Play попытаться воспроизвести и точно знать, какой APK должен быть доставлен. (Не сообщайте об этом здесь из соображений конфиденциальности пользователей. Вместо этого отправьте информацию в службу поддержки разработчиков Google Play) - person Nick Fortescue; 05.09.2019
comment
Теперь диалоговое окно боковой загрузки не отображается, изменил ли Google что-то в этом отношении, пожалуйста, помогите. Он показывает только приложение, которое не установлено после установки, спасибо - person Vindhya Pratap Singh; 10.10.2019

Это немного поздно, но Google представил новый API для Sideloading crash prevention, который позволяет обнаруживать незавершенную установку приложений, созданных с помощью Android App Bundle.

Например, рассмотрим приложение, которое использует пакеты Android App Bundle для оптимизации размера загрузки приложения с помощью разделенных 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'
    }
}

Вы можете использовать один из трех приведенных ниже способов

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

person EAK TEAM    schedule 14.06.2019
comment
Вы пробовали реализовать это самостоятельно? У вас возникли проблемы с этим? Потому что я пробовал бежать через другую проблему. Вот объяснение моей проблемы. Пожалуйста, загляните в него и, если у вас есть ответ, дайте мне знать. stackoverflow.com/questions/56725415/ - person Naveen T P; 25.06.2019
comment
Большое спасибо! Это должен быть новый принятый ответ: D - person elsennov; 08.08.2019
comment
@NaveenTP, я использую его, так как они публикуют этот API, все работает нормально - person EAK TEAM; 08.08.2019
comment
@EAKTEAM Привет! Можно ли настроить missing_splits_activity? Кто-нибудь знает что-нибудь об этом? По крайней мере, мы можем изменить язык диалогового сообщения - person Ensar Bayhan; 24.09.2019
comment
Ensar, активность изменить нельзя. Но насчет языка не волнуйтесь, Google позаботится об этом, только если вы не реализовали resconfig в своем build.gradle. - person EAK TEAM; 24.09.2019
comment
@EAKTEAM Спасибо за информацию. Но когда я попробовал использовать неанглоязычный телефон, диалоговое сообщение все еще отображается на английском языке. Я не реализовал resconfig. Должен ли я сделать что-нибудь еще? - person Ensar Bayhan; 25.09.2019
comment
Предостережение: поскольку эти проверки выполняются всякий раз, когда пользователь открывает ваше приложение, время запуска вашего приложения может немного увеличиться. (Примечание написано в developer.android.com/guide/app-bundle/sideload- проверить) - person Livio; 18.11.2019
comment
С какой целью нам нужно включить com.android.tools.build:bundletool:0.9.0 в качестве плагина Gradle? Мы ничего не применяем, есть ли в этом смысл? - person galex; 18.03.2020
comment
MissingSplitsManagerFactory теперь устарел с комментарием: теперь эта функция устарела. Установки с отсутствующими разделениями теперь блокируются на устройствах, на которых активна Play Protect или которые работают на Android 10. - person tomi44g; 08.02.2021

Вероятно, проблема заключается в том, что ваше приложение загружено неопубликованно, то есть не установлено через Play Store, и несовместимые APK-файлы были вручную установлены на эти устройства.

person Pierre    schedule 30.05.2018
comment
Нет, это вряд ли проблема, так как это происходит только в Android 4. - person gautam; 01.07.2018
comment
Тогда рекомендуется попытаться воспроизвести рекомендацию @keboardsurfer. - person Pierre; 01.07.2018
comment
Я пытаюсь воспроизвести его с помощью bundletool, но он выдает ошибку Невозможно установить разделенные APK на устройство с уровнем API ‹21. - person gautam; 01.07.2018
comment
Это ошибка в bundletool, которая будет исправлена ​​в следующем выпуске. В качестве временного решения используйте команду extract-apks, чтобы получить APK для устройства, а затем установите его с помощью adb install /path/to/app.apk - person Pierre; 01.07.2018
comment
Большое вам спасибо, я последовал вашим инструкциям и установил apk на 3 устройства Android на версии Android 4, но не смог воспроизвести ту же ошибку в нем. - person gautam; 01.07.2018
comment
См. Прикрепленное изображение сбоя, который происходит после добавления пакета Android AAP. - person gautam; 03.07.2018
comment
Это SDK 4, как в 4.0 для ICS, или API уровня 4 для Donut? - person Pierre; 04.07.2018
comment
Это происходит во всех версиях ОС Android 4 от версий 4.1.2 до 4.4.4. - person gautam; 05.07.2018
comment
+ Pierre Проблема все еще существует с новой версией инструмента сборки buildToolsVersion '28 .0.3 ' - person Fung LAM; 12.10.2018
comment
@Fung Как я уже упоминал, проблема, скорее всего, связана с тем, что приложение загружается неопубликованно с установленным только базовым APK, ничто не указывает на то, что это имеет какое-либо отношение к версиям инструментов. - person Pierre; 12.10.2018
comment
@Pierre android.content.res.Resources $ NotFoundException: файл res / drawable / abc_item_background_holo_dark.xml все еще очень беспокоит меня на всех apks, я пробовал разные коды, но все та же проблема, пожалуйста, помогите, я думаю, что есть что-то большее, чем быть загружен, поскольку он есть только на версиях Android 4, а на Android 4 много телефонов, сейчас не может повысить уровень api. И если это невозможно, пожалуйста, предоставьте какое-либо решение, например, перенаправление в игровой магазин, если эта ошибка произойдет, большое вам спасибо.) - person gautam; 28.10.2018
comment
Здравствуйте, @Pierre, есть ли какие-то обходные пути или взломать, чтобы избежать этого сбоя, я использую buildToolsVersion '28 .0.3 ', но это все еще происходит случайным образом в широком спектре устройств и операционных систем. - person Mohamed Moamen; 20.02.2019
comment
Скоро будет. Я обновлю свой ответ через неделю или две, когда решение станет широко доступным. - person Pierre; 20.02.2019
comment
У меня та же проблема, и я могу подтвердить, что пакет установщика - com.android.vending, а не из-за боковой загрузки. Есть обновления @Pierre? - person Stéphane; 03.05.2019
comment
1 год спустя, все еще не исправлено - person John Doe; 28.10.2019
comment
Неполный набор APK больше не может быть установлен на Android. - person Pierre; 28.10.2019

Принятый ответ абсолютно правильный - корень этой проблемы - это загрузка APK-файла неопубликованно.

Тем не менее, многие люди все еще ищут обходной путь, спрашивая, как правильно справиться с этим случаем.

В своем приложении я сделал следующее:

  1. Создайте изображение размером 1x1 с именем pixel.png и поместите его во все следующие папки: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi.

  2. # P5 #
    # P6 # # P7 #
  3. Затем просто вызовите getDrawable(R.drawable.pixel) из Activity.onCreate(), заключенного в предложение try/catch.

  4. Если исключение было обнаружено, просто завершите текущий Activity и начните другое с шага №2.

Выполнено!

Снимок экрана

Это решение работает хорошо, теперь у меня даже есть данные из Firebase Analytics, подтверждающие это.

Из 46 тысяч новых пользователей (событие first_open) 266 пользователей получили эту ошибку (которая была обнаружена) и 221 пользователь нажал кнопку, которая ведет в Google Play.

Вот мой исходный код (также доступен на 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;
    }
}
person Oleksii K.    schedule 16.04.2019

Поскольку это происходит только на устройствах Android 4 после перехода на Android App Bundle, я обнаружил способ этого после добавления: -

public class App extends Application {

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }

И в build.gradle: -

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

как объясняется в этом сообщении: - Использование векторных чертежей Android при сбое Lollipop до сбоя < / а>

Относительно второго вопроса: - Resource Not Found error res / drawable / abc_switch_thumb_material.xml после добавления SwitchCompat в Android App Bundle

Поскольку это происходит во всех версиях Android. Я загрузил Apk и смог воспроизвести ту же ошибку в logcat, поэтому это можно исправить, только удалив SwitchCompat из моего проекта, я знаю, что это временное исправление, и Google обязательно должен что-то с этим сделать, чтобы по крайней мере не произошло сбоя после загрузки apk, возможно, лучшим вариантом будет перенаправление в игровой магазин. Но сбой приложения после перехода на Android App Bundle определенно влияет на стабильность приложения, поскольку многие пользователи делают это регулярно.

person gautam    schedule 16.07.2018

Вы можете проверить совместное использование (загрузка неопубликованных приложений) приложения пользователями из play console Войдите в play console, выберите приложение, в котором вы публикуете набор приложений вместо apk.

Выберите Android Vital -> ANR и сбои и перейдите на вкладку сбоев.

выберите установку из игры

введите здесь описание изображения

person Ashish Singh    schedule 18.05.2019

Для внутреннего тестирования мы не можем загружать файлы aab apks. Есть только два способа предоставить пользователю apk перед выпуском в производство.

1) мы должны указать цель проверки файла universal.apk

java -jar bundletool-all-0.12.0.jar build-apks --bundle = (путь сборки) debug.aab --output = (путь вывода) debug.apks --mode = универсальный

2) мы должны загрузить файл aab в игровой магазин, а затем сначала выпустить его для внутреннего тестирования, если все работает нормально, затем выпустить его в производство.

person Yugandhar Vadlamudi    schedule 23.01.2020

Я столкнулся с той же проблемой, что и мое приложение вылетало из-за того, что не могло найти шрифты и аудиофайлы из ресурсов. проблема заключалась в том, что я обновил URL-адрес Gradle с 4.10.1 до 5.6.4 в Gradle-wrapper.properties, но не обновил библиотеки. когда я вернулся к 4.10.1, он начал нормально работать.

person Ali Mehdi    schedule 26.05.2020