1. 程式人生 > >Android之build.prop屬性詳解

Android之build.prop屬性詳解

lin logs generated reg dconf hostname product att make

註:本篇文章是基於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 ([email protected]) 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: "[email protected]" (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) + "\n" +                 // 3.0.31-g6fb96c9
46             m.group(2) + " " + m.group(3) + "\n" + // [email protected] #1
47             m.group(4);                            // Thu Jun 28 11:02:39 PDT 2012
48     }
49             

  即從/proc/version文件中提取相應信息。

Android之build.prop屬性詳解