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