未在路径上找到 class "LinearLayout":DexPathList 仅适用于三星设备。 (应用商店构建)

Didn't find class "LinearLayout" on path: DexPathList for Samsung devices only. (App store build)

我们在 Play 商店中有一个应用程序已经有很短的时间了,但是 none 我们的开发人员使用三星设备,所以我们无法在它们上进行测试。我们今天分享给一些三星用户,当他们安装应用程序时,它立即崩溃而无法打开。我通过 Crashlytics 收到了几份关于此的崩溃报告,但经过调查,我找不到解决方案。我找到的所有解决方案都指出 class 名称需要正确大写,但我们已经做到了。

这里是崩溃日志的概述:

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]]

基本上:在启动屏幕的路径 DexPathList 上未找到 class "LinearLayout"。

启动画面在我们目前测试过的所有模拟器和其他物理设备上运行良好。但到目前为止,这个问题出现在 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>

有谁知道导致此问题的原因,或者为什么特定的内置 class 不会仅在一种设备上找到?

我找到了一个(相当老套的)解决方案。

基本上,三星设备无法在应用程序打开时加载 layout/* 文件 - 例如作为启动画面。

相反,我切换了

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

以下内容:

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

并创建了一个 splash_screen 可绘制 xml 文件,其中包含我想要显示的图像。这工作正常并且不会使 Galaxy 设备崩溃。有趣的是,一旦应用程序再次打开,Galaxy 设备便可以稍后使用 @layout/launch_screen 文件。 react-native 会发生一些额外的初始化事情,所以我会在发生这种情况时继续显示启动画面。

这基本上导致图像显示比我希望的更放大,然后一旦切换到使用布局文件,"popping" 使用 centerCrop 参数返回到正常缩放的版本。

不过,我仍然不确定根本问题的原因是什么。问题似乎是 Samsung Galaxy 设备在应用程序初始化之前无法加载布局 xml 文件。