[解決済み] adb shell dumpsys alarm」出力の読み方
質問
アラームを正しく設定することと、アラームのキャンセルと再スケジュールのメカニズムを理解することに苦労しています。
デバイス上でスケジュールされたすべてのアラームを取得する adb コマンドがあることを発見しましたが、出力の形式を説明するドキュメントを見つけられませんでした。
私はここで多くの説明を求めていることを理解しているので、もし誰かが "adb shell dumpsys alarm" についての詳細な説明を含むリンクを投げてくれるなら、私は本当に感謝します。
では、以下が質問です。
-
保留中のアラームバッチ 23
a. 23」は現在有効でスケジュールされているアラームの数ですか?
-
Batch{4293d3a8 num=1 start=1369361 end=1407261}です。
RTC #0: Alarm{4293d358 type 1 com.android.chrome} です。
type=1 whenElapsed=1369361 when=+19s304ms window=-1 repeatInterval=0 count=0
operation=PendingIntent{429e4500: PendingIntentRecord{429dbbc8 com.android.chrome broadcastIntent}} です。a. num=1」「start=1369361」「end=1407261」とは何ですか?
b. 'RTC'はRTCアラームの略だと思うのですが。
c. '#0'は何の略でしょうか?
d. type=1」は何を意味するのか?
e. when=+19s304ms」は、19秒後にアラームが鳴るという意味ですか?
f. window=-1'とはどういう意味ですか?
g. repeatInterval=0'は非繰り返しアラームという意味ですか?
h. count=0'は、このアラームが電話のスリープ状態により延期されなかったことを意味しますか?
i. 'operation=PendingIntent{...}' は保留中のインテントを表し、それはアラームによってトリガーされると推測されます。
-
ブロードキャスト・レフ・カウント 0
a. これは何ですか?
-
トップアラーム
a. これは何ですか?
-
+47s271ms実行、0ウェイクアップ、2アラーム:com.username.weatherinfo
act=com.username.receivers.CyclicWeatherUpdater.WEATHER_UPDATE_ACTION
cmp={com.username.weatherinfo/com.username.receivers.CyclicWeatherUpdater} とする。a. 47s271ms」は、このアラームが47秒後に鳴るという意味ですか?
b. 0 wakeups' とは、アラームが一度も作動しなかったという意味ですか?
c. 2アラーム』とは何ですか?
d. com.username.weatherinfo' はパッケージ名の略で、コンテクストフィールドで保留中のインテントに与えられたものですか?
e. act' はインテントに送信されたアクションを意味していますか?
f. cmp'とは何ですか?パッケージ名とクラス名から構成されているのはわかりますが、どこから取っているのでしょうか?インテンションコンストラクタからですか? g. アラームの一部が 'act' のみ、または 'cmp' のみである理由は何ですか? cmp」フィールドのないアラームは暗黙のブロードキャストインテント用であると仮定しました。しかし、なぜ'act'フィールドのないアラームがあるのですか? -
アラームの統計
a. これは何ですか?
どのように解決するのですか?
このスレッドが古いことは承知していますが、回答は簡単には見つからず、役に立つかもしれません。私は、これらのメッセージが何を意味するのかを理解するためにかなりの時間を費やしました。
Q1: バッチ
Pending alarm batches: 23
アラームはバッチに整理されています。 ドキュメントに記載されているように :
API 19以降、このメソッドに渡されたトリガー時刻は不正確なものとして扱われます:アラームはこの時刻より前には配信されませんが、遅延してしばらくしてから配信されることがあります。OSはこのポリシーを使用して、次のことを行います。 バッチ処理に使用されます。 アラームをシステム全体でまとめて、デバイスのウェイクアップの回数を最小限に抑え、バッテリーの使用を最小限に抑えます。一般に、近い将来にスケジュールされたアラームは、遠い将来にスケジュールされたアラームほど長くは延期されません。
バッチごとに1つ以上のアラームがある場合があります。この場合、23個の
バッチ
のアラームは、おそらく23個より多くのアラームが予定されていることを意味します。その中で
dumpsys alarm
の出力では、各バッチを説明する行は次のようになります。
Batch{4293d3a8 num=1 start=1369361 end=1407261}:
その中で
-
4293d3a8
は、バッチに関連する内部 ID です。 -
num=1
は、このバッチ内のアラームの数です。この場合、バッチ内のアラームは1つだけです。 -
は
start
とend
の数値は、最後にシステムが再起動されてから経過したミリ秒数を表します。 この投稿で説明した また、バッチ内のアラームがトリガーされる時間のウィンドウをおおまかに表します。
Q2: アラームについて
各アラームは、次のような3行で記述されています。
RTC #0: Alarm{4293d358 type 1 com.android.chrome}
type=1 whenElapsed=1369361 when=+19s304ms window=-1 repeatInterval=0 count=0
operation=PendingIntent{429e4500: PendingIntentRecord{429dbbc8 com.android.chrome broadcastIntent}}
その中で
-
のいずれかであり、最初の部分は
RTC_WAKEUP
,RTC
,ELAPSED_WAKEUP
またはELAPSED
を表します。type
のアラームを表し、それぞれ 0 ~ 3 の整数値に対応します。 -
#0
はバッチ内のアラームの番号で、番号は 0 からn-1
ここでn
は、バッチ内のアラームの数です。あなたのアラームが他のアラームとバッチされる場合、最も遠い将来の "when=" がその時刻を定義します。 すべて バッチ内のアラームがトリガーされる時間を定義します。 -
4293d358
はアラームに関連する内部 ID 番号です。 -
com.android.chrome
はアラームを設定したクラスのパッケージ名です。 -
type=1
はアラームのタイプで、上記の最初の箇条書きを参照してください。 -
whenElapsed=1369361
は、このアラームがトリガーされる、システム開始からのミリ秒数を指します (おおよそ)。 -
when=+19s304ms
はアラームが19秒後、304ミリ秒後に発生することを意味します。dumpsys alarm
が呼び出された時刻から 304 ミリ秒後の 19 秒後にアラームが作動することを意味します。同様に、次のような値も+2d13h29m03s882ms
は、2 日 13 時間 29 分...先の相対的な時刻を指しています。 -
window=
は、アラームがバッチ処理されるメソッドに関連する 2 つの内部定数のうちの 1 つを指します。AlarmManager.WINDOW_EXACT=0
でアラームがスケジュールされたときに設定されます。setExact()
またはsetAlarmClock()
.AlarmManager.WINDOW_HEURISTIC=-1
でアラームがスケジュールされたときに設定されます。setInexactRepeating()
. それ以外の場合は、APIのバージョンによって値が決まります。API < 19 (KitKat)の場合。WINDOW_EXACT
が使用され、API >= 19の場合はWINDOW_HEURISTIC
が使用されます。(私は を掘り下げるとAlarmManager.java
ソースコード を参照してください)。 -
repeatInterval=900000
は、アラームが繰り返される頻度です。例えば、900000msごと、または15分ごとです。値0は、アラームが繰り返されないことを意味します。 -
count=
はアラームの回数を意味します。 べきである が発動されましたが はありませんでした。 というように、何らかの理由でスキップされたことを意味します。ここでは0が良い数字です。 >0は、何らかの理由でアラームがスキップされたことを意味します。 -
operation=PendingIntent{...}
は参照先としてPendingIntent
への参照であり、アラームによってトリガーされます。によってPendingIntent
を使ってインスタンス化されたかどうかによってgetService
,getBroadcast
,getActivity
またはgetActivities
の場合、アラームはサービスを開始し、ブロードキャストを送信し、1つまたは複数のアクティビティを開始します。
Q3: ブロードキャスト参照回数
これ以降の出力項目を知るために、私は
を掘り下げる必要がありました。
AlarmManagerService.java
ソースコード
.
いくつかのアラームを動作させるために、デバイスは起こされる必要があり、必要なすべてのブロードキャストが送信されるまで、スリープに戻るべきではありません。内部変数
mBroadcastRefCount
は 0 で初期化され、送信されるブロードキャストがキューに入れられるとインクリメントされます。ブロードキャストが送信されるたびにデクリメントされ、0に戻ると
wakeLock
が解放され、デバイスがスリープに戻っても大丈夫になります。
Broadcast Ref Count: 0
は、単に、その時点で
dumpsys alarm
が実行された時点では、ブロードキャストを送信している最中ではなかったということです。
Q4: トップアラーム
これは、アラーム コードが実行された総集約時間によって降順にランク付けされた上位 10 件のアラームです。これは、システム リソースを最も多く消費しているアラームを見つけるために使用できます。たとえば、バッテリーの寿命を消耗しているプロセスの障害になっている可能性があるものを見つけることができます。
Q5: アラームの統計
このセクションは、システムが最後に再起動されてから実行されたすべてのアラームの統計情報を表示します。ここで、過去に設定したアラームが作動したかどうか、電話を起こしたかどうかなどを確認することができます。これらのエントリの形式は次に説明します。
Q6: アラーム統計の入力項目
アラーム統計のエントリは、次のようなものです。
com.example.someapp +1s857ms running, 0 wakeups:
+1s817ms 0 wakes 83 alarms: cmp={com.example.someapp/com.example.someapp.someservice}
+40ms 0 wakes 1 alarms: cmp={com.example.someapp/com.example.someapp.someotherservice}
のところは、1行目に
-
com.example.someapp
はアラームを発生させたプロセスのパッケージ名です。 -
+1s857ms running
は、プロセスによって消費された合計システム時間です。 -
0 wakeups
は、これらのアラームのいずれかによってデバイスが起動された回数です。
で、それ以降の各行は、設定されたアラームの一つを参照しています。
-
+1s817ms
はシステム全体の消費時間 -
0 wakes
はデバイスを起動しなければならなかった回数です。 -
83 alarms
はアラームが作動した回数で、繰り返しアラームの場合は1回となります。 -
cmp={...}
アラームがトリガーされたときに開始されたサービスです。
代わりに、アラームがブロードキャストをトリガーした場合、エントリーは次のようになります。
android +4m51s566ms running, 281 wakeups:
+2m46s583ms 0 wakes 1224 alarms: act=android.intent.action.TIME_TICK
+1m25s624ms 89 wakes 89 alarms: act=android.content.syncmanager.SYNC_ALARM
+52s898ms 0 wakes 41 alarms: act=com.android.server.action.NETWORK_STATS_POLL
...
を使っています。
-
act=...
放送された意図の名前である
アラームに
cmp={...}
と
act=...
エントリがあり、アラームはインテントをブロードキャストし、サービスを開始したことを意味します。
概要
の出力を使ってアンドロイドのアラームをデバッグする。
adb shell dumpsys alarm
の出力を使ってアンドロイドアラームをデバッグするのは厄介です。
dumpsys
メッセージが完全に説明されている中央の場所がありません。アラームがどのようにまとめられるかは必ずしも明らかではありませんし、時にはサービスやアクティビティを希望通りにトリガーさせることが難しい場合もあります。これがアラームのデバッグを試みる人々にとって有用なリファレンスになることを願っています。
関連
-
[解決済み] 複数のデバイスを接続しているときにADB Shellを使用するには?error: more than one device and emulator "で失敗します。
-
[解決済み] Android ADBツールでアプリケーションを起動する方法
-
[解決済み] アンドロイドアプリのユーザーデータを消去する
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] APKが署名済みかデバッグビルドかを確認するには?
-
[解決済み] キャンバスに複数行のテキストを描画する
-
[解決済み] PendingIntentの "requestCode "は何に使うのですか?
-
[解決済み] Recyclerviewと異なるタイプの行のインフレーションの処理
-
[解決済み] <string> XMLで改行やタブを作るには(eclipse/android)?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] Eclipseでのandroid:configChangesでのAdmobエラー
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] Androidでマイナスマージンを使用するのは悪いことですか?
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] AsyncTaskを複数回実行する
-
[解決済み] proguard hell - 参照されているクラスが見つかりません。
-
[解決済み] Recyclerviewと異なるタイプの行のインフレーションの処理
-
[解決済み] Android AlarmManager - RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP
-
[解決済み] AlarmManagerのアクティブなPendingIntentsのリストを取得する