システムプロパティの定義方法
ビルド時に埋め込む方法
プロダクトごとの Makefile
(your_product.mk
など) に、以下のように記述しておくと、ビルド時に build.prop
に追加されます。
PRODUCT_PROPERTY_OVERRIDES += \
persist.sys.timezone = Asia/Tokyo
イメージのビルド後にプロパティファイルをいじる方法
default.prop
に以下のような感じで追加すると、デバイス起動時にシステムプロパティとして設定されます。
persist.sys.timezone=Asia/Tokyo
システム起動時の init の中で設定する
init.rc
あるいは、プロダクトごとの init
ファイルに、以下のような感じで追加しておくことができます。
setprop persist.sys.timezone Asia/Tokyo
Android デバイス起動時にシステムプロパティが設定される流れ
- init process が以下からプロパティをロードする
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
- システムプロパティ情報を提供するための unix domain socket server が作成される。
socket のパスは
/dev/socket/property_service
で、サイズは環境変数のANDROID_PROPERTY_WORKSPACE
で取得する。 Bionic libc のライブラリlibcutils
がこの shared memory に対してシステムプロパティを読み書きするインタフェースを提供する。
システムプロパティの get/set
from C/C++ native code
Bionic libc の libcutils
をリンクし、cutils/properties.h
を include して、以下の関数を使用します。
int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);
int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie);
使い方はこんな感じ。
#include "utils/properties.h"
char value[PROPERTY_VALUE_MAX];
if (property_get("ro.hardware", value, "") > 0) {
if (strcmp(value, "hoge") == 0) {
// ...
}
}
from Java code
android.os.SystemProperties
の下記のメソッドを使用します。
public static String get(String key, String def)
public static int getInt(String key, int def)
public static long getLong(String key, long def)
public static boolean getBoolean(String key, boolean def)
public static void set(String key, String val)
これは Android platform で使われているプライベートなクラスなので、Android アプリからは通常使用しません(internal usage only とされていますが、internal usage が何のことを言っているのかが曖昧です)。
SystemProperties
は JNI を使って、libcutils
のネイティブコードを叩いています。
通常 get 操作はできますが、set 操作は UID が適切にセットされていないとできないっぽいです(2016-03-16 追記: 現状これらは hide API 扱いなので、いずれも通常のアプリケーションからは使用できません)。
似たようなものに、通常の J2SE アプリケーションで使用可能な java.lang.System
クラスの getProperty()
系 API がありますが、この API で取得するプロパティは VM に関するプロパティであり、情報が異なります。
from shell (script)
Bionic libc の libcutils
に、コマンドラインツールとして以下のコマンドが用意されています。これらは shell スクリプトからも実行可能です。
getprop
… 例:getprop com.example.key
setprop
… 例:setprop com.example.key value