引言:需求如下,有一個二進制Service服務,比如叫CarplaySevice,他的具體作用就是一個後臺Service,但是需要在系統開機之後被調用起來。
因爲.rc文件的特性,所以我們就採用rc文件來啓動,其實本來就是用rc文件來啓動CarplayService 的,只不過之前是手動啓動,用戶是肯定不能自己去輸入命令的,所以就需要自動綁定並啓動該Service
以下總結了2種方法:
方法1:是最規範,最簡單,最實用的,其實還是規範佔多一點。
方法2:完全是自己瞎試出來的,具體怎麼試出來的有分析。
方法一:
在Android.mk中增加代碼 ,這也是最常用,最常規,最符合標準的方式
主要就是用到了LOCAL_INIT_RC ,先普及下他的用法:
提供一個編譯宏LOCAL_INIT_RC用於將服務相關的RC文件編譯到相應位置。這能確保服務定義和服務的可執行文件同時存在,避免了之前出現的服務對應的可執行程序不存在的問題。 會編譯到/system/etc/init目錄中
看!這不就是我的需求嗎,只不過初學者不能完美的表達出自己的需求,所以不管在搜索問題以及請教別人的時候都很難讓別人明白自己的想法,這就是經驗的教訓了。
## prebuild CarPlayService binary to /system/bin/
include $(CLEAR_VARS)
LOCAL_MODULE := CarPlayService
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := bin/CarPlayService
LOCAL_INIT_RC := etc/init.qcom.carplay.rc
LOCAL_MODULE_PATH :=$(PRODUCT_OUT)/system/bin/
include $(BUILD_PREBUILT)
以上就是rc和服務的綁定,實測有效。
方法二:
通過查看init.rc開機啓動的log,可以看到很多.rc被調度,並被解析。
可以在LINUX/android/device/qcom/common/rootdir/etc/init.qcom.rc 源碼中增加
import /vendor/etc/init/hw/init.qcom.carplay.rc
這個方法沒有什麼官方指導,只是我個人看開機log ,看到之後測試的出來的
後來在看別個的博客的時候也印證了我這個想法,如下:
import —— import類型的section代表將引入另外一個.rc文件;
ps:
import /init.environ.rc
import /init.usb.rc相當包含另外一些section, 在解析完init.rc文件後繼續會調用init_parse_config_file來解析引入的.rc文件
以下是親測的log 信息:
[ 18.570654] selinux: SELinux: Loaded file_contexts
[ 18.570654]
~~~~~~~~~~~~~~~~~~~~~~從這裏開始看~~~~~~~~~~~~~~~~~~~~~~~~~
[ 18.586558] init: init second stage started!
[ 18.635706] init: Using Android DT directory /proc/device-tree/firmware/android/
[ 18.651854] selinux: SELinux: Loaded file_contexts
[ 18.651854]
[ 18.660411] selinux: SELinux: Loaded property_contexts from /system/etc/selinux/plat_property_contexts & /vendor/etc/selinux/nonplat_property_contexts.
[ 18.660411]
[ 18.679930] init: Running restorecon...
[ 18.700670] init: waitid failed: No child processes
[ 18.707374] init: Couldn't load property file: Unable to open '/odm/default.prop': No such file or directory: No such file or directory
[ 18.724380] init: Created socket '/dev/socket/property_service', mode 666, user 0, group 0
[ 18.734395] init: Parsing file /init.rc...
[ 18.739388] init: Added '/init.environ.rc' to import list
[ 18.745726] init: Added '/init.usb.rc' to import list
[ 18.751637] init: Added '/init.qcom.rc' to import list
[ 18.758938] init: Added '/vendor/etc/init/hw/init.qcom.rc' to import list
[ 18.767699] init: Added '/init.usb.configfs.rc' to import list
[ 18.773637] init: Added '/init.zygote64_32.rc' to import list
[ 18.781912] init: Parsing file /init.environ.rc...
[ 18.787518] init: Parsing file /init.usb.rc...
~~~~~~~~~~~這裏就解析到了我們要的init.qcon.rc文件 【start】~~~~~~~~~~~~
[ 18.791670] init: Parsing file /init.qcom.rc...
[ 18.797473] init: Unable to open '/init.qcom.rc': No such file or directory
[ 18.805362] init: /init.rc: 9: Could not import file '/init.qcom.rc': No such file or directory
[ 18.817555] init: Parsing file /vendor/etc/init/hw/init.qcom.rc...
[ 18.826207] init: Added '/vendor/etc/init/hw/init.qcom.usb.rc' to import list
[ 18.835682] init: Added '/vendor/etc/init/hw/init.msm.usb.configfs.rc' to import list
[ 18.844833] init: Added '/vendor/etc/init/hw/init.target.rc' to import list
[ 18.853519] init: Added '/vendor/etc/init/hw/init.qcom.factory.rc' to import list
[ 18.859591] init: Added '/vendor/etc/init/hw/init.qcom.test.rc' to import list
[ 18.870212] init: /vendor/etc/init/hw/init.qcom.rc: 606: user requires 1 argument
[ 18.880858] init: Parsing file /vendor/etc/init/hw/init.qcom.usb.rc...
[ 18.894348] init: Parsing file /vendor/etc/init/hw/init.msm.usb.configfs.rc...
[ 18.907381] init: Parsing file /vendor/etc/init/hw/init.target.rc...
[ 18.917106] init: Parsing file /vendor/etc/init/hw/init.qcom.factory.rc...
[ 18.924985] init: Parsing file /vendor/etc/init/hw/init.qcom.test.rc...
~~~~~~~~~~~到這裏爲止是 init.qcom.rc其他所有的子rc【end】~~~~~~~~~~~~
[ 18.934712] init: Parsing file /init.usb.configfs.rc...
[ 18.941714] init: Parsing file /init.zygote64_32.rc...
[ 18.948110] init: Parsing directory /system/etc/init...
[ 18.954385] init: Parsing file /system/etc/init/IpcpService.rc...
[ 18.963481] init: Parsing file /system/etc/init/android.automotive.evs.manager@1.0.rc...
[ 18.974296] init: Parsing file /system/etc/init/android.hardware.wifi@1.0-service.mrvl.rc...
[ 18.985309] init: Parsing file /system/etc/init/android.hidl.allocator@1.0-service.rc...
[ 18.995986] init: Parsing file /system/etc/init/atrace.rc...
[ 19.004475] init: Parsing file /system/etc/init/atrace_userdebug.rc...
[ 19.013192] init: Parsing file /system/etc/init/audioserver.rc...
[ 19.020414] init: Parsing file /system/etc/init/bootanim.rc...
[ 19.028974] init: Parsing file /system/etc/init/bootstat.rc...
[ 19.035395] init: Parsing file /system/etc/init/calibrate.rc...
[ 19.043706] init: Parsing file /system/etc/init/cameraserver.rc...
[ 19.050124] init: Parsing file /system/etc/init/devicemanager.rc...
[ 19.057368] init: Parsing file /system/etc/init/drmserver.rc...
[ 19.065208] init: Parsing file /system/etc/init/dumpstate.rc...
[ 19.073456] init: Parsing file /system/etc/init/ethernetservice_pma.rc...
請查看以上註釋特別標註過的地方!!!!!
當在init.qcom.rc中增加 如下代碼之後:
import /vendor/etc/init/hw/init.qcom.usb.rc
import /vendor/etc/init/hw/init.msm.usb.configfs.rc
import /vendor/etc/init/hw/init.target.rc
import /vendor/etc/init/hw/init.qcom.factory.rc
import /vendor/etc/init/hw/init.qcom.test.rc
import /vendor/etc/init/hw/init.qcom.carplay.rc
以下是已經填了:
import /vendor/etc/init/hw/init.qcom.carplay.rc 代碼之後的開機log:
[ 18.765975] init: Running restorecon...
[ 18.785083] init: waitid failed: No child processes
[ 18.792444] init: Couldn't load property file: Unable to open '/odm/default.prop': No such file or directory: No such file or directory
[ 18.810741] init: Created socket '/dev/socket/property_service', mode 666, user 0, group 0
[ 18.820852] init: Parsing file /init.rc...
[ 18.825952] init: Added '/init.environ.rc' to import list
[ 18.830313] init: Added '/init.usb.rc' to import list
[ 18.835611] init: Added '/init.qcom.rc' to import list
[ 18.841780] init: Added '/vendor/etc/init/hw/init.qcom.rc' to import list
[ 18.848063] init: Added '/init.usb.configfs.rc' to import list
[ 18.854420] init: Added '/init.zygote64_32.rc' to import list
[ 18.862470] init: Parsing file /init.environ.rc...
[ 18.868072] init: Parsing file /init.usb.rc...
[ 18.873986] init: Parsing file /init.qcom.rc...
[ 18.878184] init: Unable to open '/init.qcom.rc': No such file or directory
[ 18.887216] init: /init.rc: 9: Could not import file '/init.qcom.rc': No such file or directory
[ 18.900554] init: Parsing file /vendor/etc/init/hw/init.qcom.rc...
[ 18.910406] init: Added '/vendor/etc/init/hw/init.qcom.usb.rc' to import list
[ 18.918460] init: Added '/vendor/etc/init/hw/init.msm.usb.configfs.rc' to import list
[ 18.928481] init: Added '/vendor/etc/init/hw/init.target.rc' to import list
[ 18.935958] init: Added '/vendor/etc/init/hw/init.qcom.factory.rc' to import list
[ 18.944559] init: Added '/vendor/etc/init/hw/init.qcom.test.rc' to import list
[ 18.953267] init: Added '/vendor/etc/init/hw/init.qcom.carplay.rc' to import list
[ 18.963454] init: /vendor/etc/init/hw/init.qcom.rc: 607: user requires 1 argument
[ 18.974337] init: Parsing file /vendor/etc/init/hw/init.qcom.usb.rc...
[ 18.989513] init: Parsing file /vendor/etc/init/hw/init.msm.usb.configfs.rc...
[ 19.002269] init: Parsing file /vendor/etc/init/hw/init.target.rc...
[ 19.010618] init: Parsing file /vendor/etc/init/hw/init.qcom.factory.rc...
[ 19.018290] init: Parsing file /vendor/etc/init/hw/init.qcom.test.rc...
~~~~~~~~~~~~~~~~~~~~~~~~~~~主要看這裏~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[ 19.028566] init: Parsing file /vendor/etc/init/hw/init.qcom.carplay.rc...
[ 19.037452] init: Parsing file /init.usb.configfs.rc...
[ 19.043463] init: Parsing file /init.zygote64_32.rc...
[ 19.049499] init: Parsing directory /system/etc/init...
[ 19.055042] init: Parsing file /system/etc/init/IpcpService.rc...
便可以在開機啓動log中看到init.qcom.carplay.rc在init.中被調度
這種寫法其實不用參考的,只不過可以讓我們瞭解下 ,擴展下。