zoukankan      html  css  js  c++  java
  • Android之build.prop属性详解

    注:本篇文章是基于MSD648项目(AndroidTV)的prop进行说明。

    Android版本:4.4.4

    内核版本:3.10.86

    1.生成build.prop

      build.prop的生成是由make系统解析build/core/Makefile完成

      1.1.Makefile生成build.prop的主要代码如下

    $(INSTALLED_BUILD_PROP_TARGET): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(system_prop_file)
        @echo Target buildinfo: $@
        @mkdir -p $(dir $@)
        $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" 
                TARGET_DEVICE="$(TARGET_DEVICE)" 
                PRODUCT_NAME="$(TARGET_PRODUCT)" 
                PRODUCT_BRAND="$(PRODUCT_BRAND)" 
                PRODUCT_DEFAULT_LANGUAGE="$(call default-locale-language,$(PRODUCT_LOCALES))" 
                PRODUCT_DEFAULT_REGION="$(call default-locale-region,$(PRODUCT_LOCALES))" 
                PRODUCT_DEFAULT_WIFI_CHANNELS="$(PRODUCT_DEFAULT_WIFI_CHANNELS)" 
                PRODUCT_MODEL="$(PRODUCT_MODEL)" 
                PRODUCT_MANUFACTURER="$(PRODUCT_MANUFACTURER)" 
                PRIVATE_BUILD_DESC="$(PRIVATE_BUILD_DESC)" 
                BUILD_ID="$(BUILD_ID)" 
                BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" 
                BUILD_NUMBER="$(BUILD_NUMBER)" 
                PLATFORM_VERSION="$(PLATFORM_VERSION)" 
                PLATFORM_SDK_VERSION="$(PLATFORM_SDK_VERSION)" 
                PLATFORM_VERSION_CODENAME="$(PLATFORM_VERSION_CODENAME)" 
                BUILD_VERSION_TAGS="$(BUILD_VERSION_TAGS)" 
                TARGET_BOOTLOADER_BOARD_NAME="$(TARGET_BOOTLOADER_BOARD_NAME)" 
                BUILD_FINGERPRINT="$(BUILD_FINGERPRINT)" 
                TARGET_BOARD_PLATFORM="$(TARGET_BOARD_PLATFORM)" 
                TARGET_CPU_ABI="$(TARGET_CPU_ABI)" 
                TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" 
                TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" 
                bash $(BUILDINFO_SH) > $@
        $(hide) $(foreach file,$(system_prop_file), 
            if [ -f "$(file)" ]; then 
                echo "#" >> $@; 
                echo Target buildinfo from: "$(file)"; 
                echo "# from $(file)" >> $@; 
                echo "#" >> $@; 
                cat $(file) >> $@; 
            fi;)
        $(if $(ADDITIONAL_BUILD_PROPERTIES), 
            $(hide) echo >> $@; 
                    echo "#" >> $@; 
                    echo "# ADDITIONAL_BUILD_PROPERTIES" >> $@; 
                    echo "#" >> $@; )
        $(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), 
            echo "$(line)" >> $@;)
        $(hide) build/tools/post_process_props.py $@
    
    build_desc :=

      1.2.目标文件为$(INSTALLED_BUILD_PROP_TARGET),其定义为:

    INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop

      1.3.首先对属性进行赋值,如BUILD_ID="$(BUILD_ID)",最后执行bash脚本:bash $(BUILDINFO_SH) > $@,其定义为

    BUILDINFO_SH := build/tools/buildinfo.sh

      1.4.开始执行sh脚本中的内容

    #!/bin/bash
    
    echo "# begin build properties"
    echo "# autogenerated by buildinfo.sh"
    
    echo "ro.build.id=$BUILD_ID"
    echo "ro.build.display.id=$BUILD_DISPLAY_ID"
    echo "ro.build.version.incremental=$BUILD_NUMBER"
    echo "ro.build.version.sdk=$PLATFORM_SDK_VERSION"
    echo "ro.build.version.codename=$PLATFORM_VERSION_CODENAME"
    echo "ro.build.version.release=$PLATFORM_VERSION"
    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"
    if [ -n "$TARGET_CPU_ABI2" ] ; then
      echo "ro.product.cpu.abi2=$TARGET_CPU_ABI2"
    fi
    echo "ro.product.manufacturer=$PRODUCT_MANUFACTURER"
    if [ -n "$PRODUCT_DEFAULT_LANGUAGE" ] ; then
      echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
    fi
    if [ -n "$PRODUCT_DEFAULT_REGION" ] ; then
      echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
    fi
    echo "ro.wifi.channels=$PRODUCT_DEFAULT_WIFI_CHANNELS"
    echo "ro.board.platform=$TARGET_BOARD_PLATFORM"
    
    echo "# ro.build.product is obsolete; use ro.product.device"
    echo "ro.build.product=$TARGET_DEVICE"
    
    echo "# Do not try to parse ro.build.description or .fingerprint"
    echo "ro.build.description=$PRIVATE_BUILD_DESC"
    echo "ro.build.fingerprint=$BUILD_FINGERPRINT"
    echo "ro.build.characteristics=$TARGET_AAPT_CHARACTERISTICS"
    
    echo "# end build properties"

      1.5.最后追加余下的属性

        $(hide) $(foreach file,$(system_prop_file), 
            if [ -f "$(file)" ]; then 
                echo "#" >> $@; 
                echo Target buildinfo from: "$(file)"; 
                echo "# from $(file)" >> $@; 
                echo "#" >> $@; 
                cat $(file) >> $@; 
            fi;)
        $(if $(ADDITIONAL_BUILD_PROPERTIES), 
            $(hide) echo >> $@; 
                    echo "#" >> $@; 
                    echo "# ADDITIONAL_BUILD_PROPERTIES" >> $@; 
                    echo "#" >> $@; )
        $(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), 
            echo "$(line)" >> $@;)
        $(hide) build/tools/post_process_props.py $@

        其中system_prop_file定义:

    ifdef TARGET_SYSTEM_PROP
    system_prop_file := $(TARGET_SYSTEM_PROP)
    else
    system_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/system.prop)
    endif

        即$(TARGET_DEVICE_DIR)/system.prop文件

      到此,prop文件生成完毕!

    2.对生成的build.prop的属性进行说明:

    # begin build properties
    # autogenerated by buildinfo.sh
    ro.build.id=KTU84P  #版本ID
    ro.build.display.id=aosp_almond-userdebug 4.4.4 KTU84P TVOS-04.19.010.02.06.Mooney test-keys  #具体版本号
    ro.build.version.incremental=TVOS-04.19.010.02.07.Mooney  #版本增量说明
    ro.build.version.sdk=19  #SDK版本
    ro.build.version.codename=REL  #版本代号
    ro.build.version.release=4.4.4  #Android系统版本
    ro.build.date=2017年 07月 13日 星期四 14:39:47 CST  #编译时间
    ro.build.date.utc=1499927987  #编译时间(UTC)
    ro.build.type=userdebug  #编译类型(eng/user)
    ro.build.user=pngcui  #编译者
    ro.build.host=Sky-pngcui  #编译机器名
    ro.build.tags=test-keys  #系统标记
    ro.product.model=MSD6A648  #设备型号
    ro.product.brand=MStar  #设备品牌
    ro.product.name=aosp_almond  #产品名
    ro.product.device=almond  #采用的设备名
    ro.product.board=almond  #采用的主板名
    ro.product.cpu.abi=armeabi-v7a  #CPU版本
    ro.product.cpu.abi2=armeabi  #CPU品牌
    ro.product.manufacturer=Skyworth-qx, Inc.  #产品制造商
    ro.product.locale.language=zh
    ro.product.locale.region=CN
    ro.wifi.channels=  #无线局域网络的通信信道,空白表示自动识别
    ro.board.platform=mooney  #主板平台
    # ro.build.product is obsolete; use ro.product.device
    ro.build.product=almond  #设备名,已被废弃,使用ro.product.device
    # Do not try to parse ro.build.description or .fingerprint
    ro.build.description=aosp_almond-userdebug 4.4.4 KTU84P TVOS-04.19.010.02.06.Mooney test-keys  #用户key
    ro.build.fingerprint=MStar/aosp_almond/almond:4.4.4/KTU84P/TVOS-04.19.010.02.06.Mooney:userdebug/test-keys  #机身码
    ro.build.characteristics=tv
    # end build properties

    3.修改prop的属性的说明,需要对照build/tools/buildinfo.sh进行

      3.1.ro.build.id属性(build/core/build_id.mk)

    export BUILD_ID=8M648

      3.2.ro.build.display.id(build/core/Makefile)

    build_desc := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER) $(BUILD_VERSION_TAGS)
    
    # Display parameters shown under Settings -> About Phone
    ifeq ($(TARGET_BUILD_VARIANT),user)
      # User builds should show:
      # release build number or branch.buld_number non-release builds
    
      # Dev. branches should have DISPLAY_BUILD_NUMBER set
      ifeq "true" "$(DISPLAY_BUILD_NUMBER)"
        BUILD_DISPLAY_ID := $(BUILD_ID).$(BUILD_NUMBER) $(BUILD_KEYS)
      else
        BUILD_DISPLAY_ID := $(BUILD_ID) $(BUILD_KEYS)
      endif
    else
      # Non-user builds should show detailed build information
        BUILD_DISPLAY_ID := $(build_desc)
    endif

      3.3.ro.build.version.incremental(device/mstar/almond/BoardConfigCommon.mk)

    BUILD_NUMBER := TVOS-04.19.010.02.07.Mooney

      3.4.ro.product.model、ro.product.brand、ro.product.name、ro.product.device、ro.product.manufacturer(device/mstar/almond/aosp_almond.mk)

    # Set those variables here to overwrite the inherited values.
    PRODUCT_NAME := aosp_almond
    PRODUCT_DEVICE := almond
    PRODUCT_BRAND := MStar
    PRODUCT_MODEL := MSD6A648
    PRODUCT_MANUFACTURER := Skyworth-qx, Inc.

      注:PRODUCT_DEVICE会决定device下目录的选择,故尽量不要更改

      3.5.ro.build.description(build/core/Makefile)

    build_desc := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER) $(BUILD_VERSION_TAGS)
    
    $(INSTALLED_BUILD_PROP_TARGET): PRIVATE_BUILD_DESC := $(build_desc)

      3.6.ro.product.board(device/mstar/almond/BoardConfig.mk)

    TARGET_BOOTLOADER_BOARD_NAME := almond

    4.Android系统中Setting.apk中内核版本

      packages/apps/Settings/src/com/android/settings/DeviceInfoSettings.java

     1 private static final String FILENAME_PROC_VERSION = "/proc/version";
     2 private static final String KEY_KERNEL_VERSION = "kernel_version";
     3 
     4 @Override
     5 public void onCreate(Bundle icicle) {   
     6   findPreference(KEY_KERNEL_VERSION).setSummary(getFormattedKernelVersion());
     7 }
     8 
     9     public static String getFormattedKernelVersion() {
    10         try {
    11             return formatKernelVersion(readLine(FILENAME_PROC_VERSION));
    12 
    13         } catch (IOException e) {
    14             Log.e(LOG_TAG,
    15                 "IO Exception when getting kernel version for Device Info screen",
    16                 e);
    17 
    18             return "Unavailable";
    19         }
    20     }
    21 
    22   public static String formatKernelVersion(String rawKernelVersion) {
    23         // Example (see tests for more):
    24         // Linux version 3.0.31-g6fb96c9 (android-build@xxx.xxx.xxx.xxx.com) 
    25         //     (gcc version 4.6.x-xxx 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT 
    26         //     Thu Jun 28 11:02:39 PDT 2012
    27 
    28         final String PROC_VERSION_REGEX =
    29             "Linux version (\S+) " + /* group 1: "3.0.31-g6fb96c9" */
    30             "\((\S+?)\) " +        /* group 2: "x@y.com" (kernel builder) */
    31             "(?:\(gcc.+? \)) " +    /* ignore: GCC version information */
    32             "(#\d+) " +              /* group 3: "#1" */
    33             "(?:.*?)?" +              /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */
    34             "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 4: "Thu Jun 28 11:02:39 PDT 2012" */
    35 
    36         Matcher m = Pattern.compile(PROC_VERSION_REGEX).matcher(rawKernelVersion);
    37         if (!m.matches()) {
    38             Log.e(LOG_TAG, "Regex did not match on /proc/version: " + rawKernelVersion);
    39             return "Unavailable";
    40         } else if (m.groupCount() < 4) {
    41             Log.e(LOG_TAG, "Regex match on /proc/version only returned " + m.groupCount()
    42                     + " groups");
    43             return "Unavailable";
    44         }
    45         return m.group(1) + "
    " +                 // 3.0.31-g6fb96c9
    46             m.group(2) + " " + m.group(3) + "
    " + // x@y.com #1
    47             m.group(4);                            // Thu Jun 28 11:02:39 PDT 2012
    48     }
    49             

      即从/proc/version文件中提取相应信息。

  • 相关阅读:
    EntityFramework之领域驱动设计实践(三)(转)
    System.Collections.ObjectModel.Collection
    EntityFramework之领域驱动设计实践 (一)(转)
    C#中Collection,List和ArrayList的区别(转)
    家常菜
    WCF开发实战系列二:使用IIS发布WCF服务(转)
    Broken Flowers(破碎之花)
    EntityFramework之领域驱动设计实践(五)(转)
    用Restful方式调用WCF进行上传下载(转)
    EntityFramework之领域驱动设计实践(二)(转)
  • 原文地址:https://www.cnblogs.com/pngcui/p/7193622.html
Copyright © 2011-2022 走看看