[Android O] [RK3399] -- 在 init 里添加一个系统服务并
前言
在实际的项目中,使用到一个 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 serviceservice(服务)是一个程序,以 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 查看文件的安全上下文
空调维修
- 海信电视维修站 海信电视维修站点
- 格兰仕空调售后电话 格兰仕空调维修售后服务电
- 家电售后服务 家电售后服务流程
- 华扬太阳能维修 华扬太阳能维修收费标准表
- 三菱电机空调维修 三菱电机空调维修费用高吗
- 美的燃气灶维修 美的燃气灶维修收费标准明细
- 科龙空调售后服务 科龙空调售后服务网点
- 华帝热水器维修 华帝热水器维修常见故障
- 康泉热水器维修 康泉热水器维修故障
- 华凌冰箱维修电话 华凌冰箱维修点电话
- 海尔维修站 海尔维修站点地址在哪里
- 北京海信空调维修 北京海信空调售后服务
- 科龙空调维修 科龙空调维修故障
- 皇明太阳能售后 皇明太阳能售后维修点
- 海信冰箱售后服务 海信冰箱售后服务热线电话
- 海尔热水器服务热线