カーネルログのこのタイムスタンプの不一致について誰か説明してもらえますか?
指定した時間に Android を起動するアプリを作成し、アプリはAlarmManager
API とセットを活用します。
AlarmManager.ELAPSED_REALTIME_WAKEUP
アプリは意図したとおりに動作し、ユーザーが指定した時刻に正しくウェイクアップします。しかし、カーネルのタイムスタンプには不一致があります。からソースコードをたどり、Androidがアラームの起床時間を正しく設定してカーネルに送信することを確認しました(たとえば、Androidが経過時間を取得するために使用するJavaレイヤーからAlarmManagerService.java
、100秒を追加し、秒とナノ秒の値を変換して、最後に、JNI を介してカーネル層に送信します)。alarm-dev.c
SystemClock.elapsedRealtime()
ただし、ログを読み取るdmesg
と、カーネルのタイムスタンプに不一致があるように見えます。alarm_ioctl
状態を持つ関数ANDROID_ALARM_SET(0):
が呼び出された時点でdmesg
、次のメッセージが出力されました。
[20450.036529] alarm 2 set 20544.720000000
これ[20450.036529]
は、それが現在の時刻であり20544.720000000
、AlarmManager
Android が起動する時刻であることを意味します。値20544.720000000
は、Android レイヤーと logcat のタイムスタンプ (例: logcat -v time
) から設定されました。この値は、Android が起動することになっているときです。
Android レイヤーからカーネル レイヤーまでの所要時間は 10 分の 1 秒未満ですが、なぜデルタが94.683471
である5.316529
必要があるのでしょうか? または、経過時間は、によって出力されたカーネル時間とは異なりdmesg
ますか?
もう 1 つの興味深い観察結果は、上記のように、ユーザーが指定した時間にアプリが起動することです。この場合、ユーザーがアプリを呼び出した後AlarmManager
、100 秒でタブレットが起動しました。
ありがとうございました、
参考文献: