2013/02/06

Android:エミュレータでマルチユーザ機能を確認する

JB4.2で正式にマルチユーザ機能が公開されました。
ICSから一部機能が搭載されはじめ、JB4.1では(隠された)UIが存在しましたがユーザを追加することはできませんでした。

●JB4.1でマルチユーザ機能の蓋開けを行う方法は下記。
1. 端末で利用できるユーザ数の上限を引き上げる
$ setprop fw.max_users 2
2. ユーザを作成する
$ pm create-user <userName>
3. ユーザを切り替える
[power]キー長押しの電源オプションにユーザが追加されているのでこれを選択(下図)


●JB4.2のエミュレータでマルチユーザ機能を確認する方法は下記。
JB4.2エミュレータでは、端末形状に関わらず fw.max_users値 が1で定義されています。
このため、マルチユーザ機能が蓋閉めされている状態です。
※JB4.2標準ではタブレットのみマルチユーザ機能がONになる
定数定義はframeworks/base/core/res/res/values/config.xmlのconfig_multiuserMaximumUsers

JB4.2エミュレータでマルチユーザ機能を確認するためには、ユーザ数の上限を引き上げる必要があります。
$ setprop fw.max_users 2
上記システムプロパティを編集すれば、マルチユーザ管理に必要なUIが表示されるようになります。


マルチユーザ環境下でのデータフォルダの扱い

下記はシングルユーザ時とマルチユーザ時のデータフォルダの扱いの違いです。

●シングルユーザ時
/data/data/。。。

●マルチユーザ時
ユーザを1名追加した後のデータフォルダ状態。
・ユーザ状態
Primary : 初期ユーザ
newOne  : 追加したユーザ

・Primaryユーザ用ディレクトリ
/data/data/。。。
/data/user/0/。。。

・newOneユーザ用ディレクトリ
/data/user/10/。。。

/data/userディレクトリに各ユーザ用のデータフォルダが作成される。
Primaryユーザ用のディレクトリは2つあるわけではなく、/data/user/0が/data/dataへのシンボリックリンクとして扱われます。
$ ls -la /data/user
lrwxrwxrwx root     root              2013-02-05 10:11 0 -> /data/data/
drwxrwx--x system   system            2013-02-06 06:34 10

蛇足

○設定アプリの[ユーザ]項目の表示/非表示判定箇所
com.android.settings.Settings.updateHeaderList(List<Header>)
} else if (id == R.id.user_settings) {
    if (!UserHandle.MU_ENABLED
            || !UserManager.supportsMultipleUsers()
            || Utils.isMonkeyRunning()) {
        target.remove(i);    // [ユーザ]項目を削除

android.os.UserManager.getMaxSupportedUsers()
public static int getMaxSupportedUsers() {
    // Don't allow multiple users on certain builds
    if (android.os.Build.ID.startsWith("JVP")) return 1;
    return SystemProperties.getInt("fw.max_users",
            Resources.getSystem().getInteger(
                R.integer.config_multiuserMaximumUsers));
}
# どうも"JVP"から始まるビルドIDはマルチユーザ強制非対応の様子。