init.rc 復習
看這個之前,先看看大神總結的文章
這篇文章總結的非常到位,但是因為代碼不是最新的Android版本,對我們最新的Android版本不適用,
http://gityuan.com/2016/02/05/android-init/
#init rc檔案拷貝
拷貝其實也就是把檔案放到機器的某個位置,我們也可以使用這個命令來完成我們需要的功能,
PRODUCT_COPY_FILES += $(LOCAL_PATH)/factory_init.project.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/factory_init.project.rc
PRODUCT_COPY_FILES += $(LOCAL_PATH)/init.project.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.project.rc
PRODUCT_COPY_FILES += $(LOCAL_PATH)/meta_init.project.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/meta_init.project.rc
PRODUCT_COPY_FILES += $(LOCAL_PATH)/init.recovery.mt8167.rc:root/init.recovery.mt8167.rc
#觸發 trigger
在 system/core/rootdir/init.rc 中
如果我們想觸發某種 trigger,就可以這樣去做,Android也是通過這樣的機制來決定各個階段做不同的事情的,
# Mount filesystems and start core system services.
on late-init
/*觸發更早的檔案系統*/
trigger early-fs
# Mount fstab in init.{$device}.rc by mount_all command. Optional parameter
# '--early' can be specified to skip entries with 'latemount'.
# /system and /vendor must be mounted by the end of the fs stage,
# while /data is optional.
/*vendor 需要在fs 掛載之后才能掛載*/
trigger fs
trigger post-fs
# Mount fstab in init.{$device}.rc by mount_all with '--late' parameter
# to only mount entries with 'latemount'. This is needed if '--early' is
# specified in the previous mount_all command on the fs stage.
# With /system mounted and properties form /system + /factory available,
# some services can be started.
trigger late-fs
# Now we can mount /data. File encryption requires keymaster to decrypt
# /data, which in turn can only be loaded when system properties are present.
trigger post-fs-data
# Now we can start zygote for devices with file based encryption
trigger zygote-start
# Load persist properties and override properties (if enabled) from /data.
trigger load_persist_props_action
# Remove a file to wake up anything waiting for firmware.
trigger firmware_mounts_complete
trigger early-boot
trigger boot
#Android 服務啟動順序
on early-init
on init
on late-init
trigger post-fs
trigger load_system_props_action
trigger post-fs-data
trigger load_persist_props_action
trigger firmware_mounts_complete
trigger boot
on post-fs //掛載檔案系統
start logd
mount rootfs rootfs / ro remount
mount rootfs rootfs / shared rec
mount none /mnt/runtime/default /storage slave bind rec
...
on post-fs-data //掛載data
start logd
start vold //啟動vold
//android 9.0 中變成了 在main.c代碼中去觸發
ATRACE_BEGIN("VoldNativeService::start");
if (android::vold::VoldNativeService::start() != android::OK) {
LOG(ERROR) << "Unable to start VoldNativeService";
exit(1);
}
ATRACE_END();
on boot //啟動核心服務
...
class_start core //啟動core class
#決議init.*.rc檔案的代碼位置
system/core/init/
- init.cpp
/*可以從system/core里面去看代碼,找到你想要的東西*/
#查看服務的狀態
getprop | grep init.svc
/*服務指的是用service指定的服務*//*比如*/
# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /system/bin/adbd --root_seclabel=u:r:su:s0
class core
socket adbd stream 660 system system
disabled
seclabel u:r:adbd:s0
在機器中執行結果如下
Android 9.0:/ # getprop |grep init.svc
[init.svc.XoSetCap]: [stopped]
[init.svc.adbd]: [running]
[init.svc.aee-reinit]: [stopped]
[init.svc.aee_aed]: [running]
[init.svc.aee_aedv]: [running]
[init.svc.atcid-daemon-u]: [stopped]
[init.svc.audio-daemon]: [stopped]
[init.svc.audioserver]: [running]
[init.svc.batterywarning]: [running]
[init.svc.bluetooth-1-0]: [running]
[init.svc.bluetoothd]: [stopped]
[init.svc.bootanim]: [stopped]
[init.svc.bootlogoupdater]: [stopped]
[init.svc.bugreport]: [stopped]
[init.svc.camerahalserver]: [running]
[init.svc.cameraserver]: [running]
[init.svc.clear-bcb]: [stopped]
[init.svc.console]: [running]
[init.svc.drm]: [running]
[init.svc.dumpstate]: [stopped]
[init.svc.dumpstatez]: [stopped]
[init.svc.flash_recovery]: [stopped]
[init.svc.fuse_usbotg]: [stopped]
[init.svc.gatekeeperd]: [running]
[init.svc.ged_srv]: [running]
[init.svc.hdmi]: [stopped]
查看adbd 的服務狀態
Android 9.0:/ # getprop |grep adb
[init.svc.adbd]: [running]
[persist.sys.usb.config]: [adb]
[ro.adb.secure]: [1]
[ro.boottime.adbd]: [6366465736]
[service.adb.root]: [1]
[sys.usb.config]: [adb]
[sys.usb.state]: [adb]
Knowin inSight10:/ #
adbd 服務定義在 init.usb.rc里面
adbd的服務啟動和usb強相關,服務的啟動和停止總是和usb關連在一起,
# Copyright (C) 2012 The Android Open Source Project
#
# USB configuration common for all android devices
#
on post-fs-data
chown system system /sys/class/android_usb/android0/f_mass_storage/lun/file
chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/file
chown system system /sys/class/android_usb/android0/f_rndis/ethaddr
chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr
mkdir /data/misc/adb 02750 system shell
mkdir /data/adb 0700 root root
# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /system/bin/adbd --root_seclabel=u:r:su:s0
class core
socket adbd stream 660 system system
disabled
seclabel u:r:adbd:s0
on boot
setprop sys.usb.configfs 0
# Used to disable USB when switching states
on property:sys.usb.config=none && property:sys.usb.configfs=0
stop adbd
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/bDeviceClass 0
setprop sys.usb.state ${sys.usb.config}
# adb only USB configuration
# This is the fallback configuration if the
# USB manager fails to set a standard configuration
on property:sys.usb.config=adb && property:sys.usb.configfs=0
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 18d1
write /sys/class/android_usb/android0/idProduct 4EE7
write /sys/class/android_usb/android0/functions ${sys.usb.config}
write /sys/class/android_usb/android0/enable 1
start adbd
setprop sys.usb.state ${sys.usb.config}
#vendor 和 system/vendor Link在一起
vendor 英文解釋是供應商的意思,對我們開發而言,也就是除開google的那一套之外,都可以歸類到vendor下面去,比如我們自己客制化的hal,也可以放到vendor下面去,
# Link /vendor to /system/vendor for devices without a vendor partition.
symlink /system/vendor /vendor
在設備上查看
Closed connection on port 1.
android 9.0:/ # ls /system/vendor/
app bin build.prop cache data default.prop etc firmware lib lost+found nvdata odm overlay persist protect_f protect_s res ueventd.rc va
android 9.0:/ # ls /vendor/
app bin build.prop cache data default.prop etc firmware lib lost+found nvdata odm overlay persist protect_f protect_s res ueventd.rc va
# class 對應的屬性 core 、main、late_start
class 是類別的意思,一共有三種類別,
core
ueventd、logd、healthd、adbd(disabled)、lmkd(LowMemoryKiller)、servicemanager、vold、debuggerd、surfaceflinger、bootanim(disabled)等
core分類中的服務都是一些核心服務,它們不啟動,后續的服務或系統啟動就可能出問題,比如servicemanager,binder通信大管家,它的啟動很靠前,因為,其他服務啟動時候需要向servicemanager注冊binder服務,vold,負責存盤類設備的掛載;還有surfaceflinger,圖形顯示的核心服務等,
main
debuggerd64、drm、media、ril-daemon、installd、flash_recovery、racoon(disabled)、mtpd(disabled)、keystore、dumpstate(disabled)、mdnsd(disabled)、pre-recovery(disabled)、cmd_services(disabled)、phasecheckserver、zygote等,
main分類中的服務是一些系統的基本服務,有了這些服務android系統、Java世界才能正常運行,
late_start
字面意思是晚些啟動,/device/中一些硬體廠商的.rc檔案中會將一些服務設定為該類,
#Android 增加一個property
我們有時候需要增加一個property 在init.rc 里面做判斷,用來判斷某個服務是否已經啟動,
這個property 也會在設備啟動后的build.prop中顯示出來,
weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$ git diff build/make/tools/buildinfo.sh
diff --git a/build/make/tools/buildinfo.sh b/build/make/tools/buildinfo.sh
index 6400b1b402..cdc973275c 100755
--- a/build/make/tools/buildinfo.sh
+++ b/build/make/tools/buildinfo.sh
@@ -75,3 +75,4 @@ echo "system_init.startsensorservice=1"
echo "ro.knowin.version.firmware=$BUILD_FIRMWARE_VERSION"
echo "nfc.debug_enabled=0"
echo "nfc.nxp_log_level_nci=0"
+echo "sys.zigbee.enable=0"
weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$
#Android 磁區fstab
這部分和init.rc關系不大,但是磁區的掛載都是在init.rc里面去觸發的,所以需要關注,
device\mediateksample\xxx\recovery_emmc.fstab
recovery_emmc.fatab
檔案內容
boot /boot emmc defaults defaults
/dev/block/mmcblk0p2 /cache ext4 defaults defaults
/dev/block/mmcblk0p3 /data ext4 defaults defaults
misc /misc emmc defaults defaults
recovery /recovery emmc defaults defaults
/dev/block/mmcblk0p4 /sdcard vfat defaults defaults
/dev/block/mmcblk0p6 /system ext4 defaults defaults
#給增加的property增加權限
不要以為增加了property就可以使用權限了,還需要給增加的property在某個位置修改一下,
這一步至關重要,要不然我們會發現觸發了property,但是程式卻沒有執行,
weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$ git diff system/core/init/stable_properties.h
diff --git a/system/core/init/stable_properties.h b/system/core/init/stable_properties.h
old mode 100644
new mode 100755
index 4972d101f1..262039c57b
--- a/system/core/init/stable_properties.h
+++ b/system/core/init/stable_properties.h
@@ -58,6 +58,7 @@ static const std::set<std::string> kExportedActionableProperties = {
"vold.post_fs_data_done",
"vts.native_server.on",
"wlan.driver.status",
+ "sys.zigbee.enable",
};
} // namespace init
weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$
#增加權限后,在init.rc 判斷才能觸發?
+on property:sys.zigbee.enable=1
+ chmod 0666 /dev/ttyMT0
+ chmod 0666 /dev/ttyMT1
+ chmod 0666 /dev/ttyMT2
#在init.rc 里面加上列印日志
write /dev/kmsg "[UART0]=== weiqifa === start post-fs-data"
然后在dmesg 里面可以看到列印的資訊
#常見的問題
列出的問題是我們專案中遇到的,如果大家有遇到,可以按照我們的修改方式進行修改,
我們在專案中給adb加了key值在data磁區下,在使用的程序中,會發現data目錄下的key被篡改,通過修改,把檔案放在vendor下后正常,
被篡改的原因可能因為權限問題,也可以嘗試在放檔案的時候,修改檔案權限只對adbd服務可讀訪問,
還有一個問題是我們的應用,需要使用的一些資源,放在data下,也遇到被篡改,
修改的方法與上面的類似,我們把檔案放在vendor下,然后每次開機的時候,再拷貝到data目錄下,確保每次開機檔案都存在,
當然,也可以讓app直接訪問vendor下的檔案,
我最這部分的理清主要為了解決我們專案中有一個服務啟動速度慢,原來依賴的是data磁區,我把代碼修改為依賴sdcard磁區,在sdcard磁區掛載完成后,觸發我們服務的啟動,以達到服務開機快速啟動的效果,
推薦閱讀:
專輯|Linux文章匯總
專輯|程式人生
專輯|C語言
我的知識小密圈
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/232557.html
標籤:java
下一篇:史上最全Java7日期時間工具類
