Android 应用突然没有反应而没有改变任何东西

Android app suddenly does not react without having changed anything

我有一个非常奇怪的问题。我有一个带有一些图像按钮的 android 应用程序。当您按下图像按钮(取决于哪个图像按钮)时,应用程序使用 JetPackNavigation 导航到新片段。基本上我已经使用该应用程序(在开发它时)超过 4 个月,导航从来没有问题。

现在,当单击某些图像按钮时,Android Studio 的 App Emulator 中的应用程序突然没有反应了。这真的很奇怪,因为我没有改变任何东西(我通过使用 Android Studio 的本地历史记录来确定)。此外,对于某些 ImageButton,它仍然可以完美运行。

所以我的问题基本上是,是否有办法找出导致问题的原因?在 logcat 中没有任何错误消息。我只在一段时间后收到超时报告,没有任何提示,如您所见

2021-01-09 11:31:57.067 542-31149/? E/ActivityManager: ANR in com.example.td.barapp (com.example.td.barapp/.MainActivity)
    PID: 31101
    Reason: Input dispatching timed out (deb7f58 com.example.td.barapp/com.example.td.barapp.MainActivity (server) is not responding. Waited 5005ms for MotionEvent)
    Parent: com.example.td.barapp/.MainActivity
    Load: 0.71 / 0.83 / 1.35
    ----- Output from /proc/pressure/memory -----
    some avg10=0.00 avg60=0.00 avg300=0.00 total=46655214
    full avg10=0.00 avg60=0.00 avg300=0.00 total=3766399
    ----- End output from /proc/pressure/memory -----
    
    CPU usage from 1ms to 6375ms later (2021-01-09 10:31:50.651 to 2021-01-09 10:31:57.025):
      93% 31101/com.example.td.barapp: 75% user + 17% kernel / faults: 2812 minor
      31% 542/system_server: 3.7% user + 27% kernel / faults: 7660 minor
      6.7% 2702/com.android.systemui: 5% user + 1.7% kernel / faults: 4875 minor
      5.6% 277/android.hardware.bluetooth@1.1-service.sim: 0.1% user + 5.4% kernel
      4.7% 3858/com.google.android.gms.persistent: 2.6% user + 2% kernel / faults: 2653 minor
      0.1% 424/media.codec: 0% user + 0.1% kernel / faults: 3235 minor
      0.1% 426/media.swcodec: 0% user + 0.1% kernel / faults: 3265 minor
      2.1% 1102/com.android.phone: 0.9% user + 1.2% kernel / faults: 1428 minor
      2% 374/adbd: 0% user + 2% kernel
      1.8% 947/com.android.networkstack.process: 1.4% user + 0.4% kernel / faults: 1128 minor
      0.1% 149/logd: 0% user + 0.1% kernel / faults: 2 minor
      0.1% 410/media.extractor: 0% user + 0% kernel / faults: 1490 minor
      0.1% 1650/com.android.emulator.multidisplay: 0% user + 0% kernel / faults: 913 minor
      0% 1629/com.android.ims.rcsservice: 0% user + 0% kernel / faults: 904 minor
      1% 295/android.hardware.graphics.composer@2.3-service: 0% user + 1% kernel
      0% 1082/com.android.se: 0% user + 0% kernel / faults: 871 minor
      0% 1/init: 0% user + 0% kernel
      0.7% 10/rcu_preempt: 0% user + 0.7% kernel
      0% 2033/com.android.bluetooth: 0% user + 0% kernel / faults: 112 minor
      0% 251/tombstoned: 0% user + 0% kernel
      0.4% 363/logcat: 0% user + 0.4% kernel
      0% 30392/logcat: 0% user + 0% kernel
      0.3% 168/jbd2/vdc-8: 0% user + 0.3% kernel
      0.1% 9/ksoftirqd/0: 0% user + 0.1% kernel
      0.1% 16/ksoftirqd/1: 0% user + 0.1% kernel
      0.1% 109/kworker/1:1H-kblockd: 0% user + 0.1% kernel
      0% 153/vndservicemanager: 0% user + 0% kernel
      0.1% 266/statsd: 0% user + 0.1% kernel / faults: 47 minor
      0% 267/netd: 0% user + 0% kernel / faults: 36 minor
      0.1% 326/android.hardware.wifi@1.0-service: 0% user + 0.1% kernel
      0.1% 340/audioserver: 0.1% user + 0% kernel / faults: 41 minor
      0.1% 348/surfaceflinger: 0% user + 0.1% kernel / faults: 40 minor
      0% 383/cameraserver: 0% user + 0% kernel / faults: 43 minor
      0% 385/drmserver: 0% user + 0% kernel / faults: 40 minor
      0% 413/mediaserver: 0% user + 0% kernel / faults: 42 minor
      0.1% 421/wificond: 0% user + 0.1% kernel
      0.1% 919/android.hardware.gnss@2.0-service.ranchu: 0% user + 0.1% kernel
      0.1% 30400/kworker/u4:0-phy0: 0% user + 0.1% kernel
      0.1% 30858/kworker/0:1-events_power_efficient: 0% user + 0.1% kernel
      0% 30977/kworker/1:2-mm_percpu_wq: 0% user + 0% kernel
     +0% 31151/crash_dump32: 0% user + 0% kernel
    96% TOTAL: 55% user + 40% kernel + 0% iowait + 0.3% softirq
    CPU usage from 49ms to 796ms later (2021-01-09 10:31:50.699 to 2021-01-09 10:31:51.446):
      61% 542/system_server: 0% user + 61% kernel / faults: 287 minor
        57% 31149/AnrConsumer: 1.7% user + 56% kernel
      99% 31101/com.example.td.barapp: 99% user + 0% kernel
        99% 31101/ample.td.barapp: 99% user + 0% kernel
      4.6% 277/android.hardware.bluetooth@1.1-service.sim: 0% user + 4.6% kernel
        6.1% 1167/bluetooth@1.1-s: 0% user + 6.1% kernel
      1.5% 295/android.hardware.graphics.composer@2.3-service: 0% user + 1.5% kernel
        1.5% 349/: 0% user + 1.5% kernel
      2.1% 3858/com.google.android.gms.persistent: 0% user + 2.1% kernel
    87% TOTAL: 51% user + 36% kernel

