alarm timer
alarm timer
kernel里的alarm timer可以由以下方式来设置:
1. android alarmmanagerservice来设置,此时的timer type要为RTC_WAKEUP或者ELAPSED_REALTIME_WAKEUP,在alarmmanagerservice jni里通过timerfd_settime()系统调用设置到kernel
2. 走__timer_settime系统调用设置
android alarm timer类型
public class AlarmManager { public static final int RTC_WAKEUP = 0; public static final int RTC = 1; public static final int ELAPSED_REALTIME_WAKEUP = 2; public static final int ELAPSED_REALTIME = 3;
RTC表示系统的时间,系统时间可以人为修改;
ELAPSED_REALTIME表示系统开机以来的时间(boot time)
带WAKEUP的表示会唤醒睡眠状态下的CPU,而不带WAKEUP的表示不会唤醒CPU
上面4个类型分别对应kernel里的如下类型(前面4个),带ALARM的在kernel里将走alarmtimer case,不带的话将走hrtimer case。如果是alarm timer case,在系统待机时将会找出最近的expire timer设置到RTC,之后这个timer expire时RTC将唤醒系统
CLOCK_REALTIME_ALARM,
CLOCK_REALTIME,
CLOCK_BOOTTIME_ALARM,
CLOCK_BOOTTIME,
CLOCK_MONOTONIC,
CLOCK_REALTIME,
android通过alarmmanagerservice设置timer callstack
07-19 03:42:21.970 537 1863 W System.err: java.lang.Throwable: jni_callstack 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService.set(Native Method) 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService.access$1600(AlarmManagerService.java:133) 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService$Injector.setAlarm(AlarmManagerService.java:3972) 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService.setLocked(AlarmManagerService.java:3466) 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService.rescheduleKernelAlarmsLocked(AlarmManagerService.java:3134) 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService.setImplLocked(AlarmManagerService.java:2107) 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService.setImplLocked(AlarmManagerService.java:1900) 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService.setImpl(AlarmManagerService.java:1847) 07-19 03:42:21.970 537 1863 W System.err: at com.android.server.AlarmManagerService$4.set(AlarmManagerService.java:2202) 07-19 03:42:21.970 537 1863 W System.err: at android.app.IAlarmManager$Stub.onTransact(IAlarmManager.java:168) 07-19 03:42:21.970 537 1863 W System.err: at android.os.Binder.execTransactInternal(Binder.java:1154) 07-19 03:42:21.970 537 1863 W System.err: at android.os.Binder.execTransact(Binder.java:1123)
07-19 03:34:39.430 537 537 W System.err: java.lang.Throwable: jni_callstack 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService.set(Native Method) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService.access$1600(AlarmManagerService.java:133) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService$Injector.setAlarm(AlarmManagerService.java:3972) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService.setLocked(AlarmManagerService.java:3466) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService.rescheduleKernelAlarmsLocked(AlarmManagerService.java:3134) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService.setImplLocked(AlarmManagerService.java:2107) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService.setImplLocked(AlarmManagerService.java:1900) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService.setImpl(AlarmManagerService.java:1847) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.AlarmManagerService$4.set(AlarmManagerService.java:2202) 07-19 03:34:39.430 537 537 W System.err: at android.app.AlarmManager.setImpl(AlarmManager.java:696) 07-19 03:34:39.430 537 537 W System.err: at android.app.AlarmManager.set(AlarmManager.java:635) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.job.controllers.TimeController.updateAlarmWithListenerLocked(TimeController.java:420) 07-19 03:34:39.430 537 537 W System.err: at com.android.server.job.controllers.TimeController.setDelayExpiredAlarmLocked(TimeController.java:388)
(上面第一个是走的binder flow,第二个看起来是AlarmManager直接到AlarmManagerService的,这能直接到AlarmManagerService?后面再确认...)
走__timer_settime系统调用设置alarm timer
callstack如下,第一个为kernel space的,第二个为user space的
stacktrace for bt_stack_manage-4107:
[ffffffc0103247dc] alarm_start+0x0/0x1f4
[ffffffc010326c58] common_timer_set+0x100/0x178
[ffffffc010328670] do_timer_settime+0xcc/0x1d0
[ffffffc010326e24] __arm64_sys_timer_settime32+0x80/0xd4
[ffffffc01022a628] el0_svc_common+0xc4/0x1ac
[ffffffc01022a72c] el0_svc_compat_handler+0x1c/0x28
[ffffffc0100844a4] el0_svc_compat+0x8/0x24
pid: 3880, tid: 3911, name: bt_stack_manage >>> com.android.bluetooth <<<
#00 pc 0009b72c /apex/com.android.runtime/lib/bionic/libc.so (__timer_settime+12) (BuildId: 1c0594b10754326853446a009221efb5)
#01 pc 0025ca6f /system/lib/libbluetooth.so (reschedule_root_alarm()+258) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
#02 pc 0025c0cf /system/lib/libbluetooth.so (alarm_set_internal(alarm_t*, unsigned long long, void (*)(void*), void*, fixed_queue_t*, bool)+142) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
#03 pc 0025c033 /system/lib/libbluetooth.so (alarm_set(alarm_t*, unsigned long long, void (*)(void*), void*)+26) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
#04 pc 001c92cf /system/lib/libbluetooth.so (hci_module_start_up()+254) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
#05 pc 0025b1eb /system/lib/libbluetooth.so (module_start_up(module_t const*)+82) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
#06 pc 0026c9c3 /system/lib/libbluetooth.so (bte_main_enable()+86) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
#07 pc 001c6721 /system/lib/libbluetooth.so (event_start_up_stack(void*)+132) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
#08 pc 00072213 /system/lib/libchrome.so (base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*)+134) (BuildId: 7e14c1d1d9c59a99aae99b1f938012f5)
通过alarmtimer_start event trace查看谁设置的alarm timer
alarm_start()
events/alarmtimer/alarmtimer_start
bt_stack_manage-3225 [000] d..1 26.331880: alarmtimer_start: alarmtimer:00000000db64776a type:BOOTTIME expires:38330000000 now:26330584241 bt_stack_manage-3225 [000] d..1 26.331891: <stack trace> => alarm_start => alarm_timer_arm => common_timer_set => do_timer_settime => __arm64_sys_timer_settime32 => el0_svc_common => el0_svc_compat_handler => el0_svc_compat bt_stack_manage-3828 [002] d..1 38.696645: alarmtimer_start: alarmtimer:000000004d035fba type:BOOTTIME expires:50695000000 now:38695350155 bt_stack_manage-3828 [002] d..1 38.696653: <stack trace> => alarm_start => alarm_timer_arm => common_timer_set => do_timer_settime => __arm64_sys_timer_settime32 => el0_svc_common => el0_svc_compat_handler => el0_svc_compat
分类:
Android
, kernel misc
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析