私は今数週間ANRに苦労していますが、今でもthisのようなログを見ていません。それはstackoverflowのためには長すぎるので、どの部分が役に立つかもわかりません。 バックグラウンドで処理されているネットワーク要求が大量にある(そして、私はほぼ100%がメインスレッドに含まれていないことがわかります)、私はUIのようなものもたくさん作っています私はSharedPreferencesの大きな変更を観察し、可能な背圧を処理するためにsampleメソッドを使用しているので、RxJava観測値を介して共有プリファレンスからrecyclerviewsを設定しています。ヒントありがとう、私は完全に失われています。このANRログから有用なものを得るには
答えて
複数のプロセスのスレッドダンプがあります。便利な部分に到達するには、プロセスを見つけるまで "Cmd line"を検索することができます( "cz.vcelka.androidapp"、pidは21574)。
メインスレッドが何とかブロックされていることを意味するANRが表示された場合は、そのスタックトレースを確認する必要があります。ここでは、次のとおりです。
"main" prio=5 tid=1 Waiting
| group="main" sCount=1 dsCount=0 obj=0x74bc2fa0 self=0xb4db6500
| sysTid=21574 nice=0 cgrp=default sched=0/0 handle=0xb6fc1b34
| state=S schedstat=(0 0 0) utm=785 stm=88 core=1 HZ=100
| stack=0xbe29a000-0xbe29c000 stackSize=8MB
| held mutexes=
at java.lang.Object.wait!(Native method)
- waiting on <0x05853836> (a java.lang.Object)
at java.lang.Thread.parkFor$(Thread.java:1220)
- locked <0x05853836> (a java.lang.Object)
at sun.misc.Unsafe.park(Unsafe.java:299)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:810)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:971)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1278)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:203)
at android.app.SharedPreferencesImpl$EditorImpl$1.run(SharedPreferencesImpl.java:366)
at android.app.QueuedWork.waitToFinish(QueuedWork.java:88)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3560)
at android.app.ActivityThread.-wrap20(ActivityThread.java:-1)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke!(Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
だからあなたのメインスレッドがCountDownLatch
SharedPreferences
内のコード上で待機してブロックされています。 SharedPreferencesのソースコードを見て、もっと詳しく調べることができます。ある時点でSharedPreferences.Editor.apply()を呼び出すと、SharedPreferences
コードがディスクへの書き込みをワーカースレッドにエンキューしました。またawaitCommit
は(CountDownLatch
によって)書き込み動作を待機Runnable
であり、そしてQueuedWork.add()
アクティビティのメソッドが呼び出されたときにメインスレッドにが行われる作業をエンキューする方法であり、QueuedWork.add(awaitCommit)呼ばれます。それが起こったのです:が呼び出されました。そして、メインスレッドはワーカースレッドで書き込み操作を完了するのを待っています。
問題は、投稿したログが不完全であることです。 CountDownLatch.countDown()
を一度も呼び出さなかったワーカースレッドを含むいくつかのスレッドが存在しないため、デッドロックの原因を特定することはできません。ログ全体(あなたのプロセスのために、私は他のものが有用であるとは思わない)を投稿すれば、おそらくもっと助けることができます。
編集:私はsomeone else hereが同じ問題に遭遇したことに気付きました。彼らのために、ワーカースレッドはfsync(2)
でスタックされていました。 fsync
は、ファイルが大きくてディスクがビジーの場合は、実際には遅くなることがあります(複数秒間など)。私はそれがANRを引き起こしていると思います。私はそれがSharedPreferences
のバグとして分類されるかどうかは分かりません... から呼び出されたとしても、メインスレッドで長いブロック操作を引き起こすのはちょっと変わったようです...これが本当に問題であれば、唯一の回避策です私はapply()
の代わりにcommit()
を使用することが考えられます。これは同期書き込みを行うためです。ディスクにフラッシュするのにかなり時間がかかるような特別な設定では、バックグラウンドスレッドから実行する必要があります。
またはSharedPreferences
ファイルが大きすぎます(この場合、データベースを使用してスリム化することもできます)。
ありがとう!期待していると思われるが、私はさらにこの道を調査し、更新を取り戻す。Google Playデベロッパーコンソールは何らかの理由でログをトリムします。ヒントはどのように完成するのですか? – Semanticer
また、sharedPreferences用に[prefser](https://github.com/pwittchen/prefser)ライブラリを使用していますので、巨大なgsonの直列化/逆シリアル化があります。 – Semanticer
したがって、 'apply()'私はすでにバックグラウンドスレッドでこれを呼び出していたので、 'commit()'は本当に大幅に状況を改善しました。私は非常に頑張ってもARNを得ることができますが、次の論理的な動きは、SharedPreferencesの作業を簡単にすることだと思います。 – Semanticer
- 1. 誰かがこのANRログに光を当てることができますか?
- 2. ANRとクラッシュ(ログを読むのに役立ちます)
- 3. C2DMプッシュサービスを使用する場合のANRの取得
- 4. oprofileから最も有用な出力を得る最も良い方法は何ですか?
- 5. ANRエラー - > ANR keyDispatchingTimedOut
- 6. Docker:Tomcatにデプロイされたサービス固有のログを取得する
- 7. ログに情報がないIISからERR_CONNECTION_RESETを取得する
- 8. どこからでもコンテキストを取得するには?
- 9. このようなクラッシュ情報から有益な情報を得ることはできますか?
- 10. Tomcatからログを取得する
- 11. ハドソン - スレーブからログを取得する
- 12. CloudWatchからログを取得するAPI
- 13. カメラから有益な情報を得ることはできますか?
- 14. com.google.android.gms.DynamiteModulesによるANR
- 15. 私はシナトラのアプリでログを有効にするには、このコードを使用していシナトラ
- 16. この時点でログは予期しなかったものです(バッチスクリプト)
- 17. TagManagerServiceを使用したANR
- 18. ANR
- 19. WebSocketを - ログには何も
- 20. AngularJSのログを有効にする
- 21. ログの詳細を有効にする
- 22. JpaTransactionManagerのログを有効にする
- 23. org.springframework.integrationのDEBUGログを有効にする
- 24. レルムはエラーメッセージなしでANRエラーを引き起こします。
- 25. JavaコードでAndroidアプリケーションからログを取得するには?
- 26. 作業コピーではなくリポジトリからsvnログを取得
- 27. AppWidgetProviderからサービスを起動するときのANR
- 28. Firebaseの例外がどこからも取得されない
- 29. AppEngineのサーブレットフィルタからログすることはできますか?
- 30. -exportcert(Android)でハッシュを取得するときにKeytoolからの厄介なログ
このログは殺人です。私の目はその半分近くで出血し始め、CTRL + Fはどこにも「例外」がないと言っています...あなたはアプリを配備しましたか?私はアプリから私に送信されたクラッシュログを持っていました。ログは "Null Pointer Exception line 2you stupid dumbass"のようにかなりまっすぐでした。そして私はそれを修正しました:D – Vucko
これはあなたのアプリですか? cz.vcelka.androidapp? – W0rmH0le
@GuilhermePはい私のパッケージ名です – Semanticer