【发布时间】:2013-08-17 14:39:07
【问题描述】:
在应用程序一段时间未使用后,我在应用程序重新启动时出现奇怪的黑屏问题,用户在 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}
我已经在 Google 上四处搜索,并在 StackOverflow 上找到了以下关于这些消息的帖子:
Activity idle timeout for HistoryRecord?
Activity idle timeout for HistoryRecord
以及谷歌群组中的以下帖子:
https://groups.google.com/forum/?fromgroups#!topic/android-developers/TfkPlN5b-ig
我检查了服务,如果BroadcastReceivers 的 onReceive 中有任何重量级的东西,但没有找到任何东西。
我们使用OnGlobalChangeLayoutListener,它应用View.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。我删除了所有这些,但仍然出现此错误。也许有人知道其他隐藏的活页夹相关的东西要检查?
【问题讨论】:
-
com.example.client.android是您指的给您带来麻烦的包和应用程序吗? -
是的,我在上面的日志文件sn-p中用com.example替换了真实的包名。但这是导致问题的应用程序,并且在应用程序启动时会记录这些行。
-
太含糊了,抱歉,无法确切说明那里发生了什么,至于最终用户设备上发生这种情况的 ANR 报告,上面的第一个 sn-p,表示 Android 运行时
system_server,看起来它在他们的设备上崩溃了,而不是你的应用程序,堆栈跟踪将显示在上面的第二个 sn-p 中,到目前为止,还没有堆栈跟踪。因此,很可能是提醒您的最终用户,他们的手机由于可能的过载、软件/硬件故障而崩溃,不一定是您的应用程序。 您需要发布更多详细信息 -
我发布的 ANR-Dump-Snippet 实际上来自我这里的设备(三星 Galaxy S2),我可以随机“复制”它。尽管有我的应用程序,但其他任何东西在设备上仍然运行良好。
-
如果
system_server崩溃了,会对Android 运行时产生负面影响,加载应用程序会失败并出现黑屏,真正的问题是为什么?就像我说的那样,第二个 sn-p 太短了,我们无法正确推断!您在 Play 商店中的应用是什么,为什么要保密,如果任何 SO 用户看到这个,他们会认为com.example.client.android是从某个网站获取的练习代码......只是说:)
标签: android android-intent admob