На этой странице описываются важные аспекты тестирования нескольких пользователей на платформе 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
получает текущий (основной) идентификатор пользователя. -
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
.
- Создайте экземпляр
ContentProvider
, размещенный приложением, который может обслуживать и хранить файлы там, где это необходимо. Используйте внутреннее хранилище приложения. - Используйте команды
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
(описанный в разделе Средства проверки состояния ) для тестов, управляемых хостом, которые изменяют состояние пользователя, поскольку он гарантирует, что тест правильно очистит за собой данные.