Android通过rc启动三方可执行文件
16lz
2021-01-24
步骤
- 编写rc文件
- 添加te文件
- 加入编译
- 调试
编写rc文件
service dms_server /vendor/bin/dms --flagfile=/vendor/bin/dms.flag user root oneshot group root shell system inet disableon 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.tetype 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 := dmsLOCAL_SRC_FILES := dmsLOCAL_INIT_RC := dms.rcLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS := EXECUTABLESLOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXcECUTABLES)include $(BUILD_PREBUILT)
参考
Android mk 引用 jar 包、so 库、aar 包,系统签名
Android系统开发进阶-Android编译系统介绍
调试
1.setprop vendor.dms.enable 1 //通过条件触发orstart dms_server //启动dms_server 2.logcat -b all -s init // 查看init进程log3.ps -ef | grep dms //查看dms进程id
更多相关文章
- Android(安卓)Studio Gradle配置
- Android(安卓)JNI和NDK学习(2)--编程入门
- android 系统定制的小技巧
- [整]Android(安卓)SlidingMenu Demo 环境搭建
- Android:Native C code打印android log
- Android(安卓)dp方式的屏幕适配工具使用(Android(安卓)Studio插
- 进程间通过intent传递数据失败
- Linux 解决文件名 中文乱码问题