做Android开发,要清楚init.rc里面的东西
init.rc 復(fù)習(xí)
看這個(gè)之前,先看看大神總結(jié)的文章
這篇文章總結(jié)的非常到位,但是因?yàn)榇a不是最新的Android版本,對(duì)我們最新的Android版本不適用。
http://gityuan.com/2016/02/05/android-init/#init rc文件拷貝
拷貝其實(shí)也就是把文件放到機(jī)器的某個(gè)位置,我們也可以使用這個(gè)命令來(lái)完成我們需要的功能。
#觸發(fā) trigger?
在 system/core/rootdir/init.rc 中
如果我們想觸發(fā)某種 trigger,就可以這樣去做,Android也是通過(guò)這樣的機(jī)制來(lái)決定各個(gè)階段做不同的事情的。
#Android 服務(wù)啟動(dòng)順序
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??????//掛載文件系統(tǒng)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???//啟動(dòng)vold//android?9.0?中變成了?在main.c代碼中去觸發(fā)?ATRACE_BEGIN("VoldNativeService::start");if?(android::vold::VoldNativeService::start()?!=?android::OK)?{LOG(ERROR)?<<?"Unable?to?start?VoldNativeService";exit(1);}ATRACE_END();on?boot??????//啟動(dòng)核心服務(wù)...class_start?core?//啟動(dòng)core?class#解析init.*.rc文件的代碼位置
system/core/init/-?init.cpp /*可以從system/core里面去看代碼,找到你想要的東西*/#查看服務(wù)的狀態(tài)
getprop?|?grep?init.svc /*服務(wù)指的是用service指定的服務(wù)*//*比如*/ #?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在機(jī)器中執(zhí)行結(jié)果如下
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 的服務(wù)狀態(tài)
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 服務(wù)定義在 init.usb.rc里面
adbd的服務(wù)啟動(dòng)和usb強(qiáng)相關(guān),服務(wù)的啟動(dòng)和停止總是和usb關(guān)連在一起。
#?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 英文解釋是供應(yīng)商的意思,對(duì)我們開(kāi)發(fā)而言,也就是除開(kāi)google的那一套之外,都可以歸類到vendor下面去,比如我們自己客制化的hal,也可以放到vendor下面去。
在設(shè)備上查看
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 對(duì)應(yīng)的屬性 core 、main、late_start
class 是類別的意思,一共有三種類別。
core
ueventd、logd、healthd、adbd(disabled)、lmkd(LowMemoryKiller)、servicemanager、vold、debuggerd、surfaceflinger、bootanim(disabled)等
core分類中的服務(wù)都是一些核心服務(wù),它們不啟動(dòng),后續(xù)的服務(wù)或系統(tǒng)啟動(dòng)就可能出問(wèn)題。比如servicemanager,binder通信大管家,它的啟動(dòng)很靠前,因?yàn)?#xff0c;其他服務(wù)啟動(dòng)時(shí)候需要向servicemanager注冊(cè)binder服務(wù)。vold,負(fù)責(zé)存儲(chǔ)類設(shè)備的掛載;還有surfaceflinger,圖形顯示的核心服務(wù)等。
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分類中的服務(wù)是一些系統(tǒng)的基本服務(wù),有了這些服務(wù)android系統(tǒng)、Java世界才能正常運(yùn)行。
late_start
字面意思是晚些啟動(dòng)。/device/中一些硬件廠商的.rc文件中會(huì)將一些服務(wù)設(shè)置為該類。
#Android 增加一個(gè)property
我們有時(shí)候需要增加一個(gè)property 在init.rc 里面做判斷,用來(lái)判斷某個(gè)服務(wù)是否已經(jīng)啟動(dòng)。
這個(gè)property 也會(huì)在設(shè)備啟動(dòng)后的build.prop中顯示出來(lái)。
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 分區(qū)fstab
這部分和init.rc關(guān)系不大,但是分區(qū)的掛載都是在init.rc里面去觸發(fā)的,所以需要關(guān)注。
device\mediateksample\xxx\recovery_emmc.fstab recovery_emmc.fatab文件內(nèi)容
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增加權(quán)限
不要以為增加了property就可以使用權(quán)限了,還需要給增加的property在某個(gè)位置修改一下。
這一步至關(guān)重要,要不然我們會(huì)發(fā)現(xiàn)觸發(fā)了property,但是程序卻沒(méi)有執(zhí)行。
#增加權(quán)限后,在init.rc 判斷才能觸發(fā)?
+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 里面可以看到打印的信息
#常見(jiàn)的問(wèn)題
列出的問(wèn)題是我們項(xiàng)目中遇到的,如果大家有遇到,可以按照我們的修改方式進(jìn)行修改。
我們?cè)陧?xiàng)目中給adb加了key值在data分區(qū)下,在使用的過(guò)程中,會(huì)發(fā)現(xiàn)data目錄下的key被篡改,通過(guò)修改,把文件放在vendor下后正常。
被篡改的原因可能因?yàn)闄?quán)限問(wèn)題,也可以嘗試在放文件的時(shí)候,修改文件權(quán)限只對(duì)adbd服務(wù)可讀訪問(wèn)。
還有一個(gè)問(wèn)題是我們的應(yīng)用,需要使用的一些資源,放在data下,也遇到被篡改。
修改的方法與上面的類似,我們把文件放在vendor下,然后每次開(kāi)機(jī)的時(shí)候,再拷貝到data目錄下,確保每次開(kāi)機(jī)文件都存在。
當(dāng)然,也可以讓app直接訪問(wèn)vendor下的文件。
我最這部分的理清主要為了解決我們項(xiàng)目中有一個(gè)服務(wù)啟動(dòng)速度慢,原來(lái)依賴的是data分區(qū),我把代碼修改為依賴sdcard分區(qū),在sdcard分區(qū)掛載完成后,觸發(fā)我們服務(wù)的啟動(dòng),以達(dá)到服務(wù)開(kāi)機(jī)快速啟動(dòng)的效果。
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語(yǔ)言
我的知識(shí)小密圈
總結(jié)
以上是生活随笔為你收集整理的做Android开发,要清楚init.rc里面的东西的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ArcGIS的 高斯-克吕格 投影坐标系
- 下一篇: json-server安装报错问题