配套系列教學視訊連結:
安卓系列教程之ROM系統開發-百問100ask
說明
系統:Android10.0
裝置: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
上一節我們介紹了屬性的架構, 本節中重點介紹一下,Android系統中常見的一些屬性。
一, 常見property屬性
通過getprop指令可以擷取系統中大部分的屬性,為啥說是大部分, 因為還有一些因為selinux權限原因, 不一定擷取到到, 對于老版本Android系統, 是可以全部擷取的:
我們把以下常見屬性進行歸類:
init.svc.xxx | 通過啟動腳本啟動的背景Native服務, 都會自動設定該屬性,用于記錄服務的啟動狀态 [init.svc.adbd]: [running] [init.svc.akmd]: [stopped] [init.svc.apexd]: [running] [init.svc.apexd-bootstrap]: [stopped] [init.svc.ashmemd]: [running] [init.svc.audioserver]: [running] [init.svc.bootanim]: [stopped] [init.svc.bpfloader]: [stopped] [init.svc.cameraserver]: [running] |
dalvik.vm.xxx pm.dexopt.xxx | Android ART或Dalvik虛拟機運作相關屬性,很多屬性都是在mk中定義, 以下屬性就是針對ART編譯和運作時的參數,包括影響JIT編譯選項, dex優化, pm安裝器安裝參數等, 詳細可參考: https://source.android.com/devices/tech/dalvik/configure?hl=zh-cn [dalvik.vm.heapgrowthlimit]: [192m]:設定一個标準的應用的最大堆記憶體大小 [dalvik.vm.heapmaxfree]: [8m]:設定單次堆記憶體調整的最大值 [dalvik.vm.heapminfree]: [512k]:設定單次堆記憶體調整的最小值 [dalvik.vm.heapsize]: [512m]:程序可用的堆記憶體最大值 [dalvik.vm.heapstartsize]: [16m]: 系統配置設定給應用冷啟動的初始堆大小 [dalvik.vm.heaptargetutilization]: [0.75]:設定目前理想的堆記憶體使用率。值位于0與1之間 [dalvik.vm.isa.arm.features]: [default] [dalvik.vm.isa.arm.variant]: [cortex-a15] [dalvik.vm.isa.arm64.features]: [default] [dalvik.vm.isa.arm64.variant]: [cortex-a53] [dalvik.vm.usejit]: [true] 是否啟用 JIT [dalvik.vm.usejitprofiles]: [true] [dalvik.vm.lockprof.threshold]: [500] [pm.dexopt.ab-ota]: [speed-profile] [pm.dexopt.bg-dexopt]: [speed-profile] [pm.dexopt.boot]: [verify] 無線下載下傳更新後使用的編譯過濾器 [pm.dexopt.first-boot]: [quicken]首次啟動程式模式 pm.dexopt.bg-dexopt]: [speed] 背景優化模式 [pm.dexopt.boot]: [verify] 無線下載下傳更新後的啟動模式 [pm.dexopt.install]: [speed-profile] 應用安裝模式 |
xxx_completed | 用于記錄系統是否完成啟動,或者某些服務是否完成啟動。比較重要的一個就是sys.boot_completed,表示Android系統是否完成啟動。 [dev.bootcomplete]: [1] [devicetest.bootcomplete]: [true] [sys.boot_completed]: [1] [sys.logbootcomplete]: [1] |
sys.xxx.xxx | 如sys.usb.config,sys.boot.reason sys.powerctl |
ro.kernel.xx | 由核心通過啟動參數傳遞過來的參數(androidboot開頭的字元串, 如果是qemu啟動, 就會設定ro.kernel..xxx): [ro.kernel.androidboot.hardware]: [ranchu] [ro.kernel.init]: [/init] [ro.kernel.lcd.height]: [1600] [ro.kernel.lcd.width]: [720] |
ro.boot.xx | [ro.boot.bootreason]: [reboot] [ro.boot.hardware]: [ranchu] [ro.boot.selinux]: [permissive] [ro.boot.serialno]: [716817aa-6cd5-45bc-a3e3-f97ab3fc9a04] Init啟動會額外設定幾個屬性: { "ro.boot.serialno", "ro.serialno", "", }, { "ro.boot.mode", "ro.bootmode", "unknown", }, { "ro.boot.baseband", "ro.baseband", "unknown", }, { "ro.boot.bootloader", "ro.bootloader", "unknown", }, { "ro.boot.hardware", "ro.hardware", "unknown", }, { "ro.boot.revision", "ro.revision", "0", }, |
ro.build.xxx | 記錄編譯鏡像的情況的屬性, 如:編譯時間,系統版本, sdk api,系統更新檔時間。 [ro.build.date]: [Tue Dec 14 17:21:12 CST 2021] [ro.build.date.utc]: [1639473672] [ro.build.descriptioun]: [qh100_rk3399-userdebug 10 QD:4A.200805.003 eng.ctgcdt.20211214.172125 release-keys] [ro.build.display.id]: [qh100_rk3399-userdebug 1b0 QD4A.200805.003 eng.ctgcdt.2021j1214.172125 release-keys] [ro.build.fingerprint]: [rockchip/qh100e_rk3399/qh100_rk3399:10/QD4A.200805.003/eng.ctgcdt.20211214.172125:userdebug/release-keys] [ro.build.version.release]: [10] [ro.build.version.sdk]: [29] [ro.build.version.security_patch]: [2020-11-05] |
ro.boottime.xx | 記錄各種伺服器啟動時間,這個時間是從某個時間基準開始累計的時間值,ns為機關, [ro.boottime.init]: [1353] init 的第一階段開始的時間 [ro.boottime.init.cold_boot_wait]: [273] :init 等待 ueventd 的冷啟動階段結束的時間 [ro.boottime.init.selinux]: [171] 第一階段初始化 SELinux 花了多長時間 [ro.boottime.<服務名稱>]:以 ns 為機關啟動後的時間,該服務首次啟動的時間,如 [ro.boottime.installd]: [4523622043] |
ro.product.xxx | 在編譯源碼時,會選擇産品, 這些屬性就是用來記錄目前源碼選擇産品所對應的資訊,其實我們在配置一個新産品時, 産品mk檔案的内容就會在屬性中展示。 [ro.product.build.tags]: [release-keys] [ro.product.build.type]: [userdebug] [ro.product.build.version.incremental]: [eng.ctgcdt.20211214.172125] [ro.product.build.version.release]: [10] [ro.product.build.version.sdk]: [29] [ro.product.cpu.abi]: [arm64-v8a] [ro.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi] [ro.product.cpu.abilist32]: [armeabi-v7a,armeabi] [ro.product.cpu.abilist64]: [arm64-v8a] [ro.product.device]: [qh100_rk3399] [ro.product.first_api_level]: [29] [ro.product.fwtype]: [1] [ro.product.locale]: [en-US] [ro.product.manufacturer]: [rockchip] [ro.product.model]: [qh100] [ro.product.name]: [qh100_rk3399] |
ro.vendor.xxx | 廠商相關屬性, 更多的是針對soc硬體廠商,以下屬性和ro.product.xx很想 [ro.vendor.build.date]: [Tue Dec 14 17:21:12 CST 2021] [ro.vendor.build.date.utc]: [1639473672] [ro.vendor.build.fingerprint]: [rockchip/qh100_rk3399:10/QD4A.200805.003/ctgcdt12141721:userdebug/release-keys] [ro.vendor.build.id]: [QD4A.200805.003] [ro.vendor.build.security_patch]: [2020-11-05] [ro.vendor.build.tags]: [release-keys] [ro.vendor.build.type]: [userdebug] [ro.vendor.build.version.incremental]: [eng.ctgcdt.20211214.172125] [ro.vendor.build.version.release]: [10] [ro.vendor.build.version.sdk]: [29] [ro.vendor.ethernet_settings]: [true] [ro.vendor.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi] [ro.vendor.product.cpu.abilist32]: [armeabi-v7a,armeabi] [ro.vendor.product.cpu.abilist64]: [arm64-v8a] [ro.vendor.udisk.visible]: [true] |
persist.xxx | 可持久化的屬性,這些屬性被初始化之後,會被寫入到檔案進行持久化存儲 [persist.sys.boot.check]: [false] [persist.sys.boot.reason]: [] [persist.sys.first_booting]: [false] [persist.sys.framebuffer.main]: [1920x1080] [persist.vendor.camera.debug.logfile]: [0] [persist.vendor.resolution.main]: [Auto] [persist.vendor.sys.hdmiui]: [2] [persist.vendor.sys.hid]: [] [persist.vendor.uvcservice]: [0] [ro.persistent_properties.ready]: [true] |
各種程序或者使用者自定義設定的屬性 | 如: setprop my.first.name qihao |
ctrl.start ctrl.stop ctl.restart | 這幾個屬性是用于控制啟動和關閉,重新開機服務的, 但是需要selinux權限(會去看是否有通路以下客體的權限) u:object_r:ctl_restart_prop:s0 u:object_r:ctl_rildaemon_prop:s0 u:object_r:ctl_sigstop_prop:s0 u:object_r:ctl_start_prop:s0 u:object_r:ctl_stop_prop:s0 |
logd相關屬性 | persist.logd.size 所有日志緩存區大小的預設大小,預設為256K隻能編譯版本的時候修改。 persist.logd.size.main main日志緩沖區大小,預設為256K persist.logd.size.system system日志緩沖區大小,預設為256K setprop ro.logd.kernel true控制核心日志輸出到logd的buffer中,通過lgocat抓取 setprop ro.logd.auditd true控制selinux日志輸出到logd的buffer中,通過lgocat抓取 |
二, 屬性命名的合法性
屬性的名字可以自由定義, 但是必須遵從一定規則, 以下代碼就明确說明了屬性名字不能随便寫
bool IsLegalPropertyName(const std::string& name) {
size_t namelen = name.size();
if (namelen < 1) return false;
if (name[0] == '.') return false;
if (name[namelen - 1] == '.') return false;
/* Only allow alphanumeric, plus '.', '-', '@', ':', or '_' */
/* Don't allow ".." to appear in a property name */
for (size_t i = 0; i < namelen; i++) {
if (name[i] == '.') {
// i=0 is guaranteed to never have a dot. See above.
if (name[i - 1] == '.') return false;
continue;
}
if (name[i] == '_' || name[i] == '-' || name[i] == '@' || name[i] == ':') continue;
if (name[i] >= 'a' && name[i] <= 'z') continue;
if (name[i] >= 'A' && name[i] <= 'Z') continue;
if (name[i] >= '0' && name[i] <= '9') continue;
return false;
}
return true;
}
static void handle_property_set_fd() {
...
switch (cmd) {
case PROP_MSG_SETPROP: {
char prop_name[PROP_NAME_MAX];
char prop_value[PROP_VALUE_MAX];
}}
}
- 不能以.開頭,也不能以.結尾, 名字長度不小于1,不大于PROP_NAME_MAX(32)位元組, 值的長度不能PROP_VALUE_MAX(92)位元組
- 以點作為分割, 不能出現連續的點
- 字元必須utf-8編碼方式, 可以是a-z, A-Z, 0-9, _,-,@,:, 其他字元為無效。