Тестирование нескольких пользователей

На этой странице описаны важные аспекты тестирования нескольких пользователей на платформе Android. Сведения о реализации многопользовательской поддержки см. в разделе «Поддержка нескольких пользователей ».

Пути устройства

В следующей таблице перечислены некоторые пути к устройствам и способы их разрешения. Все значения в столбце «Путь» представляют собой изолированное хранилище для конкретного пользователя. История хранения данных в 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 получает текущий (на переднем плане) идентификатор пользователя.
  • adb shell pm list users получают список всех существующих пользователей.
  • adb shell pm create-user создает нового пользователя, возвращая его идентификатор.
  • adb shell pm remove-user удаляет конкретного пользователя по идентификатору.
  • adb shell pm disable --user <userId> отключает пакет для определенного пользователя.
  • adb shell pm enable --user <userId> включает пакет для конкретного пользователя.
  • adb shell pm list packages --user <userId> перечисляет пакеты ( -e для включенных, -d для отключенных) для конкретного пользователя. По умолчанию здесь всегда указывается системный пользователь.

Следующая информация помогает объяснить, как adb ведет себя с несколькими пользователями:

  • adb (или, точнее, демон adbd ) всегда запускается от имени системного пользователя (идентификатор пользователя = 0) , независимо от того, какой пользователь является текущим . Поэтому пути к устройствам, зависящие от пользователя (например, /sdcard/ ), всегда разрешаются как системный пользователь. Дополнительные сведения см. в разделе Пути к устройствам .

  • Если пользователь по умолчанию не указан, каждая подкоманда adb имеет другого пользователя. Лучше всего получить идентификатор пользователя с помощью am get-current-user , а затем явно использовать --user <userId> для любой команды, которая его поддерживает. Явные пользовательские флаги не поддерживались для всех команд до Android 9.

  • Доступ к путям /sdcard дополнительных пользователей запрещен, начиная с Android 9. Подробную информацию о том, как получить файлы во время тестирования, см. в разделе «Поставщик контента для многопользовательских данных» .

Поставщик контента для многопользовательских данных

Поскольку adb запускается от имени системного пользователя, а данные изолированы в Android 9 и более поздних версиях, вам необходимо использовать поставщиков контента для отправки или получения любых тестовых данных от несистемного пользователя. В этом нет необходимости, если:

  • adbd запускается от имени root (через adb root ), что возможно только с использованием сборок userdebug или usereng .

  • Вы используете ITestDevice Trade Federation (Tradefed) для отправки/извлечения файлов, и в этом случае используйте пути /sdcard/ в вашей тестовой конфигурации (например, см. исходный код pushFile в NativeDevice.java ).

Когда поставщик контента работает от вторичного пользователя, вы можете получить к нему доступ с помощью команды adb shell content с указанием соответствующего user , uri и других параметров.

Обходной путь для разработчиков приложений

Взаимодействуйте с тестовыми файлами, используя adb content и экземпляр ContentProvider вместо команд push или pull .

  1. Создайте экземпляр ContentProvider размещенный в приложении, который может обслуживать/хранить файлы там, где это необходимо. Используйте внутреннюю память приложения.
  2. Используйте команды read или write adb shell content для отправки/извлечения файлов.

Обходной путь для медиафайлов

Чтобы отправить мультимедийные файлы в медиа-раздел SD-карты, используйте общедоступные API 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 .

Создайте TradefedContentProvider.apk из исходного кода, используя make TradefedContentProvider .

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

Целевой составитель

Целевые подготовительные устройства обычно используются для настройки устройства с определенной конфигурацией. В случае многопользовательского тестирования средства подготовки могут использоваться для создания пользователей определенного типа, а также для переключения на других пользователей.

Для типов устройств, у которых нет вторичного пользователя, вы можете использовать CreateUserPreparer для создания вторичного пользователя и переключения на него в AndroidTest.xml . В конце теста составитель переключается обратно и удаляет вторичного пользователя.

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

Если нужный тип пользователя уже существует на устройстве, используйте SwitchUserTargetPreparer , чтобы переключиться на существующего пользователя. Общие значения user-type включают system или secondary .

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

Тесты, управляемые хостом

В некоторых случаях при тестировании необходимо переключать пользователей внутри теста . Не переключайтесь из среды тестирования на стороне устройства, такой как UI Automator , поскольку процесс тестирования может быть прерван в любой момент. Вместо этого используйте платформу тестирования на стороне хоста, такую ​​​​как Host-Driven Test Framework от Tradefed, которая предоставляет доступ к ITestDevice , позволяя выполнять любые необходимые пользовательские манипуляции.

Используйте UserChecker (описанный в разделе «Проверки состояния ») для управляемых хостом тестов, которые изменяют состояние пользователя, поскольку он гарантирует правильную очистку теста после себя.