測試多位使用者

本頁將說明,在單一應用程式中測試多位使用者 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>。煽情露骨內容 在 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 公開檔案 相互整合例如:

# 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
```

商業聯盟多使用者支援

Tradefed 是官方平台 Android 測試控管工具。本節概述 Tradefed 提供的部分內建支援 ,適合多使用者測試情境

狀態檢查工具

系統狀態檢查工具 (SSC) 是在目標準備工具「之前」執行,且其清理作業會在「之後」執行 這些專業人士

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

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

目標準備者

目標準備工具通常用於設定具有特定 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定如果是多使用者測試準備工具,則可用來建立 也可以切換到其他使用者

如果是沒有次要使用者的裝置類型,您可以使用 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 (說明如下: 狀態檢查工具),以處理變更的主機驅動測試 使用者狀態,因為這樣可以確保測試在本身後正確進行清理。