天天看點

Android系統10 RK3399 init程序啟動(三十四) 常見Property屬性

 配套系列教學視訊連結:

      ​​安卓系列教程之ROM系統開發-百問100ask​​

說明

系統:Android10.0

裝置: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

上一節我們介紹了屬性的架構, 本節中重點介紹一下,Android系統中常見的一些屬性。

一, 常見property屬性

通過getprop指令可以擷取系統中大部分的屬性,為啥說是大部分, 因為還有一些因為selinux權限原因, 不一定擷取到到, 對于老版本Android系統, 是可以全部擷取的:

Android系統10 RK3399 init程式啟動(三十四) 常見Property屬性

我們把以下常見屬性進行歸類:

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. 不能以.開頭,也不能以.結尾, 名字長度不小于1,不大于PROP_NAME_MAX(32)位元組, 值的長度不能PROP_VALUE_MAX(92)位元組
  2. 以點作為分割, 不能出現連續的點
  3. 字元必須utf-8編碼方式, 可以是a-z, A-Z, 0-9, _,-,@,:, 其他字元為無效。