Android属性之build.prop,及propeetrty_get/property_s

本文详细介绍了Android系统中build.prop文件的生成流程及其作用。包括make系统如何解析Makefile生成build.prop,以及如何通过不同途径修改或添加属性。


简要分析一下build.prop是如何生成的。Android的build.prop文件是在Android编译时收集的各种property(LCD density/语言/编译时间, etc.),编译完成之后,文件生成在out/target/product/<board>/system/目录下。在Android运行时可以通过property_get()[c/c++域] / SystemProperties_get*()[Java域]读取这些属性值。

(1)build.prop的生成是由make系统解析build/core/Makefile完成。Makefile中首先定义各种变量,这在下一步执行时会用到。比如:

[cpp] view plaincopy


  • ...  
  • PRODUCT_DEFAULT_LANGUAGE="$(calldefault-locale-language,$(PRODUCT_LOCALES))" \  
  • PRODUCT_DEFAULT_REGION="$(calldefault-locale-region,$(PRODUCT_LOCALES))" \  
  • ...  

(2)Makefile中调用build/tools/buildinfo.sh执行脚本,并输出到build.prop。Buildinfo.sh很简单,只是echo一些属性,比如:

[cpp] view plaincopy


  • ...  
  • echo"ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"  
  • echo"ro.product.locale.region=$PRODUCT_DEFAULT_REGION"  
  • ...  

         ro.product.locale.language/ ro.product.locale.region就是些属性,等号后面是值。

(3)Makefile中直接把$(TARGET_DEVICE_DIR)/system.prop的内容追加到build.prop中,还会收集ADDITIONAL_BUILD_PROPERTIES中的属性,追加到build.prop中。

ADDITIONAL_BUILD_PROPERTIES又会收集PRODUCT_PROPERTY_OVERRIDES中定义的属性,如下:

[cpp] view plaincopy


  • ADDITIONAL_BUILD_PROPERTIES:= \  
  •         $(ADDITIONAL_BUILD_PROPERTIES)\  
  •         $(PRODUCT_PROPERTY_OVERRIDES)  

      通过build.prop生成过程的分析,可知哪里可以修改原有的属性或加入自己定义属性,那就是2) buildinfo.sh; 3) system.prop; 4) ADDITIONAL_BUILD_PROPERTIES或PRODUCT_PROPERTY_OVERRIDES。

(4)属性(property)都有一个名称和值,他们都是字符串格式,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。

        在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,“init”守护进程将启动一个属性服务。任何客户端想获得属性信息,可以从共享内存直接读取。客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息:

int property_get(const char *key, char *value, const char *default_value);

int property_set(const char *key, const char *value);

       当启动属性服务时,将从以下文件中加载默认属性:

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop

属性将会以上述顺序加载,后加载的属性将覆盖原先的值。特别属性如果属性名称以“ro.”开头,那么这个属性被视为只读属性,比如ro.mediatek.version.release=ALPS.ICS2.MP.V1就是指示版本号,应用中用property_get("ro.mediatek.version.release", val, "unknown");即可用来获得版本信息;属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义,系统启动时init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。客户端应用程序可以轮询那个属性值,以确定结果。

