一、代码环境
高通8550 Android13
二、场景分析
在native层,以模块的形式,定义一个定时器,编译成二进制文件,集成到system/bin目录,开机启动该程序(.rc文件中定义逻辑),定时执行一些周期性的任务
三、详细代码实现
1、在qssi/LA.QSSI.13.0/LINUX/android/external/目录下新建一个timer_schedule文件夹
qssi/LA.QSSI.13.0/LINUX/android/external/timer_schedule
2、在qssi/LA.QSSI.13.0/LINUX/android/external/timer_schedule目录下新建一下几个文件
Android.mk
main.cpp
timer_schedule.rc
(1)、qssi/LA.QSSI.13.0/LINUX/android/external/timer_schedule/Android.mk 代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE = timer_schedule
LOCAL_SRC_FILES = main.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_INIT_RC := timer_schedule.rc
LOCAL_CFLAGS += -Wall -Wno-unused-parameter
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog \
libandroidfw \
libutils
include $(BUILD_EXECUTABLE)
(2)、qssi/LA.QSSI.13.0/LINUX/android/external/timer_schedule/main.cpp代码如下:
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <cutils/properties.h>
static bool flag = true;
timer_t timeid; //定义一个全局的定时器id
const char DEFAULT_NTP_SERVER[16] = "ntp1.aliyun.com";
void task(int i)
{
char ntpServer[PROPERTY_VALUE_MAX];
char cmd[100];
property_get("persist.ruichi.ntpServer", ntpServer, DEFAULT_NTP_SERVER);
sprintf(cmd, "ntp_server %s", ntpServer);
system(cmd);
system("ntp_server updatetime");
}
void create_timer()
{
/****创建定时器***********/
struct sigevent evp; //环境结构体
int ret = 0;
memset(&evp, 0, sizeof(struct sigevent));
evp.sigev_value.sival_ptr = &timeid; //绑定i定时器
evp.sigev_notify = SIGEV_SIGNAL; //设置定时器到期后触发的行为是为发送信号
evp.sigev_signo = SIGUSR1; //设置信号为用户自定义信号1
signal(SIGUSR1, task); //绑定产生信号后调用的函数
ret = timer_create(CLOCK_REALTIME, &evp, &timeid); //创建定时器
if (ret == 0)
printf("timer_create ok\n");
}
void init_timer()
{
int ret = 0;
struct itimerspec ts;
ts.it_interval.tv_sec = 12 * 60 * 60; //设置定时器的定时周期是12h
ts.it_interval.tv_nsec = 0;
ts.it_value.tv_sec = 60; //设置定时器60s后启动
ts.it_value.tv_nsec = 0;
ret = timer_settime(timeid, 0, &ts, NULL); //初始化定时器
if (ret == 0)
printf("timer_settime ok\n");
}
int main()
{
create_timer();
init_timer();
while (flag)
{
sleep(60 * 60);
}
}
3、qssi/LA.QSSI.13.0/LINUX/android/external/timer_schedule/timer_schedule.rc 代码如下:
service timer_schedule /system/bin/timer_schedule
class late_start
user root
#开机自启动
on property:sys.boot_completed=1
start timer_schedule
4、qssi/LA.QSSI.13.0/LINUX/android/vendor/qcom/proprietary/prebuilt_HY11/target/product/
qssi/prebuilt.mk中添加模块
PRODUCT_PACKAGES += timer_schedule
5、配置seLinux
(1)、添加.te文件,包括private和public,文件内容和路径如下:
qssi/LA.QSSI.13.0/LINUX/android/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/timer_schedule.te内容如下:
typeattribute timer_schedule coredomain;
init_daemon_domain(timer_schedule)
qssi/LA.QSSI.13.0/LINUX/android/device/qcom/sepolicy/generic/prebuilts/api/30.0/public/timer_schedule.te 内容如下:
type timer_schedule, domain;
type timer_schedule_exec, exec_type, file_type, system_file_type;
(2)、在file_contexts中添加新增的timer_schedule,文件路径和内容如下:
qssi/LA.QSSI.13.0/LINUX/android/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/file_contexts
/system/bin/timer_schedule u:object_r:timer_schedule_exec:s0
在上述目录结构,同理添加配置31和32的