4

在应用程序未使用一段时间后,我在应用程序重新启动时遇到了一个奇怪的黑屏问题,用户在 Play 商店开发者控制台中报告了 ANR 并带有一个非常奇怪的堆栈跟踪:

----- pid 2704 at 2013-08-15 09:08:32 -----
Cmd line: system_server

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 NATIVE
  | group="main" sCount=1 dsCount=0 obj=0x400281b8 self=0xd088
  | sysTid=2704 nice=0 sched=0/0 cgrp=default handle=-1345006464
  | schedstat=( 29713532638 35237133707 131286 )
  at com.android.server.SystemServer.init1(Native Method)
  at com.android.server.SystemServer.main(SystemServer.java:918)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:507)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(...)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
  at dalvik.system.NativeStart.main(Native Method)
 ...

并且没有涉及应用程序代码的线程。我可以在我的一个测试设备上重现它,但它非常随机,并且需要很长时间才能遇到错误。但是,如果我能够在启动应用程序后立即在设备日志中收到以下消息:

I/ActivityManager( 2704): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.client.android/.ExampleMainActivity bnds=[125,494][235,632] } from pid 2908
W/ActivityManager( 2704): Receiver during timeout: BroadcastFilter{40b8b180 ReceiverList{40b8b108 32495 com.example.client.android/10107 remote:40b34b28}}
I/ActivityManager( 2704): Skipping duplicate ANR: ProcessRecord{40bfc8c0 32495:com.example.client.android/10107} Broadcast of Intent { act=android.intent.action.SCREEN_OFF flg=0x40000000 }
W/ActivityManager( 2704): Activity idle timeout for HistoryRecord{40578b78 com.example.client.android/.ExampleMainActivity}

我已经用谷歌搜索并在 StackOverflow 上找到了以下关于这些消息的帖子:

HistoryRecord 的活动空闲超时?

HistoryRecord 的活动空闲超时

以及谷歌群组中的以下帖子:

https://groups.google.com/forum/?fromgroups#!topic/android-developers/TfkPlN5b-ig

我检查了服务,如果 onReceive 中有任何重量级的东西,BroadcastReceivers但没有找到任何东西。

我们使用 a OnGlobalChangeLayoutListener,它应用 anView.invalidate()来解决WebView可能导致绘制循环的重绘问题。我删除了它,但仍然有问题。

任何人都可能遇到同样的问题并知道如何解决或隔离它?我在这里几乎没有想法,很想了解这里发生了什么。

更新

我忘了说:如果这个黑屏问题发生了,让应用程序摆脱这种情况的唯一方法是强制停止应用程序进程。否则每次我尝试启动应用程序时都会记录日志行。

更新 2

根据要求对正在发生的事情进行更详细的描述:黑屏非常随机地发生。它总是在应用程序启动时发生,如果发生,只有强制停止才能让应用程序退出。它似乎仅在应用程序不再使用并且可能已被内存换出后才会发生。看起来只有 Android 2.x 设备会受到影响,尽管我不确定。

更新 3

我添加了一个调用按钮,android.os.Process.killProcess(Process.myPid());如果我一次又一次地调用它,我可以在一段时间后通过启动应用程序并使用按钮退出它来重现它。一段时间后(非常随机),我在使用按钮退出后得到了这个:

E/JavaBinder( 2704): !!! FAILED BINDER TRANSACTION !!!

其次是:

W/ActivityManager( 2704): Activity pause timeout for HistoryRecord{40976dd8 com.example.client.android/.ExampleMainActivity}

下次我重新启动应用程序时,我只会看到黑屏和上面提到的日志消息。我无法用 android 4.1 设备重现相同的内容,只有两个 2.3 设备。

谷歌搜索我发现了这个:

http://androiddiscuss.com/1-android-discuss/42614.html

表明活页夹事务缓冲区有些用尽。我们使用使用绑定的 MediaPlayer、InApp-Billing 和 Google Cloud Messages。我删除了所有这些,但仍然出现此错误。也许有人知道其他隐藏的活页夹相关的东西要检查?

4

1 回答 1

0

我终于能够识别出故障组件:我最近将使用的 Admob-SDK 从 6.2.1 更新到 6.4.1,并且在更新后出现了黑屏(以及 Java-Binder 消息)。回滚到 6.2.1 解决了这个问题。

于 2013-08-19T10:48:33.170 回答