日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

做Android开发,要清楚init.rc里面的东西

發布時間:2023/12/20 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 做Android开发,要清楚init.rc里面的东西 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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?fstrigger?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?encryptiontrigger?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_completetrigger?early-boottrigger?boot

#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下面去。

????#?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語言

我的知識小密圈

總結

以上是生活随笔為你收集整理的做Android开发,要清楚init.rc里面的东西的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。