支援多位使用者

Android 會將使用者帳戶和應用程式資料分開,以便在單一 Android 裝置上支援多位使用者。舉例來說,家長可能會允許孩子使用家庭平板電腦、家庭可以共用汽車,或是緊急應變小組可能會共用行動裝置,以便值班。

術語

Android 會使用以下詞彙來說明 Android 使用者和帳戶。

一般

Android 裝置管理服務使用下列一般術語:

  • 使用者:每位使用者都由不同的自然人使用。每位使用者都有不同的應用程式資料和一些專屬設定,以及可明確切換使用者之間的使用者介面。當其他使用者處於活動狀態時,使用者可以執行背景作業;系統會在適當情況下管理關閉使用者,以節省資源。您可以直接透過使用者介面或裝置管理應用程式建立次要使用者。
  • 帳戶:帳戶包含在使用者中,但並非由使用者定義,使用者也未與任何特定帳戶連結。使用者和設定檔包含各自的專屬帳戶,但不一定要有帳戶才能運作。帳戶清單會因使用者而異。詳情請參閱 Account 類別定義。
  • 資料夾:資料夾會分隔應用程式資料,但會共用部分系統層級設定 (例如 Wi-Fi 和藍牙)。設定檔是使用者存在的子集,且與使用者存在狀態相關。使用者可以擁有多個設定檔。系統會透過 Device Administration 應用程式建立設定檔。設定檔一律會與父項使用者建立不可變更的關聯,這由建立設定檔的使用者定義。設定檔不會在建立使用者的生命週期結束後繼續存在。
  • 應用程式:每位相關聯使用者都會擁有應用程式的資料。應用程式資料會與同一使用者中的其他應用程式隔離。同一位使用者可透過 IPC 相互互動。詳情請參閱「Android for enterprise」。

使用者類別

Android 裝置管理服務會使用下列使用者類別。

  • 系統使用者:裝置中新增的第一位使用者。系統使用者無法移除,除非您將裝置恢復原廠設定,而且即使其他使用者處於前景,系統使用者仍會持續執行。這個使用者也擁有特殊權限,且只有這個使用者可以設定相關設定。
  • 無頭系統使用者:如果裝置已設定為在無頭系統使用者模式下執行 (透過設定 ro.fw.mu.headless_system_user=true),則系統會在裝置上新增第一個使用者。無頭系統使用者一律會在背景執行,因此這類裝置需要額外的前景使用者,才能啟用使用者互動功能。
  • 次要使用者:除了系統使用者以外,任何新增至裝置的使用者。次要使用者可以自行或由管理員移除,且不會影響裝置上的其他使用者。這些使用者可以在背景執行應用程式,並繼續保持網路連線。
  • 邀請對象使用者:臨時次要使用者。訪客使用者可在訪客帳戶失效後,快速刪除訪客帳戶。一次只能有一位訪客使用者。
  • 管理員使用者:擁有建立及移除其他使用者權限,以及控制某些一般多使用者設定的使用者。根據預設,只有系統使用者是管理員。

設定檔類別

Android 使用下列類別的設定檔:

  • 受管理的資料夾:由應用程式建立,用於包含工作資料和應用程式。這些設定檔由設定檔擁有者 (建立公司設定檔的應用程式) 專屬管理。啟動器、通知和近期工作會由父項使用者和公司設定檔共用。
  • 受限設定檔:使用家長使用者的帳戶,可控管受限設定檔可使用的應用程式。僅適用於平板電腦和電視裝置。
  • 複製設定檔:Android 支援建立個別的複製設定檔使用者類型,以便在裝置上執行單一應用程式的兩個例項。AOSP 不提供這項功能的端對端支援功能。原始設備製造商 (OEM) 需要新增自訂項目,才能為 Android 使用者提供完整功能。
  • 私人設定檔:這是與裝置其他部分分開的沙箱空間,可與主要使用者分開鎖定。私人設定檔只能由主要使用者建立。私人設定檔解鎖後,應用程式就會顯示在設定、ShareSheet、相片挑選工具和文件 UI 中,但鎖定時會隱藏應用程式。私人資料夾可與工作資料夾和複製的資料夾一同存在於同一部裝置上。

