測試多位使用者

本頁將說明,在單一應用程式中測試多位使用者 Android 平台如要瞭解如何實作多使用者支援功能,請參閱「支援多位使用者」。

裝置路徑

下表列出幾個裝置路徑,以及如何解決這些路徑。Path 欄中的所有值都是使用者專屬的沙箱儲存空間。 Android 的儲存空間功能隨著時間而變化,詳情請參閱「儲存空間」說明文件。

路徑 系統路徑 (選用) 目的
/data/user/{userId}/{app.path} /data/data 應用程式儲存空間
/storage/emulated/{userId} /sdcard 共用內部儲存空間
/data/media/{userId} 使用者媒體資料 (例如音樂、影片)
/data/system/users/{userId} 每位使用者的系統設定/狀態

僅供系統應用程式存取

以下是使用特定使用者路徑的範例:

# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/

所有使用者的 ADB 互動

在處理多位使用者時,您可以使用多個 adb 指令。部分指令僅適用於 Android 9 以上版本:

  • adb shell am instrument --user <userId> 會針對特定使用者執行檢測設備測試。根據預設,這會使用目前的使用者。
  • adb install --user <userId> 會為特定使用者安裝套件。目的地: 確保已為所有使用者安裝套件,因此務必呼叫 每位使用者都能使用
  • adb uninstall --user <userId> 會為特定使用者解除安裝套件。 呼叫不含 --user 旗標,為所有使用者解除安裝。
  • adb shell am get-current-user 會取得目前 (前景) 使用者 ID。
  • adb shell pm list users 會取得所有現有使用者的清單。
  • adb shell pm create-user 會建立新使用者,傳回 ID。
  • adb shell pm remove-user 會根據 ID 移除特定使用者。
  • adb shell pm disable --user <userId> 會為特定使用者停用套件。
  • adb shell pm enable --user <userId> 可為特定使用者啟用套件。
  • adb shell pm list packages --user <userId> 列出套裝方案 (-e 已為特定使用者啟用,-d 為停用狀態。根據預設,這個屬性一律為 建立系統使用者的清單

以下資訊有助於說明 adb 對多位使用者的行為:

  • adb (或更準確的 adbd Daemon) 一律會做為 系統執行 使用者 (使用者 ID = 0),不論目前是哪個使用者。因此,裝置 使用者相依的路徑 (例如 /sdcard/) 一律會解析為 系統使用者詳情請參閱「裝置路徑」一文。

  • 如果未指定預設使用者,每個 adb 子指令都會有不同的結果 內容。最佳做法是使用 am get-current-user 擷取使用者 ID,然後針對任何支援 --user <userId> 的指令,明確使用 --user <userId>。煽情露骨內容 在 Android 9 之前,所有指令都不支援使用者旗標。

  • 從以下時間開始,次要使用者的 /sdcard 路徑存取要求遭拒 Android 9.如要進一步瞭解如何在測試期間擷取檔案,請參閱「多用戶資料的內容供應器」。

多用戶資料的內容供應器

由於 adb 會以系統使用者的身分執行,且在 Android 9 以上版本中,資料會處於沙箱狀態,因此您必須使用內容提供者,才能從非系統使用者推送或提取任何測試資料。下列情況「不」必要:

  • adbd 是以根使用者的身分執行 (透過 adb root),這項操作只能使用 userdebugusereng 版本。

  • 您正在使用貿易聯盟 (Tradefed) ITestDevice 來推送或提取檔案,在此情況下,測試時請使用 /sdcard/ 路徑 設定 (例如,請參閱pushFile NativeDevice.java)。

在次要使用者中執行內容供應器時,您可以透過下列方式存取內容供應器: 使用 adb shell content 指令搭配適當的 useruri 和 其他參數

應用程式開發人員的解決方法

請使用 adb contentContentProvider 的例項,而非 pushpull 指令,與測試檔案互動。

  1. 建立應用程式代管的 ContentProvider 例項,以便在需要時提供及儲存檔案。使用應用程式的內部儲存空間。
  2. 使用 adb shell content readwrite 指令推送或提取檔案。

媒體檔案的解決方法

如要將媒體檔案推送至 SD 卡的媒體分區,請使用 MediaStore 公用 API。例如:

# push MVIMG_20190129_142956.jpg to /storage/emulated/10/Pictures
# step 1
$ adb shell content insert --user 10 --uri content://media/external/images/media/ --bind _display_name:s:foo.jpg

# step 2
$ adb shell content query --user 10 --projection _id --uri content://media/external/images/media/ --where "_display_name=\'foo.jpg\'"

# step 3
$ adb shell content write --user 10 --uri content://media/external/images/media/8022 < MVIMG_20190129_142956.jpg

安裝一般內容供應器

安裝並使用現有內容供應器,以便讀取檔案並將檔案寫入 使用者專屬的 /sdcard 路徑。

使用 make TradefedContentProvider 從來源建構 TradefedContentProvider.apk

```
# install content provider apk
$ adb install --user 10 -g TradefedContentProvider.apk

# pull some_file.txt
$ adb shell content read --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt > local_file.txt

# push local_file.txt
$ adb shell content write --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt < local_file.txt
```

Trade Federation 多使用者支援

Tradefed 是官方平台 Android 測試控管工具。本節會摘要說明「Tradefed」的部分內建 多使用者測試情境

狀態檢查器

系統狀態檢查器 (SSC) 會在目標準備工具執行,而清理作業則會在執行。

UserChecker 是明確定義,為協助開發人員測試多位使用者。追蹤 測試是否改變了裝置上的使用者狀態 (例如, 建立使用者,但未將對方移除)。此外,如果 user-cleanup 如果已設定,則在測試後會自動嘗試清除所用資源, 提供實用的錯誤,以便修正測試。

<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
    <option name="user-cleanup" value="true" />
</system_checker>

目標準備者

目標準備工具通常用於設定具有特定設定的裝置。在多使用者測試的情況下,準備工具可用於建立特定類型的使用者,以及切換至其他使用者。

如果是沒有次要使用者的裝置類型,您可以使用 CreateUserPreparer 會在以下位置建立並切換至次要使用者: AndroidTest.xml。測試結束時,準備工具會切換回去,並 刪除次要使用者。

<target_preparer
  class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>

如果裝置上已有您想要的使用者類型,請使用 請SwitchUserTargetPreparer切換為現有使用者。下列項目的常見值 user-type包括 systemsecondary

<target_preparer
  class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
    <option name="user-type" value="secondary" />
</target_preparer>

主機驅動測試

在某些情況下,測試必須在測試中切換使用者。請勿在裝置端測試架構 (例如 UI Automator) 中進行切換,因為測試程序隨時可能會遭到終止。請改用主機端 測試架構,例如 Tradefed 的主機導向測試 架構 這樣就能 ITestDevice, 讓任何必要的使用者操作

使用UserChecker (說明如下: 狀態檢查工具),以處理變更的主機驅動測試 使用者狀態,因為這樣可以確保測試在本身後正確進行清理。