在应用程序未使用一段时间后,我在应用程序重新启动时遇到了一个奇怪的黑屏问题,用户在 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 上找到了以下关于这些消息的帖子:
以及谷歌群组中的以下帖子:
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。我删除了所有这些,但仍然出现此错误。也许有人知道其他隐藏的活页夹相关的东西要检查?