Android init.rcカスタムサービス

3994 ワード

package/app/でloopフォルダを作成し、独自のcppファイルloopを作成します.cpp
#include 
#include 
#include 
#include 

int main()
{

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

そしてカスタマイズされたプログラム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

システム/core/rootdir/init.rcでサービスを定義する
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

デバイス/qcom/sepolicy/common/property.teに追加
type loop_prop, property_type;

デバイス/qcom/sepolicy/common/property_contextsに追加
sys.loop		   u:object_r:loop_prop:s0

デバイス/qcom/sepolicy/common/service.teに追加
type custom_loop_service,app_api_service, system_server_service, service_manager_type;

デバイス/qcom/sepolicy/common/service_contextsに追加
loop_service				       u:object_r:mia_loop_service:s0

デバイス/qcom/sepolicy/common/system_app.teに追加
allow system_app loop_prop:property_service set; 

システム/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