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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值