使用者類型

Android 11 將上述使用者和設定檔分類,並定義為明確的使用者類型,代表 Android 多用戶功能允許的所有不同類型的使用者和設定檔。

預先定義的 Android 開放原始碼計畫使用者類型已在 frameworks/base/core/java/android/os/UserManager.java 中定義,目前包括:

  • android.os.usertype.full.SYSTEM
  • android.os.usertype.full.SECONDARY
  • android.os.usertype.full.GUEST
  • android.os.usertype.full.DEMO
  • android.os.usertype.full.RESTRICTED
  • android.os.usertype.profile.MANAGED
  • android.os.usertype.system.HEADLESS
  • android.os.usertype.profile.CLONE
  • android.os.usertype.profile.PRIVATE

OEM 可以透過重疊 frameworks/base/core/res/res/xml/config_user_types.xml 檔案,設定這些使用者類型。這有助於變更每個使用者類型的預設設定,包括預設限制、圖示、徽章和允許的使用者人數上限。

除了可設定的 AOSP 使用者類型,原始設備製造商 (OEM) 也可以使用 frameworks/base/core/res/res/xml/config_user_types.xml 檔案定義新的設定檔類型。這樣一來,原始設備製造商 (OEM) 就能視需要導入自己的非管理設定檔類型。不過,OEM 有責任視需要修改平台,以支援這些變更,包括修改任何檢查受管理設定檔的程式碼,以便在適當情況下處理新設定檔類型。

啟用多使用者功能

多使用者功能預設為停用。如要啟用這項功能,裝置製造商必須定義資源疊加層,以取代 frameworks/base/core/res/res/values/config.xml 中的下列值:

<!--  Maximum number of supported users -->
<integer name="config_multiuserMaximumUsers">1</integer>
<!--  Whether Multiuser UI should be shown -->
<bool name="config_enableMultiUserUI">false</bool>

如要套用這項疊加層,並在裝置上啟用訪客和次要使用者,請使用 Android 建構系統的 DEVICE_PACKAGE_OVERLAYS 功能,取代下列項目的值:

  • config_multiuserMaximumUsers 的值大於 1
  • config_enableMultiUserUI (使用 true 付款)

裝置製造商可以決定使用者人數上限。如果裝置製造商或其他人修改了設定,則必須確保 SMS 和電話服務能按照 Android 相容性定義說明文件 (CDD) 的定義運作。

管理多位使用者

應用程式會透過程式輔助方式在 DevicePolicyManager 類別中叫用 API 來限制使用,藉此管理使用者和設定檔 (受限制的設定檔除外)。

企業可以使用上述類型,搭配 DevicePolicyManagerUserManager API,運用使用者和設定檔來管理裝置上的應用程式和資料的生命週期和範圍,進而打造專屬的解決方案,以符合其使用情境。

多位使用者系統行為

當使用者加入裝置後,如果其他使用者處於前景,某些功能就會受到限制。由於應用程式資料會依使用者而異,因此這些應用程式的狀態也會因使用者而異。舉例來說,如果電子郵件是寄給目前未聚焦的使用者帳戶,則必須等到該使用者和帳戶在裝置上啟用,才能使用。

注意:如要為次要使用者啟用或停用電話和簡訊功能,請依序前往「設定」>「使用者」,選取使用者,然後將「允許通話和簡訊」設定切換為關閉。

次要使用者在背景執行時,會受到一些限制。舉例來說,背景次要使用者無法顯示使用者介面或啟用藍牙服務。此外,如果裝置需要額外的記憶體來執行前景使用者的作業,系統程序會暫停背景次要使用者。

在 Android 裝置上使用多位使用者時,請注意下列行為:

  • 通知會一次顯示在單一使用者的所有帳戶中。
  • 其他使用者的通知會在啟用後才會顯示。
  • 每位使用者都會獲得一個工作區,用於安裝及放置應用程式。
  • 任何使用者都無法存取其他使用者的應用程式資料。
  • 任何使用者都能影響所有使用者安裝的應用程式。
  • 管理員使用者可以移除應用程式,甚至是次要使用者建立的整個工作區。
  • 根據預設,離開訪客模式時,訪客使用者工作階段中的資訊不會保留。如果您希望訪客使用者工作階段中的資訊持續存在,就必須建立資源覆蓋檔案,將 config_guestUserAllowEphemeralStateChange 設為 false。如要進一步瞭解如何建立疊加檔案,請參閱「使用資源疊加層自訂建構作業」。

