Android属性工作原理解析

本文介绍了Android属性的工作原理,包括default.prop和build.prop的生成过程,重点关注device.mk和ADDITIONAL_BUILD_PROPERTIES的作用。同时,讲解了属性文件内容的含义,如只读属性(ro.)、可修改服务(init.rc)、持久化属性(persist.)和网络属性(net.)。并提到了System Property的读取和修改方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android属性方便了android系统进行定制,也有利于android上层应用可以方便操作。
一. android属性文件生成原理。
根据android属性值读取顺序/default.prop,/system/build.prop,/system/default.prop,/data/local.prop。
文件也会生成在不同的位置。default.prop生成在root目录下。其他在对应的/system。/data目录下。

default.prop与build.prop都是通过编译目录的build/core/Makefile文件生成的。下面就对这两个文件内容来源分析一下。

//src begin
# -----------------------------------------------------------------
# default.prop
INSTALLED_DEFAULT_PROP_TARGET := $(TARGET_ROOT_OUT)/default.prop
ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DEFAULT_PROP_TARGET)
ADDITIONAL_DEFAULT_PROPERTIES := \
    $(call collapse-pairs, $(ADDITIONAL_DEFAULT_PROPERTIES))
ADDITIONAL_DEFAULT_PROPERTIES += \
    $(call collapse-pairs, $(PRODUCT_DEFAULT_PROPERTY_OVERRIDES))
ADDITIONAL_DEFAULT_PROPERTIES := $(call uniq-pairs-by-first-component, \
    $(ADDITIONAL_DEFAULT_PROPERTIES),=)

$(INSTALLED_DEFAULT_PROP_TARGET):
        @echo Target buildinfo: $@
        @mkdir -p $(dir $@)
        $(hide) echo "#" > $@; \
                echo "# ADDITIONAL_DEFAULT_PROPERTIES" >> $@; \
                echo "#" >> $@;
        $(hide) $(foreach line,$(ADDITIONAL_DEFAULT_PROPERTIES), \
                echo "$(line)" >> $@;)
        build/tools/post_process_props.py $@
//src end
PRODUCT_DEFAULT_PROPERTY_OVERRIDES在mk文件中定义,并赋值。这个一般比较少看到赋值。一般没用。
ADDITIONAL_DEFAULT_PROPERTIES一般在对应产品的device.mk和/core/main.mk文件中定义,赋值。

device.mk:

ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1
ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1
ADDITIONAL_DEFAULT_PROPERTIES += ro.setupwizard.mode=DISABLE
ADDITIONAL_DEFAULT_PROPERTIES += persist.sys.timezone=Asia/Shanghai
ADDITIONAL_DEFAULT_PROPERTIES += persist.sys.strictmode.disable=true
core/main.mk

user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))
enable_target_debugging := true
tags_to_install :=
ifneq (,$(user_variant))
  # Target is secure in user builds.
  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1

  ifeq ($(user_variant),userdebug)
    # Pick up some extra useful tools
    tags_to_install += debug

    # Enable Dalvik lock contention logging for userdebug builds.
    ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.lockprof.threshold=500
  else
    # Disable debugging in plain user builds.
    enable_target_debugging :=
  endif

  # Turn on Dalvik preoptimization for user builds, but only if not
  # explicitly disabled and the build is running on Linux (since host
  # Dalvik isn't built for non-Linux hosts).
  ifneq (true,$(DISABLE_DEXPREOPT))
    ifeq ($(user_variant),user)
      ifeq ($(HOST_OS),linux)
        WITH_DEXPREOPT := true
      endif
    endif
  endif

  # Disallow mock locations by default for user builds
  ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=0

else # !user_variant
  # Turn on checkjni for non-user builds.
  ADDITIONAL_BUILD_PROPERTIES += ro.kernel.android.checkjni=1
  # Set device insecure for non-user builds.
  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0
  # Allow mock locations by default for non user builds
  ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1
endif # !user_variant

ifeq (true,$(strip $(enable_target_debugging)))
  # Target is more debuggable and adbd is on by default
  ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1
  # Include the debugging/testing OTA keys in this build.
  INCLUDE_TEST_OTA_KEYS := true
else # !enable_target_debugging
这部分有点长,主要就一个作用,分析是否user builder模式,如果是定义:
ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1...
如果不是,开启debug模式,并设置ota的key。


最后是用post_process_props.py这个python脚本去主要是追加一些参数到对应文件中。主要是追加USB开启adb模式。


def mangle_default_prop(prop):
  # If ro.debuggable is 1, then enable adb on USB by default
  # (this is for userdebug builds)
  if prop.get("ro.debuggable") == "1":
    val = prop.get("persist.sys.usb.config")
    if val == "":
      val = "adb"
    else:
      val = val + ",adb"
    prop.put("persist.sys.usb.config", val)
  # UsbDeviceManager expects a value here.  If it doesn't get it, it will
  # default to "adb". That might not the right policy there, but it's better
  # to be explicit.
  if not prop.get("persist.sys.usb.config"):
    prop.put("persist.sys.usb.config", "none");
可以看出追加了usb.config adb值。

  至此./default.prop文件中所有内容都已经获取到了。

  下面分析/system/build.prop,这个文件在手机还是盒子端都存在,主要存放一些系统中产品、配置项、编译信息、网络参数等。
  这个文件中内容来源比较多。
  如编译参数,是在编译的时候获取到。根据编译服务器的系统,用户名,编译时间获取到。这个部分主要在build/tools/buildinfo.sh通过echo添加到build.prop中。
echo "ro.build.date=`date`"
echo "ro.build.date.utc=`date +%s`"
echo "ro.build.type=$TARGET_BUILD_TYPE"
echo "ro.build.user=$USER"
echo "ro.build.host=`hostname`"
echo "ro.build.tags=$BUILD_VERSION_TAGS"
echo "ro.product.model=$PRODUCT_MODEL"
echo "ro.product.brand=$PRODUCT_BRAND"
echo "ro.product.name=$PRODUCT_NAME"
echo "ro.product.device=$TARGET_DEVICE"
echo "ro.product.board=$TARGET_BOOTLOADER_BOARD_NAME"
echo "ro.product.cpu.abi=$TARGET_CPU_ABI"


下面这些编译参数来源于产品中定义的prop文件。一般存放device/productXXX/system.prop文件中。systemui,launcher属性都存放该文件中,这个文件强相关产品信息配置。

ro.sf.lcd_density=160
ro.opengles.version = 131072
ro.config.softopengles = 0
ro.config.used_hw_vsync = 0
#force to tabletui: navigatbar move to statubar 
#ro.config.forcetabletui =1

ro.settings.config.hdmi=off
ro.soundrecorder.format=amr
ro.systemui.volumekey=enable
ro.systemui.capture=enable
ro.launcher.swipe=enable
ro.launcher.config.cling=enable
ro.launcher.hideactivity=disable
ro.launcher.allapp.landX=0
ro.launcher.allapp.landY=0
ro.launcher.allapp.portX=0
ro.launcher.allapp.portY=0
ro.launcher.workspace.landX=0
ro.launcher.workspace.landY=0
ro.launcher.workspace.portX=0
ro.launcher.workspace.portY=0
ro.launcher.hotseatcellcount=0
ro.launcher.hotseatallappsindex=0
ro.launcher.hotseat.landY=0
ro.launcher.hotseat.portY=0
ro.product.usbdevice.VID=10d6
ro.product.usbdevice.PID=fffe
ro.product.mtpdevice.PID=4e41
ro.product.ptpdevice.PID=4e43
举个例子:
ro.bootvideo.enable=0
这个参数如果设置为0,开机如果有视频的的话就没有声音播放出来。


其他大部分内容来源core/main.mk中的ADDITIONAL_BUILD_PROPERTIES这个变量。
或者也有部分内容来源vendor/android.prop。只有查看Makefile文件就可以找到具体添加的文件。

在data目录中一般也有property目录,目录下有一些persist的参数项。

二. android属性文件内容含义
属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
系统开发人员一般在init.rc文件中通过shell也可以加入一些自定义的属性。但记住这个属性也是只读,没有办法通过SystemProperties类去设置,如果需要修改属性值,可以通过在init.rc中注册一个服务。
例:init.rc中添加一个修改以太网地址的服务。
service setmac  /system/bin/setmac                                               
        class main                                                                  
        oneshot  

在setmac是一个可执行文件,生成文件的源码中添加sprintf(cmd, "/system/bin/setprop vlc.sn \"%s\"", pSn);
这样android启动后,在上层apk就可以通过SystemProperties获取到vlc.sn的值。但是不能修改这个值。
如果需要修改的话,可以通过ctrl.start这个service才能修改。

属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。这个一般不建议去设置。

属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。

三. android系统属性中System Property分析

可以参看这篇blog。转载地址:http://www.cnblogs.com/bastard/archive/2012/10/11/2720314.html

文章中解析了System Property中如何去读取,系统服务属性,并进行修改。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值