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

На этой странице описываются важные аспекты тестирования нескольких пользователей на платформе 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 , поскольку процесс тестирования может быть прерван в любой момент. Вместо этого используйте платформу тестирования на стороне хоста, такую ​​​​как платформа тестирования на основе хоста Tradefed, которая предоставляет доступ к ITestDevice , позволяя выполнять любые необходимые пользовательские манипуляции.

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