Android - Исключение при запуске (для некоторых пользователей) - PullRequest
0 голосов
/ 08 ноября 2019

Я недавно перешел из библиотек поддержки / сравнения v4 в androidx, и хотя он, кажется, работает нормально (по крайней мере, на любом устройстве / эмуляторе, на котором я его запускаю), некоторые пользователи, похоже, испытывают сбой. Я не могу гарантировать , что это связано с миграцией androidx, но это подозрительное время.

Вот трассировка стека аварии (FileActivity.java - моя операция запуска):

java.lang.RuntimeException:
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2473)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2541)
  at android.app.ActivityThread.access$800 (ActivityThread.java:160)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1321)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:135)
  at android.app.ActivityThread.main (ActivityThread.java:5597)
  at java.lang.reflect.Method.invoke (Method.java)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:984)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:779)

Caused by: android.view.InflateException: 
  at android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:761)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:810)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:813)
  at android.view.LayoutInflater.inflate (LayoutInflater.java:508)
  at android.view.LayoutInflater.inflate (LayoutInflater.java:415)
  at android.view.LayoutInflater.inflate (LayoutInflater.java:365)
  at androidx.appcompat.app.AppCompatDelegateImpl.setContentView (AppCompatDelegateImpl.java:555)
  at androidx.appcompat.app.AppCompatActivity.setContentView (AppCompatActivity.java:161)
  at com.me.myapp.FileActivity.onCreate (FileActivity.java:104)
  at android.app.Activity.performCreate (Activity.java:6010)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1122)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2426)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2541)
  at android.app.ActivityThread.access$800 (ActivityThread.java:160)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1321)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:135)
  at android.app.ActivityThread.main (ActivityThread.java:5597)
  at java.lang.reflect.Method.invoke (Method.java)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:984)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:779)

Caused by: java.lang.ClassNotFoundException:
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at android.view.LayoutInflater.createView(LayoutInflater.java:575)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:747)
    ... 21 more

и место преступления:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file);
    ...

Итак, насколько я понимаю, не удается найти класс, когда раздувает макет activity_file, который находится здесь:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include
            android:id="@+id/toolbar"
            layout="@layout/toolbar"/>

        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
            android:id="@+id/swipeRefreshLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/toolbar">

            <ListView
                android:id="@+id/listView"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_below="@+id/toolbar"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:choiceMode="singleChoice"
                android:clickable="true"
                android:clipToPadding="false"
                android:divider="@color/divider"
                android:dividerHeight="1dp"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:headerDividersEnabled="true"
                android:longClickable="true"
                android:minHeight="64dp"
                android:paddingBottom="72sp"
                android:scrollingCache="false"
                android:stackFromBottom="false"/>

        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

        <TextView
            android:id="@+id/no_documents"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="false"
            android:focusable="false"
            android:gravity="center_vertical|center_horizontal"
            android:text="@string/no_documents_found"
            android:textSize="24sp"
            android:textStyle="bold"
            android:visibility="visible"/>

        <ProgressBar
            android:id="@+id/progressBar"
            style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Large"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerInParent="true"
            android:foregroundGravity="center_vertical|center_horizontal"
            android:visibility="invisible"/>

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/floatingActionButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginEnd="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginBottom="16dp"
            android:clickable="true"
            android:focusable="true"
            android:maxWidth="24dp"
            android:maxHeight="24dp"
            app:backgroundTint="@color/colorPrimary"
            app:fabSize="normal"
            app:srcCompat="@drawable/fab_plus" />

    </RelativeLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/file_menu"/>

</androidx.drawerlayout.widget.DrawerLayout>

И, для хорошей меры, ссылочные макеты toolbar и drawer_header:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    android:elevation="4dp">

</androidx.appcompat.widget.Toolbar>


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="96dp"
                android:background="@drawable/drawer_background"
                android:orientation="vertical"
                android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/documents"
        android:scaleType="centerCrop"
        android:visibility="gone"
        app:srcCompat="@drawable/drawer_wallpaper"/>

    <ImageView
        android:id="@+id/avatar"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_margin="@dimen/spacing_large"
        android:elevation="4dp"
        android:src="@drawable/ic_launcher"/>

</RelativeLayout>

И (по запросу) file_menu:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools" tools:context=".FileActivity">
    <group android:id="@+id/documents">
        <item
            android:id="@+id/action_documents"
            android:checkable="true"
            android:checked="true"
            android:icon="@drawable/blank"
            android:title="@string/documents"/>
    </group>
    <group android:id="@+id/source">
        <item
            android:id="@+id/action_googledrive"
            android:icon="@drawable/googledrive"
            android:title="@string/googledrive"/>
        <item
            android:id="@+id/action_dropbox"
            android:icon="@drawable/dropbox"
            android:title="@string/dropbox"/>
        <item
            android:id="@+id/action_onedrive"
            android:icon="@drawable/onedrive"
            android:title="@string/onedrive"/>
        <item
            android:id="@+id/action_device"
            android:icon="@drawable/device"
            android:title="@string/device_storage"/>
    </group>
    <group android:id="@+id/settings">
        <item
            android:id="@+id/action_settings"
            android:icon="@drawable/gear"
            android:title="@string/action_settings"/>
        <item
            android:id="@+id/action_upgrade"
            android:icon="@drawable/upgrade"
            android:title="@string/action_upgrade_now"/>
    </group>
    <group android:id="@+id/recover">
        <item
            android:id="@+id/action_recover"
            android:icon="@drawable/blank"
            android:title="@string/recover"/>
    </group>
    <item
        android:id="@+id/action_help"
        android:icon="@drawable/help"
        android:title="@string/action_help"/>
    <item
        android:id="@+id/action_about"
        android:icon="@drawable/blank"
        android:title="@string/action_about"/>
</menu>

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

(Создание этого возможно более сложного факта заключается в том, что некоторые другие пользователи, похоже, получают сбой при запуске, когда отчет включает только java.lang.RuntimeException, ибольше не "вызвано" трассировкой стека. Я не знаю, связано ли это, но обо всем по порядку.)

1 Ответ

0 голосов
/ 08 ноября 2019

Я скопировал и вставил вашу работу, и она отлично работает на моем компьютере. Поэтому, возможно, проблема связана с другим файлом макета. Когда вы перешли на AndroidX, вы позволили Android Studio сделать это за вас? В Android studio следуйте Refactor > Migrate to AndroidX, это должно сделать для вас. Однако вы должны вручную перенести файлы макета XML с использованием любой старой зависимости. Итак, просмотрите ваш файл Gradle и для каждой зависимости androidx, которую вы видите, убедитесь, что ваши xml-файлы не используют версию «support». Например, вы не должны видеть никаких «android.support». в любом из ваших файлов макета XML.

...