步骤

  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    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

更多相关文章

  1. Android(安卓)Studio Gradle配置
  2. Android(安卓)JNI和NDK学习(2)--编程入门
  3. android 系统定制的小技巧
  4. [整]Android(安卓)SlidingMenu Demo 环境搭建
  5. Android:Native C code打印android log
  6. Android(安卓)dp方式的屏幕适配工具使用(Android(安卓)Studio插
  7. 进程间通过intent传递数据失败
  8. Linux 解决文件名 中文乱码问题

随机推荐

  1. 两篇关于Android(安卓)App Widgets 的文
  2. Android(安卓)ContentProvider的使用
  3. Android(安卓)RadioButton 文字在左边
  4. Android(安卓)数据存储与读取:SQLite
  5. GCM(5)Working with MAVEN and Android(
  6. Android(安卓)layout xml总结
  7. android几种布局
  8. Android中android:visibility的3中属性的
  9. Android多媒体播放器源码解析(stagefrigh
  10. Android(安卓)TextUtils类介绍