我没有在我的应用程序中发现错误。仅在少数设备上

I don't find the error in my app. Only on a handful devices

我找不到,我错了。错误仅出现在少数设备上。我是 Java 的新手,我无法很好地阅读错误日志:

FATAL EXCEPTION: main
Process: myapp.myapp, PID: 11585
java.lang.RuntimeException: Unable to start activity ComponentInfo{myapp.myapp/myapp.myapp.Start}: android.view.InflateException: Binary XML file line #2050: Error inflating class <unknown>
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2255)
    at android.app.ActivityThread.access0(ActivityThread.java:142)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5118)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #2050: Error inflating class <unknown>
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:319)
    at android.app.Activity.setContentView(Activity.java:1973)
    at myapp.myapp.Start.onCreate(Start.java:220)
    at android.app.Activity.performCreate(Activity.java:5275)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
    ... 11 more
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    ... 25 more
Caused by: java.lang.OutOfMemoryError
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
    at android.content.res.Resources.loadDrawable(Resources.java:2150)
    at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
    at android.widget.ImageView.<init>(ImageView.java:129)
    at android.widget.ImageView.<init>(ImageView.java:119)

我明白了,这是一个致命错误。该应用程序正在从 Android 台设备关闭。错误发生在少数设备上。

你有一个 java.lang.OutOfMemoryError。它显示在最后 Caused by 行。内存可能是暂时的,因为不同的设备有不同的内存量,而且它还取决于许多其他因素,比如其他应用程序 运行、屏幕大小等...

日志显示崩溃的最初原因是 java.lang.OutOfMemoryError。可能某些设备没有足够的内存来解码应用程序资产中的图像文件。检查您的资产文件夹并尝试减小其中包含的图像的大小。

您在尝试加载图像时 运行 内存不足。当您尝试加载高分辨率图像和设备时,可能会发生这种情况。检查布局 XML 文件中的 #2050 行。

一个可能的解决方案是为无法处理此类图像的设备提供较低分辨率的资源(图像)。

如前所述,您遇到了 OutOfMemoryException。查看堆栈跟踪的最后一部分:

Caused by: java.lang.OutOfMemoryError
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
    at android.content.res.Resources.loadDrawable(Resources.java:2150)
    at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
    at android.widget.ImageView.<init>(ImageView.java:129)
    at android.widget.ImageView.<init>(ImageView.java:119)

它似乎连接到图像,因为它在尝试从资源流解码时崩溃。这是因为它无法为图像分配足够的内存。

所以我有三个解决方案:

  • 缩小图像(调整大小)--- 您的应用不需要那么多内存来创建图像
  • 使用像 Picasso 这样的库 --- 在直接链接到图像时在其他地方看到了这个解决方案。 Picasso 可以帮助 oyu 将更大的图片加载到您的应用程序中
  • 在清单的应用程序标记中声明 android:largeHeap="true"。 --- 您的应用程序请求更多内存,并且这种扩展(根据 AFAIK 上下)以适应您的应用程序所需要的任何内存

据我所知,您的应用在不请求大堆时会获得给定的内存量。此数量因设备而异,具体取决于 ROM 和硬件。

发生崩溃的设备可能内存不足。如果您不会在 S8 edge 上崩溃,并不意味着您不会在 S2 上崩溃。设备上的可用资源会发生变化,这就是您在 some 设备上而不是 all 上获得 OOME 的原因。我不确定您的崩溃列表中有哪些设备,但它们可能是资源有限的低端预算设备。