1

奇妙な ANR レポートを受け取りました。関連する 3 つのスレッドを見ると、transact() メソッドが UI をブロックしているようです。誰でも確認できますか?

誤解を招くかもしれませんが、tid 23、行 ~887 は実際にはこのメソッドです。

synchronized public void doSomething()
{
   // No sync in here, no API calls either
}

なぜこうなった ?虚偽報告?OSのバグ?アプリのバグ?今後これを回避するにはどうすればよいですか?

明確にするために:メインスレッドはandroid.app.Activity.finish()で戻るボタンに応答していますが、tid = 21によってブロックされています.tid = 21はgetApplicationInfo()を呼び出す非同期タスクです->transact()

関連する 3 つのスレッドのスタック トレースを次に示します。

"main" prio=5 tid=1 MONITOR
| group="main" sCount=1 dsCount=0 obj=0x40aed9a0 self=0x1772cb0
| sysTid=30378 nice=0 sched=0/0 cgrp=apps handle=1074254812
| state=S schedstat=( 0 0 0 ) utm=537 stm=93 core=1
at android.app.Activity.finish(Activity.java:~4138)
- waiting to lock <0x40fa7008> (a my.app.package.activities.tm.at_process_tabs) held by tid=21 (AsyncTask #3)
at android.support.v4.app.FragmentActivity.onBackPressed(SourceFile:175)
at android.app.Activity.onKeyUp(Activity.java:2145)
at android.view.KeyEvent.dispatch(KeyEvent.java:2633)

"AsyncTask #4" prio=5 tid=23 MONITOR
| group="main" sCount=1 dsCount=0 obj=0x41364a68 self=0x1ca4ec0
| sysTid=30749 nice=-1 sched=0/0 cgrp=apps handle=28938832
| state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=1
at my.app.package.activities.tm.at_process_tabs.a(SourceFile:~887)
- waiting to lock <0x40fa7008> (a my.app.package.activities.tm.at_process_tabs) held by tid=21 (AsyncTask #3)
at my.app.package.activities.tm.x.a(SourceFile:95)
at my.app.package.activities.tm.x.b(SourceFile:1)
at my.app.package.utils.android.d.call(SourceFile:203)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)

"AsyncTask #3" prio=5 tid=21 SUSPENDED
| group="main" sCount=1 dsCount=0 obj=0x41327370 self=0x1b982a0
| sysTid=30747 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=34484768
| state=S schedstat=( 0 0 0 ) utm=47 stm=5 core=0
at android.os.BinderProxy.transact(Native Method)
at android.content.pm.IPackageManager$Stub$Proxy.getApplicationInfo(IPackageManager.j...
4

1 に答える 1

1

問題は実際には非常に単純です。最初は見えませんでしたが、スタックトレースの一部だと思っていたにもかかわらず、最初からそこにありました。

waiting to lock <0x40fa7008> (a my.app.package.activities.tm.at_process_tabs) held by tid=21 (AsyncTask #3)

おもしろいことに、ProGuard よりも素敵なカラーリングとフォーマットで SO の方が読みやすいです (これを見ないことに対する私の 2 セントの言い訳)。

at_process_tabs は、ユーザーによって終了されるアクティビティであり、このメソッドは tid 21 および 23 によって呼び出されました。

synchronized public at_process_info getProcessInfo(String pid, String process_name)

メソッドが(便利なメソッドとして)アクティビティに移動されたため、問題が発生しました。

これをロックする代わりにロックするオブジェクトを作成して解決しました。

于 2013-02-26T01:07:43.617 に答える