概叙
Native Alarm 承担了两部分功能:
- 实现定时唤醒功能。
- 设置系统时间(包括 RTC 时间)。
定时唤醒是通过 timerfd 和 epoll 配合完成。设置 RTC 时间则是通过直接控制 rtc 驱动完成。
定时实现
首先调用 android_server_AlarmManagerService_init 函数实现 timerfd 和 epoll 初始化:
static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject)
{
...
epollfd = epoll_create(fds.size());
...
for (size_t i = 0; i < fds.size(); i++) {
fds[i] = timerfd_create(android_alarm_to_clockid[i], TFD_NONBLOCK);
...
}
AlarmImpl *ret = new AlarmImpl(fds, epollfd, wall_clock_rtc());
for (size_t i = 0; i < fds.size(); i++) {
epoll_event event;
event.events = EPOLLIN | EPOLLWAKEUP;
event.data.u32 = i;
int err = epoll_ctl(epollfd, EPOLL_CTL_ADD, fds[i], &event);
...
}
...
return reinterpret_cast<jlong>(ret);
}
其中 android_alarm_to_clockid 定义如下:
static const clockid_t android_alarm_to_clockid[N_ANDROID_TIMERFDS] = {
CLOCK_REALTIME_ALARM,
CLOCK_REALTIME,
CLOCK_BOOTTIME_ALARM,
CLOCK_BOOTTIME,
CLOCK_MONOTONIC,
CLOCK_REALTIME,
};
android_server_AlarmManagerService_init 函数主要以下工作:
- 通过 timerfd_create 函数创建 android_alarm_to_clockid 中预定义的定时器,并将其加入到 epoll 中。
- 构造 Native Alarm 对象 (AlarmImpl),由其代理 Native Alarm 的功能。
AlarmManagerService java 部分通过调用 set 函数来设置闹钟,相应的 Native 的 android_server_AlarmManagerService_set 函数会被调用,此函数会调用 AlarmImpl 的 set 函数:
int AlarmImpl::set(int type, struct timespec *ts)
{
if (

本文详细介绍了Android NativeAlarm的实现原理,包括如何使用timerfd和epoll实现定时唤醒功能,以及如何通过ioctl设置RTC系统时间以确保断电后时间的恢复。核心操作涉及android_server_AlarmManagerService_init函数、AlarmImpl类以及相关系统调用,如settimeofday和ioctl。

851

被折叠的 条评论
为什么被折叠?



