Android OSはマルチユーザーのOSです。
マルチユーザーとは一台の携帯端末を複数のユーザーで切り替えて使うことです。
マルチユーザーについてまとめます。
目次
マルチユーザーとは
マルチユーザーとは一台の携帯端末を複数のユーザーで切り替えて使うことです。
例えば、家族で一台の携帯端末を共有するような使い方が可能です。
しかし、家族とはいっても、各々でプライバシーを確保したい内容はあります。
マルチユーザーではユーザ毎に全く独立した利用環境が提供されます。独立しているので、他のユーザから干渉を受けることもなければ、他のユーザーへ干渉することもありません。
ですから、各々のユーザーのプライバシーは守られるようになっています。
マルチユーザーのサポート
マルチユーザーのサポートは、メーカーがAndroid OSを携帯端末へ実装する時に決めるようです。
よって、すべての端末がサポートしているとは限りません。
手持ちの端末のサポート状況は次のようになっていました。
Device名 | API | マルチユーザー | 最大ユーザー数 |
---|---|---|---|
Emulator(AVD) | Api ≦ 23(Ver 6.0.x) | × | 1 |
Api >23(Ver 6.0.x) | ○ | 4 | |
Nexus 6P | 27(Ver 8.1) | ○ | 4 |
Nexus 5X | 27(Ver 8.1) | ○ | 4 |
FREETEL REI2 | 25(Ver 7.1.1) | ×(※1) | 4 |
Nexus 7 | 23(Ver 6.0.1) | ○ | 8 |
Huawei Y6 | 22(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 |
※最大ユーザ数 ≧ 管理者ユーザー数 + セカンダリユーザー数 |
ログインしているユーザーの種類により、各ユーザーに与える影響の範囲が異なります。
ユーザーの作成
新規ユーザーの作成(追加)は、所有者でログインして、設定アプリの「ユーザー管理」ページから行います。
ユーザーの編集
ユーザーの編集は、一般ユーザーまたは所有者ユーザーでログインして、設定アプリの「ユーザー管理」ページから行います。
ユーザーの切り替え
ユーザーの切り替えは、ステータスバー(スワイプして詳細を表示)より行います。
ユーザーの削除
ユーザーの削除は、所有者でログインして、設定アプリの「ユーザー管理」ページから行います。
ユーザーのストレージ
ユーザーが作成されると、User IDが割り振られ、そのID(番号)を名前にしたフォルダが作られます。
このフォルダがユーザーのデータを格納する領域です。
ユーザーが削除されると、User IDと共にこのフォルダーが削除されます。
ユーザーの削除によって使用済みとなったIDは欠番となり、ユーザの作成で割り振られるIDは新たな番号になります。
ちなみに、管理者(所有者)のIDは「0の固定」、セカンダリおよびゲストのIDは「10以上の連番」です。
UID(LinuxのUID)とUser ID
UIDの割り振り
アプリを端末へインストールするとアプリ毎にLinuxのUIDが割り振られます。
マルチユーザーのユーザー環境は独立しているため、複数のユーザーへ同じアプリをインストールしたとしても、個別のアプリとして扱われます。
ですので、同じアプリであったとしてもUser IDが違えば、UIDは異なった番号になります。
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 ID | UID / PER_USER_RANGE | 10 |
App ID | UID % 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}") }
関連記事: