Android通过rc启动三方可执行文件

步骤

  1. 编写rc文件
  2. 添加te文件
  3. 加入编译
  4. 调试

编写rc文件

service dms_server /vendor/bin/dms --flagfile=/vendor/bin/dms.flag
    user root
    oneshot
    group root shell system inet
    disable

on property:vendor.dms.enable=1
    chmod 0777 /mnt/obb
    touch /mnt/obb/raw_driver
    chmod 0777 /mnt/obb/raw_driver
    symlink /vendor/bin/dms_release /dms_release
    start dms_server

服务

service <name><pathname> [ <argument> ]*
    <option>
    <option>
参数 含义
name 表示此服务的名称
pathname 此服务所在路径因为是可执行文件,所以一定有存储路径。
argument 启动服务所带的参数
option 对此服务的约束选项
选项 描述
critical 据设备相关的关键服务,如果在4分钟内,此服务重复启动了4次,那么设备将会重启进入还原模式。
disabled 服务不会自动运行,必须显式地通过服务器来启动。
setenv 设置环境变量
socket [[ ]] 在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket. 用户名和组名默认为0
user 在执行此服务之前先切换用户名。当前默认为root.
group [ ] 类似于user,切换组名
oneshot 当此服务退出时不会自动重启.
class 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default.
onrestart 当服务重启时执行一条指令,
service dms_server /vendor/bin/dms --flagfile=/vendor/bin/dms.flag
    user root  //给服务指定一个类属,这样方便操作多个服务同时启动或停止
    oneshot  //当此服务退出时不会自动重启
    group root shell system inet
    disable   //服务不会自动运行

动作

on  <trigger>      ## 触发条件
    <command>      ##执行命令
    <command1>     ##可以执行多个命令
触发条件

on < trigger > 表示当什么条件满足的时候触发动作。

格式 含义
on early-init 在初始化早期阶段触发
on init 在初始化阶段触发
on late-init 在初始化晚期阶段触发
on boot/charger 当系统启动/充电时触发
on property 当属性值满足条件时触发
命令
命令 描写叙述
exec < path> [ < argument> ]* 运行指定路径下的程序,并传递參数.
export < name> < value> 设置全局环境參数。此參数被设置后对全部进程都有效.
ifup < interface> 使指定的网络接口"上线",相当激活指定的网络接口
import < filename> 导入一个额外的init配置文件.
hostname < name> 设置主机名
chdir < directory> 改变工作文件夹.
chmod < octal-mode> < path> 改变指定文件的读取权限.
chown < owner> < group> < path> 改变指定文件的拥有都和组名的属性.
chroot < directory> 改变进行的根文件夹.
class_start < serviceclass> 启动指定类属的全部服务,假设服务已经启动,则不再反复启动.
class_stop < serviceclass> 停止指定类属的所胡服务.
domainname < name> 设置域名
insmod < path> 安装模块到指定路径.
mkdir < path> [mode] [owner] [group] 用指定參数创建一个文件夹,在默认情况下,创建的文件夹读取权限为755.username为root,组名为root.
mount < type> < device> < dir> [ < mountoption> ]* 类似于linux的mount指令
setkey TBD(To Be Determined)
setprop < name> < value> 设置属性及相应的值.
setrlimit < resource> < cur> < max> 设置资源的rlimit(资源限制),不懂就百度一下rlimit
start < service> 假设指定的服务未启动,则启动它.
stop < service> 假设指定的服务当前正在执行。则停止它.
symlink < target> < path> 创建一个符号链接.
sysclktz < mins_west_of_gmt> 设置系统基准时间.
trigger < event> Trigger an event. Used to queue an action from another action. 这名话没有理解,望高手指点.
write < path > < string> [ < string> ]* 往指定的文件写字符串.

on property:vendor.dms.enable=1 // 当属性vendor.dms.enable 为1时触发
    chmod 0777 /mnt/obb     //改变/mnt/obb 操作权限
    touch /mnt/obb/raw_driver //创建raw_driver文件
    chmod 0777 /mnt/obb/raw_driver 
    symlink /vendor/bin/dms_release /dms_release  //给 /vendor/bin/dms_release 创建软链接
    start dms_server  //启动定义的服务

参考:
Android init.rc文件浅析
init.rc深入学习

添加te文件

作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。

SELinux 可以在各种模式下实现:
宽容模式 - 仅记录但不强制执行 SELinux 安全政策。
强制模式 - 强制执行并记录安全政策。如果失败,则显示为 EPERM 错误。
在选择强制执行级别时只能二择其一,您的选择将决定您的政策是采取操作,还是仅允许您收集潜在的失败事件。宽容模式在实现过程中尤其有用。

在开发环境可以通过:

setenforce 0  //宽容模式

setenforce 1 // 强制模式

标签、规则和域

SELinux 依靠标签来匹配操作和政策。标签用于决定允许的事项。套接字、文件和进程在 SELinux 中都有标签。SELinux 在做决定时需参照两点:一是为这些对象分配的标签,二是定义这些对象如何交互的政策。

在 SELinux 中,标签采用以下形式:user:role:type:mls_level

  • user :
  • role :
  • type : 是访问决定的主要组成部分,可通过构成标签的其他组成部分进行修改。对象会映射到类,对每个类的不同访问类型由权限表示。
  • mls_level:
u:object_r:dms_exec:s0

规则和域

政策规则采用以下形式:allow domains types:classes permissions;,其中:

  • Domain - 一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型。
  • Type - 一个对象(例如,文件、套接字)或一组对象的标签。
  • Class - 要访问的对象(例如,文件、套接字)的类型。
  • Permission - 要执行的操作(例如,读取、写入)。
allow appdomain app_data_file:file rw_file_perms;
// file_context
#dms
/vendor/bin/dms                  u:object_r:dms_exec:s0


//dms.te
type dms,domain;
type dms_exec,exec_type,file_type,vendor_file_type;

init_daemon_domain(dms)
net_domain(dms)

参考

AOSP-安全性-功能

加入编译

Android.mk 用预编译,将可执行文件加入系统中。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := dms	
LOCAL_SRC_FILES := dms
LOCAL_INIT_RC := dms.rc
LOCAL_MODULE_TAGS  := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_PATH  := $(TARGET_OUT_VENDOR_EXcECUTABLES)
include $(BUILD_PREBUILT)

参考

Android mk 引用 jar 包、so 库、aar 包,系统签名
Android系统开发进阶-Android编译系统介绍

调试

1.
setprop vendor.dms.enable 1 //通过条件触发
or
start dms_server  //启动dms_server 

2.
logcat -b all -s init // 查看init进程log

3.
ps -ef | grep dms  //查看dms进程id

你可能感兴趣的:(Android)