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