天天看点

Android Framework 常见解决方案(07)Android开机启动 Native daemon 解决方案

1 原理

主要 修改系统编译配置文件,rc文件,SELinux相关文件。

2 解决方案(Android O)

@1 创建工程和 rc配置文件

创建一个新的目录 frameworks/native/services/surfaceflinger/spaceXA(这里只是举例,实际上可以根据实际情况 进行调整),主要是建立一个新的工程并有自己的Android.mk文件。

在文件 frameworks/native/services/surfaceflinger/surfaceflinger.rc(这里只是举例,实际上可以根据实际情况 进行调整,不一定是这个rc文件)中做如下修改:

@@ -7,3 +7,7 @@ service surfaceflinger /system/bin/surfaceflinger
     socket pdx/system/vr/display/client     stream 0666 system graphics u:object_r:pdx_display_client_endpoint_socket:s0
     socket pdx/system/vr/display/manager    stream 0666 system graphics u:object_r:pdx_display_manager_endpoint_socket:s0
     socket pdx/system/vr/display/vsync      stream 0666 system graphics u:object_r:pdx_display_vsync_endpoint_socket:s0
+service spaceXA /system/bin/spaceXA
+    class main
+    seclabel u:r:spacem:s0
+    socket space stream 0666 system system
           

@2 系统编译配置文件

在文件 system/core/rootdir/Android.mk 中做如下修改:

@@ -89,6 +89,7 @@ SANITIZE_ASAN_OPTIONS_FOR := \
   servicemanager \
   slim_daemon \
   surfaceflinger \
+  spaceXA \
   thermal-engine \
   time_daemon \
   update_engine \
           

在文件 build/make/target/product/embedded.mk中做如下修改:

@@ -77,6 +77,7 @@ PRODUCT_PACKAGES += \
     shell_and_utilities \
     storaged \
     surfaceflinger \
+    spaceXA \
     thermalserviced \
     tombstoned \
     tzdatacheck \
           

@3 SELinux 相关配置文件修改

在文件 device/qcom/sepolicy/private/file_contexts中做如下修改:

@@ -51,6 +51,7 @@
 /system/bin/wfdservice                          u:object_r:wfdservice_exec:s0
 /system/bin/mmi                                 u:object_r:mmi_sys_exec:s0
 /system/bin/mmi_diag                            u:object_r:mmi_sys_exec:s0
+/system/bin/spaceXA                         u:object_r:spaceXA_exec:s0
 
 ####### data files ################
 /data/misc/seemp(/.*)?                          u:object_r:seemp_data_file:s0
           

在文件 device/qcom/sepolicy/private/spaceXA.te中做如下修改:

+type spaceXA, domain;
+type spaceXA_exec, exec_type, file_type;
+allow spaceXA self:udp_socket { connect getattr read recvfrom sendto write };