Android Automotive 多使用者

Android Automotive 會利用 Android 的多使用者實作功能,提供共用裝置體驗。

汽車使用者類型

除了上述使用者類型外,汽車版本也適用於下列使用者類型:

  • 無頭系統使用者。系統使用者會代管所有系統服務。如要在 Automotive 上支援多位使用者,系統使用者也必須是無頭。只有一個無頭使用者。無頭系統使用者:
    • 必須一律在背景執行。
    • 使用者無法直接移除或存取,除非是裝置佈建作業。舉例來說,使用者無法切換至這個使用者類型,以執行下載應用程式或新增帳戶等工作。
    • 只能透過恢復原廠設定清除。
  • 一般使用者。與上述的次要使用者相同,但次要使用者:
    • 請勿在背景執行 (在切換至其他應用程式後)。
    • 可直接透過使用者介面建立。
    • 擁有獨立的應用程式資料,但共用部分系統層級設定。例如 Wi-Fi 和藍牙。

注意事項

以下例外狀況適用於 Automotive 中的無頭系統使用者和一般 (次要) 使用者:

  • 無頭系統使用者不支援工作資料夾。
  • 根據預設,一般 (次要) 使用者可完全存取電話和簡訊。
  • 根據預設,一般 (次要) 使用者不會在背景執行。

啟用無頭系統使用者

自 Android 10 起,多使用者功能可用於汽車用途。重要差異包括:

  • 系統使用者是無頭的,只會在背景執行。
  • 人類使用者不會與系統使用者互動。

如要啟用無頭系統使用者,裝置製造商必須按照上述方式啟用多用戶功能。

啟用無頭使用者後:
  1. 如要宣告裝置為 Automotive,請新增 android.hardware.type.automotive 功能。
  2. ro.fw.headless_system_user 設為 true
  3. config_multiuserMaximumUsers 的值設為 2 (或更高)。

詳情請參閱 Automotive 中的「多使用者支援」。

多個螢幕上的 Android Automotive 多使用者

Android 15 允許完整的次要使用者 (即「非」目前的前景使用者) 啟動活動,並取得指派給他們的螢幕畫面上的 UI 存取權。這項功能可讓 Android Automotive OS 中的多位使用者同時使用,以便在單一 Android 例項中為多位乘客提供專屬的使用者介面體驗。

如要啟用這項功能,裝置製造商必須定義資源疊加,以取代 frameworks/base/core/res/res/values/config.xml 中的下列值:

<!-- Whether the device allows full users to start in background visible on displays.
Should be false for most devices, except automotive vehicle with passenger displays.
Note: this flag does NOT control the Communal Profile, which is not a full user. -->

<bool name="config_multiuserVisibleBackgroundUsers">false></bool>

您可以啟用下列額外設定,測試僅乘客 (無駕駛者) 的體驗:

<!-- Whether the device allows users to start in background visible on the default display.
    Should be false for all devices in production. Can be enabled only for development use
    in passenger-only automotive build (i.e., when Android runs in a separate system in the
    back seat to manage the passenger displays).
    When set to true, config_multiuserVisibleBackgroundUsers must also be true. -->

<bool name="config_multiuserVisibleBackgroundUsersOnDefaultDisplay">false</bool>

在 Android 15 中,您也可以為多位乘客啟用車內體驗,讓他們以訪客使用者身分登入。如要啟用多位訪客使用者進行開發,裝置製造商必須定義資源重疊,在 frameworks/base/core/res/res/xml/config_user_types.xml 中設定允許的訪客使用者人數上限,例如下列範例:

<user-types>
   <full-type
       name="android.os.usertype.full.GUEST"
       max-allowed='4'>
       <default-restrictions no_factory_reset="true"
           no_remove_user="true"
           no_modify_accounts="true"
           no_install_apps="true"
           no_install_unknown_sources="true"
           no_uninstall_apps="true"/>
   </full-type>
</user-types>