測試多個用戶

本頁介紹了在 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守護程式)始終以系統使用者(使用者 ID = 0)運行,無論目前是哪個使用者。因此,與使用者相關的設備路徑(例如/sdcard/ )始終解析為系統使用者。有關更多詳細信息,請參閱設備路徑

  • 如果未指定預設用戶,則每個adb子命令都有一個不同的用戶。最佳實踐是使用am get-current-user檢索使用者 ID,然後對支援它的任何命令明確使用--user <userId> 。在 Android 9 之前,所有指令均不支援顯式使用者標誌。

  • 從 Android 9 開始,輔助使用者存取/sdcard路徑被拒絕。有關如何在測試期間檢索文件的詳細信息,請參閱多用戶資料的內容提供者

多用戶資料的內容提供者

由於adb以系統使用者身分運行,且資料在 Android 9 及更高版本中被沙箱化,因此您必須使用內容提供者從非系統使用者推送或拉取任何測試資料。如果出現以下情況,則沒有必要:

  • adbd以 root 身分運作(透過adb root ),這只能使用userdebugusereng建置。

  • 您正在使用 Trade Federation 的 (Tradefed) ITestDevice來推送/拉取文件,在這種情況下,請在測試配置中使用/sdcard/路徑(例如,請參閱NativeDevice.java中的pushFile的源代碼)。

當內容提供者在輔助使用者中執行時,您可以使用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
```

貿易聯盟多用戶支持

Tradefed是官方 Android 測試工具。本節總結了 Tradefed 對多用戶測試場景的一些內建支援。

狀態檢查器

系統狀態檢查器 (SSC)在目標準備器之前運行,其清理在這些準備器之後運行。

UserChecker明確定義是為了幫助開發人員測試多個使用者。它會追蹤測試是否更改了設備上用戶的狀態(例如,創建用戶但未在拆卸時將其刪除)。此外,如果設定了user-cleanup ,它會在測試後自動嘗試清理,同時仍提供有用的錯誤,以便修復測試。

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

目標準備者

目標準備器通常用於設定具有特定配置的設備。在多用戶測試的情況下,準備器可用於建立特定類型的用戶以及切換到其他用戶。

對於沒有輔助使用者的裝置類型,您可以使用CreateUserPreparerAndroidTest.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 (在狀態檢查器中說明)進行更改使用者狀態的主機驅動測試,因為它可以確保測試自行正確清理。