ResourceNotFoundException после разделения apks

После интеграции App-Bundle в мое профессиональное приложение я столкнулся со многими проблемами через Crashlytics, связанными с первым экраном приложения при раздувании ImageView.

Это ResourceNotFoundException.

Caused by: android.view.InflateException: Binary XML file line #48: Binary XML file line #48: Error inflating class ImageView
Caused by: android.view.InflateException: Binary XML file line #48: Error inflating class ImageView
Caused by: android.content.res.Resources$NotFoundException: Drawable (missing name) with resource ID #0x7f08009d
Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f08009d
    at android.content.res.ResourcesImpl.getResourceName(ResourcesImpl.java:242)
    at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:739)
    at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:609)
    at android.content.res.Resources.loadDrawable(Resources.java:885)
    at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:953)
    at android.content.res.TypedArray.getDrawable(TypedArray.java:928)
    at android.widget.ImageView.<init>(ImageView.java:188)
    at android.widget.ImageView.<init>(ImageView.java:171)
    at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:72)
    at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:68)
    at androidx.appcompat.app.AppCompatViewInflater.createImageView(AppCompatViewInflater.java:187)
    at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:107)
    at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1267)
    at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1317)
    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.rInflate(LayoutInflater.java:866)
    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 androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:470)
    at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:141)
    at io.example.SplashScreen.onCreate(SplashScreenActivity.kt:50)
    at android.app.Activity.performCreate(Activity.java:6975)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)

2019-03-11 12:13:52.605 14143-14143/? E/AndroidRuntime: в java.lang.reflect.Method.invoke(собственный метод) в com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) в com.android.internal.os.ZygoteInit. основной (ZygoteInit.java: 767)

Конечно, вначале у меня не получилось воспроизвести, потом я предпринял множество попыток с помощью bundletool. Я видел похожие темы, но не вникал в проблему.

Я понял, что генерация apk из пакета с меньшей плотностью может воспроизвести сбой.

С моей попыткой я извлек спецификации Nexus6P следующим образом:

{
  "supportedAbis": ["x86"],
  "supportedLocales": ["en_US"],
  "screenDensity": 560,
  "sdkVersion": 26
}

Затем я изменил screenDensity на 320 или даже 120, что привело к сбою. Посмотрите глубже на сгенерированный файл *.apks, который у нас есть:

  • база-en.apk
  • база-ldpi.apk
  • база-мастер.apk

В настоящее время у меня есть папки mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi.

Я пытался добавить папку drawable-ldpi, но тщетно.

Я проверил в base-ldpi.apk, чтобы посмотреть, не найден ли ресурс, он хорошо присутствует в apk.

В качестве быстрого исправления я могу отключить разделение плотности в конфигурации gradle или даже отключить пакет приложений, но я хочу лучшего финала.

Есть идеи ? Спасибо :)


person Toubap    schedule 11.03.2019    source источник
comment
Вы не включили исключение.   -  person Gavin Wright    schedule 11.03.2019
comment
Похоже на дубликат stackoverflow.com/questions/50471888/   -  person Pierre    schedule 11.03.2019
comment
Поскольку исключение объясняет само себя, я отредактировал связанное исключение. Как я уже сказал, другие темы не освещают проблему должным образом. Тот факт, что платформы с боковой загрузкой вызывают этот сбой, — это вещь. Здесь я хочу поговорить о пакете приложений, особенно   -  person Toubap    schedule 11.03.2019
comment
Что вы имеете в виду под не должным образом покрывать? Другие потоки довольно подробно объясняют, что происходит, я бы сказал: базовый APK загружается без APK-файлов конфигурации. Вы можете воспроизвести, установив вручную только файл base-master.apk, извлеченный из архива APK Set, который генерирует bundletool. Какую еще информацию вы ищете?   -  person Pierre    schedule 12.03.2019
comment
Тогда я не понимаю, почему он вылетает с этим файлом *.apks. Первоначальная плотность для Nexus6P была 560, если я переключаюсь на 620, он не падает, но на 120 происходит сбой. Единственное решение, которое у меня есть, это отключить разделение плотности, что не является хорошим способом.   -  person Toubap    schedule 12.03.2019
comment
Когда вы воспроизводите локально, у вас такая же трассировка стека? Я могу помочь вам отладить это только в том случае, если вы поделитесь со мной пакетом приложений. Вы также можете сделать это с помощью средства отслеживания проблем репозитория GitHub bundletool, если хотите. Если вам неудобно делиться App Bundle, то по крайней мере проект, который может воспроизвести ошибку.   -  person Pierre    schedule 14.03.2019
comment
Да, та же трассировка стека, я сделал другой проект, который воспроизводит то же поведение. Я загрузил его вместе с appbundle и файлами specs.json (drive.google.com/open?id =1HQIjcoXy9NQ5P9ZXdJOeZpBAFceJ9zgx). Если вы считаете это реальной проблемой, я создам проблему на github. PS: я тестировал версии 0.8.0 и 0.9.0. спасибо   -  person Toubap    schedule 14.03.2019
comment
Пожалуйста, напишите об ошибке туда, да, отслеживать расследование будет проще, чем в ветке комментариев stackoverflow :) Спасибо!   -  person Pierre    schedule 14.03.2019
comment
Хорошо, спасибо, я заполнил вопрос   -  person Toubap    schedule 15.03.2019