做Android开发,要清楚init.rc里面的东西
init.rc 復習
看這個之前,先看看大神總結的文章
這篇文章總結的非常到位,但是因為代碼不是最新的Android版本,對我們最新的Android版本不適用。
http://gityuan.com/2016/02/05/android-init/#init rc文件拷貝
拷貝其實也就是把文件放到機器的某個位置,我們也可以使用這個命令來完成我們需要的功能。
#觸發 trigger?
在 system/core/rootdir/init.rc 中
如果我們想觸發某種 trigger,就可以這樣去做,Android也是通過這樣的機制來決定各個階段做不同的事情的。
#Android 服務啟動順序
on?early-init on?init on?late-inittrigger?post-fs??????trigger?load_system_props_actiontrigger?post-fs-data??trigger?load_persist_props_actiontrigger?firmware_mounts_completetrigger?boot???on?post-fs??????//掛載文件系統start?logdmount?rootfs?rootfs?/?ro?remountmount?rootfs?rootfs?/?shared?recmount?none?/mnt/runtime/default?/storage?slave?bind?rec...on?post-fs-data??//掛載datastart?logdstart?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:s0class?coresocket?adbd?stream?660?system?systemdisabledseclabel?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-datachown?system?system?/sys/class/android_usb/android0/f_mass_storage/lun/filechmod?0660?/sys/class/android_usb/android0/f_mass_storage/lun/filechown?system?system?/sys/class/android_usb/android0/f_rndis/ethaddrchmod?0660?/sys/class/android_usb/android0/f_rndis/ethaddrmkdir?/data/misc/adb?02750?system?shellmkdir?/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:s0class?coresocket?adbd?stream?660?system?systemdisabledseclabel?u:r:adbd:s0on?bootsetprop?sys.usb.configfs?0#?Used?to?disable?USB?when?switching?states on?property:sys.usb.config=none?&&?property:sys.usb.configfs=0stop?adbdwrite?/sys/class/android_usb/android0/enable?0write?/sys/class/android_usb/android0/bDeviceClass?0setprop?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=0write?/sys/class/android_usb/android0/enable?0write?/sys/class/android_usb/android0/idVendor?18d1write?/sys/class/android_usb/android0/idProduct?4EE7write?/sys/class/android_usb/android0/functions?${sys.usb.config}write?/sys/class/android_usb/android0/enable?1start?adbdsetprop?sys.usb.state?${sys.usb.config}#vendor 和 system/vendor Link在一起
vendor 英文解釋是供應商的意思,對我們開發而言,也就是除開google的那一套之外,都可以歸類到vendor下面去,比如我們自己客制化的hal,也可以放到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,但是程序卻沒有執行。
#增加權限后,在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語言
我的知識小密圈
總結
以上是生活随笔為你收集整理的做Android开发,要清楚init.rc里面的东西的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArcGIS的 高斯-克吕格 投影坐标系
- 下一篇: android sina oauth2.