Не удалось найти класс "LinearLayout" по пути: только DexPathList для устройств Samsung. (App store build) - PullRequest
0 голосов
/ 01 июля 2018

У нас было приложение в магазине игр в течение короткого времени, но никто из наших разработчиков не использовал устройства Samsung, поэтому мы не смогли протестировать их. Сегодня мы поделились с некоторыми пользователями Samsung, и когда они устанавливают приложение, оно сразу же вылетает без открытия. Я получил несколько сообщений о сбоях через Crashlytics по этому поводу, но после расследования я не могу найти решение. Все найденные решения указывают на то, что имя класса должно быть написано заглавными буквами, но наше уже есть.

Вот обзор журналов аварий:

Exception java.lang.RuntimeException: Unable to start activity 
ComponentInfo {com.zonderstudios.zonder/com.zonderstudios.zonder.MainActivity}: 
android.content.res.Resources$NotFoundException: Drawable 
com.zonderstudios.zonder:layout/launch_screen with resource ID 
#0x7f04002d

Caused by android.content.res.Resources$NotFoundException: Drawable 
com.zonderstudios.zonder:layout/launch_screen with resource ID #0x7f04002d

Caused by android.content.res.Resources$NotFoundException: File 
res/layout/launch_screen.xml from drawable resource ID #0x7f04002d

Caused by android.view.InflateException: Class not found LinearLayout

Caused by java.lang.ClassNotFoundException: Didn't find class 
"LinearLayout" on path: DexPathList[[zip file 
"/data/app/com.zonderstudios.zonder- 
R0tFS_4BNjS6q0znS27jPw==/base.apk"],nativeLibraryDirectories= . 
[/data/app/com.zonderstudios.zonder-R0tFS_4BNjS6q0znS27jPw==/lib/arm, 
/data/app/com.zonderstudios.zonder- 
R0tFS_4BNjS6q0znS27jPw==/base.apk!/lib/armeabi-v7a, /system/lib, 
/system/vendor/lib]]

По существу: Не найден класс "LinearLayout" по пути: DexPathList для экрана запуска.

Заставка отлично работает на всех наших эмуляторах и других физических устройствах, которые мы тестировали до сих пор. Но эта проблема до сих пор проявляется в Galaxy S6, S8 и S8 +.

Вот файл launch_screen.xml. @ drawable / launch_screen относится к png-изображению, которое мы используем в качестве заставки.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/launch_image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"
        android:src="@drawable/launch_screen"
        />
</LinearLayout>

Мы показываем экран запуска, установив начальную тему приложения на AppTheme.Launcher, которая определяется следующим образом:

styles.xml:

<resources xmlns:tools="http://schemas.android.com/tools">

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowLightStatusBar" tools:targetApi="23">false</item>
        <!-- Customize your theme here. -->
    </style>
    <style name="AppTheme.Launcher">
        <item name="android:windowBackground">@layout/launch_screen</item>
        <item name="android:windowLightStatusBar" tools:targetApi="23">true</item>
        </style>
</resources>

Кто-нибудь знает, что вызывает эту проблему или почему определенный встроенный класс не может быть найден только на одном устройстве?

1 Ответ

0 голосов
/ 06 июля 2018

Я нашел (довольно хакерское) решение.

По сути, устройство Samsung не смогло загрузить файл layout/* при открытии приложения - например, в качестве заставки.

Вместо этого я переключился

<item name="android:windowBackground">@layout/launch_screen</item>

на следующее:

<item name="android:windowBackground">@drawable/splash_screen</item>

И создал нарисованный xml-файл splash_screen, который содержит изображение, которое я хотел показать. Это работает нормально и не вылетает устройство Galaxy. Интересно, что устройство Galaxy может использовать файл @layout/launch_screen позже, когда откроется еще одно приложение. Есть некоторые дополнительные вещи инициализации, которые происходят с реагирующим родным, поэтому я продолжаю отображать заставку, пока это происходит.

Это в основном приводит к тому, что изображение отображается в увеличенном масштабе, чем я хочу, а затем "возвращается" обратно в нормально масштабированную версию с помощью параметра centerCrop, как только он переключается на использование файла макета.

Я все еще не уверен, в чем причина проблемы с корнем. Кажется, проблема в том, что устройства Samsung Galaxy не могут загрузить XML-файлы Layout до инициализации приложения.

...