Android Native层定义一个定时器模块,定期执行任务

一、代码环境

高通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的

猜你喜欢

转载自blog.csdn.net/banzhuantuqiang/article/details/132453362
今日推荐