2016/12/20

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

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

> 参考
>
> [システムプロパティのあれこれ | まくまく Android ノート](http://maku77.github.io/android/vendor/system-property.html)

その中でもデバイス固有のプロパティを記述するのが `/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` に反映されます。
なお、下に行くほど優先度が高く、プロパティを上書きしますさらに、参考リンクにもあるように、他のファイルでプロパティが上書きされることもあります。。

確認は android-7.1.1_r6 で行いました4.4.1 以降いくつかのバージョンでも確認していますが、いまのところ大きな変更は無いようです。

### buildinfo.sh
[build/tools/buildinfo.sh](https://android.googlesource.com/platform/build/+/android-7.1.1_r6/tools/buildinfo.sh)

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

```shell
`first-line: 6;
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](https://android.googlesource.com/platform/build/+/android-7.1.1_r6/target/board/generic_x86_64/system.prop) 等にあったりします。

プロダクトのルートにある `system.prop` が使用されるということです。
これは [build/core/Makefile](https://android.googlesource.com/platform/build/+/android-7.1.1_r6/core/Makefile) 内で以下のように記述されているためです。
見ての通り、`TARGET_SYSTEM_PROP` という変数でファイルを指定すれば、そのファイルを使用するようになります。

```makefile
`first-line: 200
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` を定義するとプロパティを上書きすることが出来ます他の Makefile に記述することもできるけど。
エミュレーターだと [build/target/board/generic_x86_64/device.mk](https://android.googlesource.com/platform/build/+/android-7.1.1_r6/target/board/generic_x86_64/device.mk) 等の中に記述されていたりします。

```makefile
PRODUCT_PROPERTY_OVERRIDES += \
    persist.sys.timezone = Asia/Tokyo
```

ビルド毎に設定を使い分けたい場合に使用すると良いでしょう例えば、デバッグ時のみ設定値を変える等。


### build.prop を生成している記述
上記3つの情報を統合して `system/build.prop` ファイルにしているのは、
[build/core/Makefile](https://android.googlesource.com/platform/build/+/android-7.1.1_r6/core/Makefile) 内の以下の記述です。

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

```makefile
`first-line: 205;
$(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)" \
以下略
```

0 件のコメント: