Android OSのマルチユーザー環境

投稿日:  更新日:

Android OSはマルチユーザーのOSです。

マルチユーザーとは一台の携帯端末を複数のユーザーで切り替えて使うことです。

マルチユーザーについてまとめます。

スポンサーリンク

マルチユーザーとは

マルチユーザーとは一台の携帯端末を複数のユーザーで切り替えて使うことです。

例えば、家族で一台の携帯端末を共有するような使い方が可能です。

携帯端末を共有

しかし、家族とはいっても、各々でプライバシーを確保したい内容はあります。

マルチユーザーではユーザ毎に全く独立した利用環境が提供されます。独立しているので、他のユーザから干渉を受けることもなければ、他のユーザーへ干渉することもありません。

ですから、各々のユーザーのプライバシーは守られるようになっています。

独立した利用環境

スポンサーリンク

マルチユーザーのサポート

マルチユーザーのサポートは、メーカーがAndroid OSを携帯端末へ実装する時に決めるようです。

よって、すべての端末がサポートしているとは限りません。

手持ちの端末のサポート状況は次のようになっていました。

Device名APIマルチユーザー最大ユーザー数
Emulator(AVD)Api ≦ 23(Ver 6.0.x)×1
Api >23(Ver 6.0.x)4
Nexus 6P27(Ver 8.1)4
Nexus 5X27(Ver 8.1)4
FREETEL REI225(Ver 7.1.1)×(※1)4
Nexus 723(Ver 6.0.1)8
Huawei Y622(Ver 5.1.1)×1
※1:設定アプリにUI(項目:ユーザー)が表示されない

マルチユーザの有効化

adb shellを使って、一時的にマルチユーザをサポート有りにしたり、最大ユーザー数を変更したり、出来ます。

ただし、変更の有効な期間はAndroid OSの動作している間です。再起動で、元に戻ります。

> adb shell setprop fw.max_users 8         // 最大ユーザ数の変更
> adb shell setprop fw.show_multiuserui 1  // 1:UIを表示、0:非表示

また、root権限が必要なので、root化された端末のみで効力を発揮します。

最大ユーザ数を調べる

adb shellを使って、最大ユーザー数を確認できます。

>  adb shell pm get-max-users
Maximum supported users: 8    // 最大ユーザー数は8人
スポンサーリンク

ユーザーの種類

マルチユーザーで扱うユーザーの種類は次のようなものがあります。

種類概要ユーザー数
システムAndroid OS実装時に追加された最初のユーザー1
セカンダリ
(一般)
管理者ユーザーにより追加された新規のユーザー最大ユーザー数 - 1
ゲスト一時的なセカンダリユーザー1
管理者
(所有者)
マルチユーザを管理するユーザー
( デフォルト:管理者=システムユーザー )
1
※最大ユーザ数 ≧ 管理者ユーザー数 + セカンダリユーザー数

ログインしているユーザーの種類により、各ユーザーに与える影響の範囲が異なります。

ユーザの種類

スポンサーリンク

ユーザーの作成

新規ユーザーの作成(追加)は、所有者でログインして、設定アプリの「ユーザー管理」ページから行います。

Api:23~25(Api 25)Api:26~27(Api 27)Api:28~30(Api 30)
ユーザーの作成(API 25)
ユーザーの作成(API 27)
ユーザーの作成(API 30)
スポンサーリンク

ユーザーの編集

ユーザーの編集は、一般ユーザーまたは所有者ユーザーでログインして、設定アプリの「ユーザー管理」ページから行います。

Api:23~25(Api 25)Api:26~27(Api 27)Api:28~30(Api 30)
ユーザーの編集(API 25)
ユーザーの編集(API 27)
ユーザーの編集(API 30)
スポンサーリンク

ユーザーの切り替え

ユーザーの切り替えは、ステータスバー(スワイプして詳細を表示)より行います。

Api:23~25(Api 25)Api:26~27(Api 27)Api:28~30(Api 30)
ユーザーの切り替え(API 25)
ユーザーの切り替え(API 27)
ユーザーの切り替え(API 30)
スポンサーリンク

ユーザーの削除

ユーザーの削除は、所有者でログインして、設定アプリの「ユーザー管理」ページから行います。

Api:23~25(Api 25)Api:26~27(Api 27)Api:28~30(Api 30)
ユーザーの削除(API 25)
ユーザーの削除(API 27)
ユーザーの削除(API 30)
スポンサーリンク

ユーザーのストレージ

ユーザーが作成されると、User IDが割り振られ、そのID(番号)を名前にしたフォルダが作られます。

このフォルダがユーザーのデータを格納する領域です。

ユーザーのストレージ

ユーザーが削除されると、User IDと共にこのフォルダーが削除されます。

ユーザーの削除によって使用済みとなったIDは欠番となり、ユーザの作成で割り振られるIDは新たな番号になります。

ちなみに、管理者(所有者)のIDは「0の固定」、セカンダリおよびゲストのIDは「10以上の連番」です。

スポンサーリンク

UID(LinuxのUID)とUser ID

UIDの割り振り

アプリを端末へインストールするとアプリ毎にLinuxのUIDが割り振られます。

マルチユーザーのユーザー環境は独立しているため、複数のユーザーへ同じアプリをインストールしたとしても、個別のアプリとして扱われます。

ですので、同じアプリであったとしてもUser IDが違えば、UIDは異なった番号になります。

LinuxのUIDとUser ID

UIDの役割り

アプリはこのUIDにより起動されたプロセスで実行されます。

また、アプリのデータはLinuxのファイルパーミッション機能を使って、このUID以外からのアクセスを拒否します。

【プロセス】
> ps -A | grep com.example
u0_a79     13047  ...  76544 ep_poll    e9d06af0 S com.example.app_a
u0_a80     11106  ...  75876 ep_poll    e9d06af0 S com.example.app_b
> ps -A | grep com.example
u10_a79    12666  ...  77540 ep_poll    e9d06af0 S com.example.app_a
(1)        (2)                                     (3)

(1)User name
(2)Process ID
(3)Process name

【内部ストレージ】
> ls -ld /data/user/0/* /data/user/10/* | grep com.example
drwx------  4 u0_a79   u0_a79   ... /data/user/0/com.example.app_a
drwx------  4 u0_a80   u0_a80   ... /data/user/0/com.example.app_b
drwx------  4 u10_a79  u10_a79  ... /data/user/10/com.example.app_a
(1)           (2)      (3)          (4)

(1)File permission
    d:フォルダ(ディレクトリ)
    rwx------:Owner(User nameの人)のみ読み・書き・参照が可能
(2)User name
(3)Group name
(4)アプリのデータ用フォルダ

【UIDの番号】
> id u0_a79
uid=10079(u0_a79) gid=10079(u0_a79) groups=10079(u0_a79), context=u:r:su:s0
> id u0_a80
uid=10080(u0_a80) gid=10080(u0_a80) groups=10080(u0_a80), context=u:r:su:s0
> id u10_a79
uid=1010079(u10_a79) gid=1010079(u10_a79) groups=1010079(u10_a79), context=u:r:su:s0

つまり、このUIDによってアプリは、他のアプリによる不必要なアクセスから守られた環境下で動作します。

この守られた環境のことを「サンドボックス」といいます。

UIDとUser IDの関連性

LinuxのUIDとUser IDは表のような関連性を持っています。

計算式
UID
(LinuxのUID)
User ID * PER_USER_RANGE + App ID % PER_USER_RANGE 1010079
User IDUID / PER_USER_RANGE 10
App IDUID % PER_USER_RANGE 10079
※PER_USER_RANGE = 100000
※*:乗算、/:除算、%:剰余

UIDはこの関連性に従って算出され、アプリへ割り当てられます。

UIDとUser IDを調べるプログラム

UIDとUser IDを調べるプログラムは次のようになります。

private const val PER_USER_RANGE = 100000

fun logUserInfo(tag: String) {
    val _pid = Process.myPid()
    val _uid = Process.myUid()
    Log.i(tag, "PID    = ${_pid}")
    Log.i(tag, "UID    = ${_uid}")
    Log.i(tag, "UserId = ${_uid / PER_USER_RANGE}")
    Log.i(tag, "AppId  = ${_uid % PER_USER_RANGE}")
}
スポンサーリンク

関連記事:

Androidアプリを実行しているプロセスIDとプロセス名をプログラムで調べる方法を紹介します。 ...
Androidアプリを実行しているスレッドIDとスレッド名をプログラムで調べる方法を紹介します。 ...
スポンサーリンク