diff --git a/VENDOR.13/device/qcom/sepolicy_vndr/generic/vendor/common/kernel.te b/VENDOR.13/device/qcom/sepolicy_vndr/generic/vendor/common/kernel.te index 95f64bf9bf..a6b1ed65b3 100644 --- a/VENDOR.13/device/qcom/sepolicy_vndr/generic/vendor/common/kernel.te +++ b/VENDOR.13/device/qcom/sepolicy_vndr/generic/vendor/common/kernel.te @@ -47,3 +47,5 @@ dontaudit kernel kernel:system module_request; allow kernel mnt_vendor_file:dir search; allow kernel mnt_vendor_file:file { read open }; +allow kernel block_device:blk_file { read write open }; +allow kernel vendor_init:fd use; diff --git a/VENDOR.13/device/qcom/sepolicy_vndr/generic/vendor/common/vendor_init.te b/VENDOR.13/device/qcom/sepolicy_vndr/generic/vendor/common/vendor_init.te index 43c977f784..adafc37f84 100644 --- a/VENDOR.13/device/qcom/sepolicy_vndr/generic/vendor/common/vendor_init.te +++ b/VENDOR.13/device/qcom/sepolicy_vndr/generic/vendor/common/vendor_init.te @@ -117,6 +117,8 @@ get_prop(vendor_init, vendor_media_performance_class); allow vendor_init tee_device:chr_file getattr; +allow vendor_init block_device:blk_file { read write open }; + # Allow vendor init to read vendor_pcie_prop get_prop(vendor_init, vendor_pcie_prop); diff --git a/VENDOR.13/vendor/qcom/opensource/usb/etc/init.qcom.usb.rc b/VENDOR.13/vendor/qcom/opensource/usb/etc/init.qcom.usb.rc old mode 100644 new mode 100755 index c4fbdfe32f..861c6b792f --- a/VENDOR.13/vendor/qcom/opensource/usb/etc/init.qcom.usb.rc +++ b/VENDOR.13/vendor/qcom/opensource/usb/etc/init.qcom.usb.rc @@ -845,6 +845,35 @@ on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb,serial_cdev write /config/usb_gadget/g1/UDC ${sys.usb.controller} setprop sys.usb.state ${sys.usb.config} +on property:sys.usb.config=diag,adb,serial_cdev,mass_storage && property:sys.usb.configfs=2 + write /config/usb_gadget/g1/functions/mass_storage.0/lun.0/file "/dev/block/mmcblk1p1" + +on property:sys.usb.config=diag,adb,serial_cdev,mass_storage && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb,serial_cdev,mass_storage && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_adb_mass_storage" + write /config/usb_gadget/g1/functions/mass_storage.0/lun.0/file "/dev/block/mmcblk1p1" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901f + write /config/usb_gadget/g1/functions/diag.diag/pid 0x901f + symlink /config/usb_gadget/g1/functions/${vendor.usb.diag.func.name}.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/mass_storage.0 /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + on property:sys.usb.config=diag,serial_cdev,rmnet,dpl && property:sys.usb.configfs=1 write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl" rm /config/usb_gadget/g1/configs/b.1/f1 diff --git a/VENDOR.13/vendor/qcom/opensource/usb/etc/init.qcom.usb.sh b/VENDOR.13/vendor/qcom/opensource/usb/etc/init.qcom.usb.sh index 77a955265e..b8dc506198 100644 --- a/VENDOR.13/vendor/qcom/opensource/usb/etc/init.qcom.usb.sh +++ b/VENDOR.13/vendor/qcom/opensource/usb/etc/init.qcom.usb.sh @@ -47,13 +47,13 @@ target=`getprop ro.board.platform` # Override USB default composition # # If USB persist config not set, set default configuration -if [ "$(getprop persist.vendor.usb.config)" == "" -a "$(getprop ro.build.type)" != "user" ]; then +if [ "$(getprop ro.build.type)" != "user" ]; then if [ "$esoc_name" != "" ]; then setprop persist.vendor.usb.config diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb else case "$(getprop ro.baseband)" in "apq") - setprop persist.vendor.usb.config diag,adb,serial_cdev + setprop persist.vendor.usb.config diag,adb,serial_cdev,mass_storage ;; *) case "$soc_hwplatform" in diff --git a/VENDOR.13/vendor/qcom/opensource/usb/hal/usb_compositions.conf b/VENDOR.13/vendor/qcom/opensource/usb/hal/usb_compositions.conf index 263fef49a1..f1eb092136 100644 --- a/VENDOR.13/vendor/qcom/opensource/usb/hal/usb_compositions.conf +++ b/VENDOR.13/vendor/qcom/opensource/usb/hal/usb_compositions.conf @@ -10,6 +10,7 @@ mass_storage 0x05C6 0xF000 mass_storage,adb 0x05C6 0x9015 adb,mass_storage diag,adb 0x05C6 0x901D diag,adb,serial_cdev 0x05C6 0x901F +diag,adb,serial_cdev,mass_storage 0x05C6 0x901F diag 0x05C6 0x900E diag,serial_cdev,rmnet,adb 0x05C6 0x9091 diag,serial_cdev,rmnet 0x05C6 0x9092 如上修改会出现先出现U盘模式,后出现MTP,我想默认MTP,不要出现U盘模式,但是要同时支持U盘功能,怎么修改?
最新发布
10-15
<think>我们正在讨论的是两个相关的系统属性:`ro.odm.build.media_performance_class`和`android.sysprop.DeviceProperties`模块中定义的`media_performance_class`属性。用户提供的代码片段(props配置)已经明确了两者的映射关系。根据用户提供的代码片段(187-194行):```prop{api_name:"media_performance_class"type:Integerprop_name:"ro.odm.build.media_performance_class"}```这表示在`android.sysprop.DeviceProperties`模块中,定义了一个名为`media_performance_class`的属性(api_name),其类型为整数(Integer),并且这个属性映射到系统属性`ro.odm.build.media_performance_class`(prop_name)。因此,我们可以这样理解:1.**`ro.odm.build.media_performance_class`**:这是一个系统属性(systemproperty),通常由设备制造商(OEM/ODM)在构建设备固件时设置。它存储在设备的`/system/build.prop`或`/odm/build.prop`等文件中,或者由init进程在启动时设置。这个属性的值是一个整数,表示设备的媒体性能等级。2.**`android.sysprop.DeviceProperties`**:这是一个Android系统属性(sysprop)模块,它定义了一组属性,这些属性可以被Android框架访问。在这个模块中,`media_performance_class`被定义为一个整数类型的属性,并且它通过`prop_name`字段关联到实际的系统属性`ro.odm.build.media_performance_class`。关系总结:-`android.sysprop.DeviceProperties`模块中的`media_performance_class`属性是对底层系统属性`ro.odm.build.media_performance_class`的封装。-当Android框架需要访问媒体性能等级时,它通过`android.sysprop.DeviceProperties`模块的接口(例如,生成的Java类)来获取`media_performance_class`的值,而实际上这个值是从`ro.odm.build.media_performance_class`系统属性中读取的。定义和使用:-**定义**:在系统构建时,ODM(原始设计制造商)会在设备配置中设置`ro.odm.build.media_performance_class`属性。例如,在设备Makefile中:```makefilePRODUCT_ODM_PROPERTIES+=ro.odm.build.media_performance_class=2```这将在构建ODM镜像时将该属性写入`/odm/build.prop`。-**使用**:在Android框架代码中,通过`android.sysprop.DeviceProperties`模块生成的类(例如`DeviceProperties`类)来访问该属性。例如,在Java代码中:```javaintmediaPerfClass=DeviceProperties.media_performance_class().orElse(0);```这行代码会调用生成的代码,最终读取`ro.odm.build.media_performance_class`系统属性的值,如果不存在则返回默认值0。为什么这样设计?-抽象:通过sysprop模块,Android框架将系统属性的访问抽象化,避免了直接使用字符串键(容易出错)来访问系统属性。-类型安全:sysprop模块提供了类型安全的访问方式(如整数、布尔值等)。-集中管理:所有设备属性在同一个模块中定义,便于维护和文档化。注意事项:-如果`ro.odm.build.media_performance_class`没有设置,那么通过`DeviceProperties`获取到的值将是默认值(根据定义,如果没有指定默认值,则可能为null或0)。在用户提供的配置中,没有指定默认值,所以如果系统属性不存在,获取到的值可能为0(取决于生成的代码如何处理)。-该属性通常只读,因为它是设备构建时确定的性能等级,不应在运行时修改。参考用户提供的引用[1]:虽然引用[1]讨论的是memcg相关的属性,但原理类似,即系统属性可以用于配置系统行为。引用[2]提到了一个相机性能测试,可能与媒体性能等级有关,因为相机性能也是媒体性能的一部分。引用[3]描述了Android启动流程,其中在启动过程中会加载系统属性(包括ODM分区中的属性),因此`ro.odm.build.media_performance_class`会在启动早期被加载。因此,我们可以这样回答用户:</think>### `ro.odm.build.media_performance_class` 与 `android.sysprop.DeviceProperties` 关系详解 #### 1. **核心关系** `ro.odm.build.media_performance_class` 是底层系统属性(System Property),而 `android.sysprop.DeviceProperties` 是 Android 框架层定义的属性接口(Sysprop)。两者通过 **映射机制** 关联: ```python # Sysprop 配置映射关系 prop { api_name: "media_performance_class" # 框架层接口名 type: Integer # 数据类型 prop_name: "ro.odm.build.media_performance_class" # 底层系统属性名 } ``` - **底层属性**:`ro.odm.build.media_performance_class` - 由设备制造商(ODM)在构建系统镜像时设置 - 存储在 `/odm/build.prop` 或 `/vendor/build.prop` 中 - 通过 `getprop ro.odm.build.media_performance_class` 查看 - **框架接口**:`android.sysprop.DeviceProperties.media_performance_class` - 提供标准化 API 供 Android 系统服务访问 - 实际值从 `ro.odm.build.media_performance_class` 读取 #### 2. **定义方式对比** | **特性** | `ro.odm.build.media_performance_class` | `android.sysprop.DeviceProperties` | |-------------------------|---------------------------------------------|---------------------------------------------| | **定义层级** | 底层系统 (Linux Kernel/Init 阶段) | Android 框架层 (System Server) | | **设置时机** | 设备构建时 (Makefile 或 BoardConfig) | 系统启动时动态加载映射关系 | | **访问方式** | `getprop`/`__system_property_get()` | `SystemProperties.getInt()` | | **数据类型** | 原始字符串 → 需手动转换整数 | 直接返回整数类型 | | **作用域** | 全局只读 | 提供类型安全接口 | #### 3. **使用流程** 1. **ODM 设置属性** 在设备构建阶段设置媒体性能等级: ```makefile # device.mk PRODUCT_ODM_PROPERTIES += ro.odm.build.media_performance_class=2 ``` 2. **系统启动映射** Android 启动时解析 Sysprop 配置(如 `sysprop_library` 模块),建立映射关系[^3]。 3. **框架访问接口** 媒体服务通过标准化 API 获取值: ```java // Java 代码示例 int perfClass = DeviceProperties.media_performance_class().orElse(0); ``` 4. **性能优化应用** 根据值调整媒体处理策略: ```c++ // Native 代码逻辑 if (perfClass >= 2) { enable4KDecoding(); // 启用 4K 解码 } ``` #### 4. **关键设计目的** - **解耦**:分离硬件配置(ODM 负责)与框架逻辑(AOSP 定义) - **标准化**:统一访问接口,避免硬编码属性名 - **兼容性**:通过 CTS 测试验证属性值合理性(如引用[2]的像素校验)[^2] - **动态性**:允许运行时覆盖(需 root 权限)用于调试 #### 5. **典型问题分析** - **属性未设置**:框架接口返回默认值 `0`(基础性能等级) - **值不匹配**:若 ODM 设置值超出预期范围(如 `perfClass=5`),可能触发媒体服务异常 - **启动顺序**:Sysprop 映射需在 `init` 阶段完成,早于媒体服务启动[^3] > **数学表示**:设映射函数为 $f: \text{Sysprop} \rightarrow \text{System Property}$,则: > $$ > f(\texttt{media\_performance\_class}) = \texttt{ro.odm.build.media\_performance\_class} > $$ #### 6. **调试建议** ```shell # 查看底层属性值 adb shell getprop ro.odm.build.media_performance_class # 检查映射是否生效 adb shell dumpsys sysprop | grep "media_performance_class" # 验证媒体服务使用情况 adb shell dumpsys media.player | grep "PerfClass" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值