Android9 init.rc添加开机启动service 解决sepolicy问题

1 引言

本文主要是记录自己在init.rc中添加开机启动service的流程,以及过程中遇到的问题和对应的解决方案,供大家参考
android版本:Android-9.0.0_r1
设备信息:Pixel XL

2 步骤

init.rc中添加service主要分为三步:
(1)源码中添加可执行文件;
(2)init.rc中添加service;
(3)解决sepolicy问题(如果出现的话),
以下分别进行记录。

2.1 源码目录中添加自己的可执行文件

此处写的简易一些,分为一个cpp文件及一个Android.mk文件
printTest.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void my_system(const char *cmd)
{
    char result[10240] = {0};
    char buf[1024] = {0};
    FILE *fp = NULL;

    if( (fp = popen(cmd, "r")) == NULL ) {
        printf("popen error!\n");
        return;
    }

    while (fgets(buf, sizeof(buf), fp)) {
        strcat(result, buf);
    }

    pclose(fp);
    printf("result: %s\n", result);
}

int main()
{
    printf("before running");
    for(int i = 0; i < 100; i++) {
        sleep(30);
        my_system("ps -ef");
    }    
    return 0;
}

Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
        printTest.cpp

LOCAL_MODULE:= printTest
LOCAL_32_BIT_ONLY := true

include $(BUILD_EXECUTABLE)

另外,单独的添加这两个文件后,再执行make命令的话,是不会编译这个二进制文件的,还需要在build/target/product/base.mk下加上一句:PRODUCT_PACKAGES += printTest,如下:

diff --git a/target/product/base.mk b/target/product/base.mk
old mode 100644
new mode 100755
index bc3710c61..1d2eafd1e
--- a/target/product/base.mk
+++ b/target/product/base.mk
@@ -142,6 +142,7 @@ PRODUCT_PACKAGES += \
     traced_probes \
     vdc \
     vold \
+    printTest \
     wm

这样在执行make后,android会自动编译该二进制文件,在system/bin/ 文件夹下也会有printTest文件出现

2.2 init.rc文件添加自己的service

init.rc文件位置:system/core/rootdir/init.rc
添加方法是先用service语句定义自己的service名,再在合适的时机进行start(此处选择启动后进行start)

2.2.1 定义service

在init.rc中添加下列语句(此处均为printTest,相应名称需要按照自己的名字进行替换)

service printTest /system/bin/printTest
    user root
    group root
    seclabel u:r:printTest:s0
    class main    
    oneshot

2.2.2 设置启动时机

service语句只是定义了一个service,还需要在相应的时候进行启动,这里选的是在on property:sys.boot_completed=1下一行添加start printTest语句:

diff --git a/rootdir/init.rc b/rootdir/init.rc
old mode 100644
new mode 100755
index b9464e7fd..2fcb24f6f
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -717,6 +717,7 @@ on property:vold.decrypt=trigger_shutdown_framework
     class_reset main
 
 on property:sys.boot_completed=1
+    start printTest
     bootchart stop

这样,在启动完成后,就会开始执行该service(路径为/system/bin/printTest)

3 sepolicy策略

大多数的教程说在上述步骤完成后进行make及烧录,在adb中执行ps -Z理论上就可以看到自己的进程名,但android9则没有出现想要的结果。查找对应的文档,说该问题属于sepolicy策略问题,经过大量的尝试,将android9适用的方法给出:

3.1 /device/google/marlin/sepolicy/file_contexts

diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts
old mode 100644
new mode 100755
index f104cbb4..0cea3b50
--- a/sepolicy/file_contexts
+++ b/sepolicy/file_contexts
@@ -81,6 +81,7 @@
 # files in /system
 /system/bin/preloads_copy\.sh      u:object_r:preloads_copy_exec:s0
 /system/bin/move_widevine_data\.sh u:object_r:move-widevine-data-sh_exec:s0
+/system/bin/printTest u:object_r:printTest_exec:s0
 
 # files in /vendor
 /vendor/bin/qsee_logger            u:object_r:qsee_logger_exec:s0

3.2 file_contexts同目录下添加printTest.te文件

文件内容如下

type printTest, domain;

type printTest_exec, exec_type, file_type;

init_daemon_domain(printTest)

3.3修改domain.te

此时进行make编译,将会报如下错误

libsepol.report_failure: neverallow on line 998 of system/sepolicy/public/domain.te (or line 11313 of policy.conf) violated by allow printTest printTest_exec:file { execute entrypoint };

按照指示,翻到domain.te的998行,有如下内容:

full_treble_only(`
    # Do not allow vendor components to execute files from system
    # except for the ones whitelist here.
    neverallow {
        domain
        -coredomain
        -appdomain
        -vendor_executes_system_violators
        -vendor_init
    } {
        exec_type
        -vendor_file_type
        -crash_dump_exec
        -netutils_wrapper_exec
    }:file { entrypoint execute execute_no_trans };
')

参考其他人的博客,neverallow中带有“-”号的表明将该类型从neverallow规则中去除,按照报错信息,由于printTest和printTest_exec分别为domain及exec_type类型,所以在exec_type前加上-号,再次进行编译,报错:

The following domain(s) must be associated with the "coredomain" attribute because they are executed off of /system:
printTest

按照提示,将printTest.te修改如下

type printTest, domain, coredomain;

type printTest_exec, exec_type, file_type;

init_daemon_domain(printTest)

再进行make,无报错完成

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容