https://stackoverflow.com/questions/23758994/change-the-model-in-build-prop
https://www.techgainer.com/change-fake-android-device-model-number-and-brand-name/
====================================================================
出處 https://blog.csdn.net/Dylan_Sen/article/details/78757466
本文將從下面三方面簡單分析總結android property:
1. Property的使用方式
2. Property文件的加載
3. Property的存儲
1. Property的使用方式
2. Property文件的加載
3. Property的存儲
1. Property的使用方式
在工作中經常通過下面三種方式使用property:
1.1 code裡面使用SystemProperties.java和properties.cpp
SystemProperties.java為Jave層提供了下面的方法:
1.1 code裡面使用SystemProperties.java和properties.cpp
SystemProperties.java為Jave層提供了下面的方法:
- 1
- 2
- 3
- 4
- 5
- 6
system/core/libcutils/properties.cpp給Native層提供了下面的API:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
1.2 adb命令
adb的方式為我們調式提供了方便。
[格式]
adb shell getprop [proptery_name]
adb shell setprop propterty_name value
[例子]
adb shell getprop ro.build.type
adb shell setprop persist.log.tag.ImsManager V
adb的方式為我們調式提供了方便。
[格式]
adb shell getprop [proptery_name]
adb shell setprop propterty_name value
[例子]
adb shell getprop ro.build.type
adb shell setprop persist.log.tag.ImsManager V
1.3 通過文件設置默認property;將property放在文件中,init進程去加載文件。
前兩種方式可以讀取所有的property;但是在寫方面,對於ro.* property這種write-once的property是不能覆蓋的。
2. Property文件的加載
Property的初始化,以及相關propety文件的加載都在Init進程中完成。所以這部分內容從init進程的main函數開始。按照main函數中的code順序,主要內容如下:
- Property area初始化
- 加載default property文件
- 創建property service
- 加載解析rc文件
- 執行rc文件中的action; system property, persistent property和override property文件會在這個過程中相繼被加載。
main函數會調用proprerty_service.cpp中的property_init()函數來初始化property area。
- 1
- 2
- 3
- 4
- 5
- 6
property_init函數調用了System_properties.cpp中的__system_property_area_init()函數。後者又先後調用了initialize_properties()和map_system_property_area函數。
initialize_properties()函數:
initialize_properties會嘗試加載”/property_contexts”,如果失敗會嘗試加載/system和/vendor下對應的文件,看來從Android O開始/property_contexts文件已經不再使用,取而代之的是/plat_property_contexts。“/property_contexts”等文件為property prefix分配了security context,用來控制set權限。
property_contexts內容如下:
initialize_properties()函數:
initialize_properties會嘗試加載”/property_contexts”,如果失敗會嘗試加載/system和/vendor下對應的文件,看來從Android O開始/property_contexts文件已經不再使用,取而代之的是/plat_property_contexts。“/property_contexts”等文件為property prefix分配了security context,用來控制set權限。
property_contexts內容如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
map_system_property_area函數:
在看map_system_property_area(…)函數之前,我們先看下__system_property_area_init()函數。
在看map_system_property_area(…)函數之前,我們先看下__system_property_area_init()函數。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
下面看看map_system_property_area函數:
打開/dev/ properties /properties_serial文件,並映射到共享內存,將地址保存在system_property_area中。
打開/dev/ properties /properties_serial文件,並映射到共享內存,將地址保存在system_property_area中。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
到這裡property area初始化就完成了。
在講property文件的加載之前,有必要先講下rc文件相關的知識點。rc文件被加載解析之後,所有的action會被放到ActionManager的actions_ (vector類型)容器裡;而action對應的commend對放到對應action的commands_ (vector類型)容器裡。ActionManager負責根據trigger來執行action。
command對像在被創建的時候,會根據關鍵字在KeywordMap類型的指針function_map_中查找對應的function; function_map_的賦值是在main函數中,使用的是BuiltinFunctionMap對象,BuiltinFunctionMap是繼承自KeywordMap。最終是在BuiltinFunctionMap內Map類型的變量builtin_functions中查找。
下面是buildin_functions中的部分內容:
command對像在被創建的時候,會根據關鍵字在KeywordMap類型的指針function_map_中查找對應的function; function_map_的賦值是在main函數中,使用的是BuiltinFunctionMap對象,BuiltinFunctionMap是繼承自KeywordMap。最終是在BuiltinFunctionMap內Map類型的變量builtin_functions中查找。
下面是buildin_functions中的部分內容:
- 1
- 2
- 3
下面是init.rc中的相關內容:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
當load_persist_props和load_system_props 命令執行的時候do_load_persist_props和do_load_system_props 函數會分別執行。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
在執行rc文件內的action之前,main函數會調用property_load_boot_defaults()函數加載默認property; 調用start_property_service()函數來創建了一個名字為property_service的Unix domain Socket(PROP_SERVICE_NAME:property_service)來處理set prop請求。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
下面總結了可能會被加載的property文件或property(按照code順序):
文件/屬性 | 註釋 |
---|---|
/system/etc/prop.default | |
/prop.default | |
/default.prop | |
/odm/default.prop | |
/vendor/default.prop | |
/system/build.prop | |
/odm/build.prop | |
/vendor/build.prop | |
/factory/factory.prop | 只加載ro.* |
ro.recovery_id | |
/data/local.prop | |
/數據/屬性 | 這個路徑下只加載persist開頭的property |
/system/build.prop, /vendor/build.prop(PRODUCT_PROPERTY_OVERRIDES包含在內),/default.prop等生成規則都在代碼build/core/Makefile中有定義,當然如果不懂make 語法和函數,是不可能看的很明白。
3. Property的存儲
Property的存儲,工作中用不到,所以不想深究,根據System_properties.cpp中的註釋知道使用的是混合樹結構(hybrid trie),查找速度快,也省空間(分割了前綴,可以共用)。
Property是只能由init進程(單線程)更新,由property service完成。為了避免對線程讀的問題,在節點上使用了atomic_uint_least32_t。
Property是只能由init進程(單線程)更新,由property service完成。為了避免對線程讀的問題,在節點上使用了atomic_uint_least32_t。
沒有留言:
張貼留言