首先我想问一下,您是否在这个超时报告中看到任何可能导致问题的东西(我对此表示怀疑)。此外,如果您能分享您在未进行任何更改的情况下发生的此类奇怪错误的经验,我将非常高兴。该应用程序似乎进入了死锁情况或未结束的循环。一般情况下,您解决此类问题的方法是什么。

如果您能分享您的经验,我将非常高兴,我将不胜感激。

此答案综合了我们在评论部分的讨论,最终得出了解决方案。

在这种情况下我们做任何事情之前,务必仔细检查是否有一些我们出于某种原因没有看到的变化。重要的是不要忽略这种双重检查,因为这不会花费太多时间,而导致解决方案的系统方法需要付出很多努力。因此,通过这种双重检查,我们有很多潜在的收益,几乎没有 risk/cost。我个人使用 git 作为版本控制系统,但任何能够可靠显示此类差异的系统都可以胜任。

看到许多不起作用的图像按钮看起来让人不知所措,我们需要将研究重点放在一个易于管理和理解的问题上-space。因此,我们需要选择一个不起作用的图像按钮,并找出不起作用的原因。如果我们幸运的话,那么解决这个问题将自动解决其他问题,或者给我们一些其他问题的强烈提示。当然,我们可能会遇到多个截然不同的问题,这当然意味着我们需要重复此答案中概述的过程。

一个非常重要的提示是并非所有图像按钮都显示此行为,因此我们知道该问题不太可能与图像按钮有关,而更有可能与图像按钮上的事件触发的操作有关。

一些调试和日志记录总是有帮助的。调试向我们展示了发生了什么,所以如果我们进行调试,我们可能会在某个时候发现一些不良行为,这很可能就是问题本身。如果我们做一些日志记录,那么我们可以看到程序在 运行 时发生了什么。我们可以做一个或两个。

在某些情况下没有解决方案。例如远程工作的 API 可能会停止工作,这是一个无法解决的问题。在这种情况下,检测这种情况至关重要。如果没有解决方案,那至少我们要尽快找出这个,所以我们不费吹灰之力。

解决问题的一些步骤:

  1. 将问题 space 缩小到一个小的、易于管理的规模(并可能为您的问题提供更多信息)
  2. 很好地定义你的问题(目前你link你的问题是图像按钮,但你这样做是错误的,因为一些图像按钮工作的事实证明假设图像按钮会错误地工作)
  3. 查看不可分割的工作单元,在您的情况下是操作,选择其中一个作为当前焦点并将问题重新定义为更小的尺寸)
  4. 登录调试收集信息
  5. 根据您收集的信息列表计划一些实验
  6. 依次尝试所有假设
  7. 如果还没有找到解决方案,那么您可能会从第 1 点重新开始。或者您可能会决定(暂时)删除该操作并逐渐将其重新实施,直到您找到问题所在或不小心解决了