2016/12/20

Android の build.prop に設定値を追加する方法

Android のシステムプロパティを設定する方法は多々あります。

参考

システムプロパティのあれこれ | まくまく Android ノート

その中でもデバイス固有のプロパティを記述するのが /system/build.prop

OS を独自ビルドするような仕事をしていると、この /system/build.prop に設定値を追加したいことがあるのですが、このファイルの元になる情報が分散しているので、まとめておきます。

build.prop の元となるデータ

上述のように /system/build.prop はいくつかの設定を集めて作成されます。 具体的には以下の3つ。

  • build/tools/buildinfo.sh
  • device/vender/product/system.prop
  • device/vender/product/product.mk 中の PRODUCT_PROPERTY_OVERRIDES

これらのうち、どれかに記述すると、/system/build.prop に反映されます。 なお、下に行くほど優先度が高く、プロパティを上書きします1

確認は android-7.1.1_r6 で行いました2

buildinfo.sh

build/tools/buildinfo.sh

中を見ると以下のように echo が並んでいます。ビルド時の環境変数を反映させるのが目的のようです。 よほどの理由が無い限り、このファイルに手を加えるべきではありません。

6
7
8
echo "ro.build.id=$BUILD_ID"
echo "ro.build.display.id=$BUILD_DISPLAY_ID"
以下略

system.prop

独自のプロダクトを定義している場合、 device/vender/product/system.prop がデフォルトになります。 エミュレーターだと build/target/board/generic_x86_64/system.prop 等にあったりします。

プロダクトのルートにある system.prop が使用されるということです。 これは build/core/Makefile 内で以下のように記述されているためです。 見ての通り、TARGET_SYSTEM_PROP という変数でファイルを指定すれば、そのファイルを使用するようになります。

200
201
202
203
204
ifdef TARGET_SYSTEM_PROP
system_prop_file := $(TARGET_SYSTEM_PROP)
else
system_prop_file := $(wildcard $(TARGET_DEVICE_DIR)/system.prop)
endif

このファイルはプロダクト固有のプロパティを設定するのに使います。

PRODUCT_PROPERTY_OVERRIDES

独自のプロダクトを定義している場合、 device/vender/product/product.mk 内に PRODUCT_PROPERTY_OVERRIDES を定義するとプロパティを上書きすることが出来ます3。 エミュレーターだと build/target/board/generic_x86_64/device.mk 等の中に記述されていたりします。

1
2
PRODUCT_PROPERTY_OVERRIDES += \
    persist.sys.timezone = Asia/Tokyo

ビルド毎に設定を使い分けたい場合に使用すると良いでしょう4

build.prop を生成している記述

上記3つの情報を統合して system/build.prop ファイルにしているのは、 build/core/Makefile 内の以下の記述です。

今後、仕様が変更されることもありうるので、OSのバージョンが変わった場合は確認した方が良いでしょう。

205
206
207
208
209
210
211
212
213
214
215
216
217
218
$(intermediate_system_build_prop): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(system_prop_file) $(INSTALLED_ANDROID_INFO_TXT_TARGET)
 @echo Target buildinfo: $@
 @mkdir -p $(dir $@)
 $(hide) echo > $@
ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES),)
 $(hide) echo "#" >> $@; \
         echo "# PRODUCT_OEM_PROPERTIES" >> $@; \
         echo "#" >> $@;
 $(hide) $(foreach prop,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES), \
  echo "import /oem/oem.prop $(prop)" >> $@;)
endif
 $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \
   TARGET_BUILD_FLAVOR="$(TARGET_BUILD_FLAVOR)" \
以下略
  1. さらに、参考リンクにもあるように、他のファイルでプロパティが上書きされることもあります。 
  2. 4.4.1 以降いくつかのバージョンでも確認していますが、いまのところ大きな変更は無いようです 
  3. 他の Makefile に記述することもできるけど 
  4. 例えば、デバッグ時のみ設定値を変える等 
?

0 件のコメント: