[Android O] [RK3399] -- 在 init 里添加一个系统服务并

家电修理 2023-07-16 19:16www.caominkang.com电器维修

前言

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

一、GPS 启动

        源码如下

#include 
#include 
#include 

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

        对应的 Android.mk 如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

mon_src_files := 
 main.c

LOCAL_MODULE := gpsopen
LOCAL_SRC_FILES := $(mon_src_files)

include $(BUILD_EXECUTABLE)

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

二、添加 init service

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

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

service gpsopen /system/bin/gpsopen
 class mian
 oneshot

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

PRODUCT_PACKAGES +=
 ... ...
 gpsopen

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

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

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

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

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

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

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

allo gpsopen self:capability dac_override;
typeattribute gpsopen coredomain;
 附

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

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

Copyright © 2016-2025 www.caominkang.com 曹敏电脑维修网 版权所有 Power by