[Android O] [RK3399] -- 在 init 里添加一个系统服务并设置其 SEAndroid权限

前言:

        在实际的项目中,使用到一个 GPS 模块,该模块需要在系统启动时启动,于是这里编写了 GPS 启动的程序,并添加到 init 里,进行开机自启动。具体实现下面进行详细介绍。

一、GPS 启动

        源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    for(;;)
    {
        if(access("/dev/ttyUSB2", F_OK) == 0)
        {
            system("echo -e \"AT+QGPS=1\r\n\" > /dev/ttyUSB2");
            sleep(2);
            sleep(20);
            return 0;
        }
        printf("wait for sleep \n");
        sleep(2);
    }
    return 1;
}

        对应的 Android.mk 如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

common_src_files := \
    main.c

LOCAL_MODULE := gpsopen
LOCAL_SRC_FILES := $(common_src_files)

include $(BUILD_EXECUTABLE)

        以上程序通过发送 AT 指令 启动GPS模块。

二、添加 init service

        service(服务)是一个程序,以 service 开头,由 init 进程启动,一般运行于另外一个 init 的子程序,所以启动 service 前需要判断对应的可执行文件是否存在。init 生成的子进程定义在 rc 文件,其中每一个 service,在启动时会通过 fork 方式生成子进程。

        在此次需求中,我们把该 service 添加到 /device/rockchip/common/init.rk30board.rc 文件中:

service gpsopen /system/bin/gpsopen
    class mian
    oneshot

        另外,我们把 service gpsopen 添加到位于 /device/rockchip/common/device.mk 中的 PRODUCT_PACKAGES 属性中:

PRODUCT_PACKAGES +=
    ... ...
    gpsopen

        PRODUCT_PACKAGES 指定 make 时需要编译进 system 中的包,这部分虽然也生成 apk,但用户是删不掉的。

三、添加系统服务的权限声明

        1、定义文件的安全上下文:

        添加以下内容到 /device/rockchip/common/sepolicy/file_contexts 文件中

/system/bin/gpsopen        u:object_r:gpsopen_exec:s0

        2、创建一个 gpsopen.te 文件,在 /device/rockchip/common/sepolicy/ 目录,内容如下:

type gpsopen, domain;            // gpsopen service 的域(domain) 类型定义
type gpsopen_exec, exec_type, file_type;    //gpsopen 的可执行文件(客体) 的类型定义
init_daemon_domain(gpsopen)    // init 启动service 时类型转换声明,直接用一个宏,主要是用于把 gpsopen_exec(客体) 转换成 demo(进程域)

allow gpsopen self:capability dac_override;
typeattribute gpsopen coredomain;

 附:

        ps  -Z 查看应用权限上下文,如 Setting 是 u:r:system_app:s0

        ls -Z 查看文件的安全上下文

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值