Android init.rc自定义service

在package/app/下创建loop文件夹,然后编写自己的cpp文件loop.cpp

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

int main()
{

    int i=0;
    for(i;i<1000;i++)
    {
      sleep(1000); 
      printf("This is  a  customized process\n");
    }

}

然后再编写一个自定义的程序Android.mk 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CLANG := true

LOCAL_SRC_FILES := loop.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/..

LOCAL_MODULE := loop


include $(BUILD_EXECUTABLE)

将loop.cpp和Android.mk放到loop的文件夹下,将loop添加到core.mk中

在build/target/produce/core.mk中添加

PRODUCT_PACKAGES += \
             loop

在system/core/rootdir/init.rc中定义service

service loop_server /system/bin/loop
    class main
    user root
    group root system
    disabled
on property:sys.loop=1
    start loop_server
on property:sys.loop=0
    stop loop_server

我是在高通平台添加的所以在device/qcom/sepolicy/commom下添加自己的te文件,其实我这个custom不需要添加 te文件的,因为我这个应用不需要进行权限申请,只是单纯打印,这个te文件是从别的项目里拿来的,改一下名字而已.

type loop, domain, domain_deprecated;
type loop_exec, exec_type, file_type;
init_daemon_domain(loop)

allow loop smem_log_device:chr_file rw_file_perms;

allow loop self:capability {
    setuid
    setgid
    dac_override
    dac_read_search
    sys_admin
    net_raw
    net_admin
    fowner
    fsetid
    kill
    sys_module
};

allow loop self:tcp_socket { bind create accept listen write getopt getattr read};
allow loop self:capability2 syslog;
allow loop self:packet_socket { create ioctl bind getopt setopt };
allow loop system_file:file x_file_perms;
allow loop shell_exec:file rx_file_perms;

allow loop uhid_device:chr_file ioctl;
allow loop graphics_device:chr_file open;
allow loop node:tcp_socket node_bind;
allow loop node:udp_socket node_bind;
allow loop surfaceflinger:binder transfer;
allow loop graphics_device:chr_file { read write ioctl };
allow loop uhid_device:chr_file open;
allow loop port:tcp_socket name_bind;
allow loop port:udp_socket name_bind;
allow loop surfaceflinger_service:service_manager find;
allow loop surfaceflinger:binder call;
allow loop surfaceflinger:fd use;
allow loop graphics_device:dir search;
allow loop input_device:dir search;
allow loop uhid_device:chr_file write;
allow loop loop:tcp_socket setopt;
allow loop loop:udp_socket { create write bind read };
allow loop servicemanager:binder call;
binder_call(loop, servicemanager);

allow loop fuse:dir create_dir_perms;
allow loop fuse:file create_file_perms;
allow loop kernel:system syslog_mod;
allow loop device:dir r_dir_perms;
allow loop ramdump_device:chr_file { setattr rw_file_perms };
allow loop diag_exec:file rx_file_perms;
wakelock_use(loop)

 然后在device/qcom/sepolicy/common/file_contexts中添加

/system/bin/loop  u:object_r:loop_exec:s0

在device/qcom/sepolicy/common/property.te中添加

type loop_prop, property_type;

在device/qcom/sepolicy/common/property_contexts中添加

sys.loop		   u:object_r:loop_prop:s0

在device/qcom/sepolicy/common/service.te中添加

type custom_loop_service,app_api_service, system_server_service, service_manager_type;

在device/qcom/sepolicy/common/service_contexts中添加

loop_service				       u:object_r:mia_loop_service:s0

在device/qcom/sepolicy/common/system_app.te中添加

allow system_app loop_prop:property_service set; 

在system/sepolicy/servicemanager.te中添加

allow servicemanager loop:dir search;
allow servicemanager loop:file { open read getattr setattr ioctl };
allow servicemanager loop:process getattr;

最后编译一下ROM,刷机完成开机shell进去用命令ps -Z |grep loop就可以看到自己的service进程loop_server了~

参考:https://blog.csdn.net/qq_28899635/article/details/56289063

猜你喜欢

转载自blog.csdn.net/lancelots/article/details/82021164