Testowanie wielu użytkowników

Na tej stronie opisujemy ważne aspekty testowania wielu użytkowników na platformie Android. Więcej informacji o implementowaniu obsługi wielu użytkowników znajdziesz w artykule Obsługa wielu użytkowników.

Ścieżki urządzeń

W tabeli poniżej znajdziesz kilka ścieżek urządzeń i informacje o tym, jak są one rozwiązywane. Wszystkie wartości w kolumnie Ścieżka to piaskownica pamięci specyficzna dla użytkownika. Sposób przechowywania danych w Androidzie zmieniał się z czasem. Więcej informacji znajdziesz w dokumentacji dotyczącej pamięci.

Ścieżka Ścieżka systemowa (opcjonalnie) Cel
/data/user/{userId}/{app.path} /data/data Pamięć aplikacji
/storage/emulated/{userId} /sdcard Współdzielona pamięć wewnętrzna
/data/media/{userId} brak Dane multimedialne użytkownika (np. muzyka, filmy)
/data/system/users/{userId} brak Konfiguracja/stan systemu dla każdego użytkownika

Dostępne tylko dla aplikacji systemowych

Oto przykład użycia ścieżki specyficznej dla użytkownika:

# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/

Interakcje adb między użytkownikami

Podczas pracy z wieloma użytkownikami przydatnych jest kilka poleceń adb. Niektóre z tych poleceń są obsługiwane tylko w Androidzie 9 i nowszych wersjach:

  • adb shell am instrument --user <userId> uruchamia test z instrumentacją dla konkretnego użytkownika. Domyślnie używany jest bieżący użytkownik.
  • adb install --user <userId> instaluje pakiet dla konkretnego użytkownika. Aby pakiet został zainstalowany dla wszystkich użytkowników, musisz wywołać to polecenie dla każdego z nich.
  • adb uninstall --user <userId> odinstalowuje pakiet dla konkretnego użytkownika. Aby odinstalować pakiet dla wszystkich użytkowników, wywołaj to polecenie bez flagi --user.
  • adb shell am get-current-user pobiera identyfikator bieżącego (pierwszoplanowego) użytkownika.
  • adb shell pm list users pobiera listę wszystkich użytkowników.
  • adb shell pm create-user tworzy nowego użytkownika i zwraca jego identyfikator.
  • adb shell pm remove-user usuwa konkretnego użytkownika według identyfikatora.
  • adb shell pm disable --user <userId> wyłącza pakiet dla konkretnego użytkownika.
  • adb shell pm enable --user <userId> włącza pakiet dla konkretnego użytkownika.
  • adb shell pm list packages --user <userId> wyświetla listę pakietów (-e dla włączonych, -d dla wyłączonych) dla konkretnego użytkownika. Domyślnie zawsze wyświetla listę dla użytkownika systemu.

Poniższe informacje pomogą Ci zrozumieć, jak działa adb w przypadku wielu użytkowników:

  • adb (a dokładniej demon adbd) zawsze działa jako użytkownik systemu (identyfikator użytkownika = 0) niezależnie od tego, który użytkownik jest aktualnie aktywny. Dlatego ścieżki urządzeń, które są zależne od użytkownika (np. /sdcard/), zawsze są rozwiązywane jako użytkownik systemu. Więcej informacji znajdziesz w sekcji Ścieżki urządzeń.

  • Jeśli nie określono domyślnego użytkownika, każdy podpolecenie adb ma innego użytkownika. Sprawdzoną metodą jest pobranie identyfikatora użytkownika za pomocą polecenia am get-current-user a następnie użycie flagi --user <userId> w przypadku każdego polecenia, które ją obsługuje. Flagi użytkownika nie były obsługiwane we wszystkich poleceniach do Androida 9.

  • Od Androida 9 dostęp do ścieżek /sdcard użytkowników dodatkowych jest zabroniony. Więcej informacji o tym, jak pobierać pliki podczas testowania, znajdziesz w sekcji Dostawca treści dla danych wielu użytkowników.

Dostawca treści dla danych wielu użytkowników

Ponieważ adb działa jako użytkownik systemu, a dane są w Androidzie 9 i nowszych wersjach umieszczane w piaskownicy, musisz używać dostawców treści, aby przesyłać lub pobierać dane testowe od użytkownika innego niż systemowy. Nie jest to konieczne , jeśli:

  • adbd działa jako root (za pomocą adb root), co jest możliwe tylko w przypadku kompilacji userdebug lub usereng.

  • Do przesyłania i pobierania plików używasz Trade Federation (Tradefed) ITestDevice . W takim przypadku użyj w konfiguracji testu ścieżek /sdcard/ (na przykład zobacz kod źródłowy pushFile w NativeDevice.java).

Gdy dostawca treści działa na koncie użytkownika dodatkowego, możesz uzyskać do niego dostęp za pomocą polecenia adb shell content z odpowiednimi parametrami user, uri i innymi.

Obejście dla deweloperów aplikacji

Zamiast poleceń push i pull używaj do interakcji z plikami testowymi polecenia adb content i instancji ContentProvider, .

  1. Utwórz instancję ContentProvider hostowaną przez aplikację, która może obsługiwać i przechowywać pliki w razie potrzeby. Użyj pamięci wewnętrznej aplikacji.
  2. Aby przesyłać i pobierać pliki, użyj poleceń adb shell content read lub write.

Obejście w przypadku plików multimedialnych

Aby przesłać pliki multimedialne do partycji multimedialnej na karcie SD, użyj MediaStore publicznych interfejsów API. Przykład:

# 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

Instalowanie ogólnego dostawcy treści

Zainstaluj i używaj istniejącego dostawcy treści, który odczytuje i zapisuje pliki w ścieżce /sdcard specyficznej dla użytkownika.

Skompiluj TradefedContentProvider.apk ze źródła za pomocą polecenia 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
```

Obsługa wielu użytkowników w Trade Federation

Tradefed to oficjalny system testowania Androida. W tej sekcji podsumowujemy niektóre wbudowane funkcje Tradefed, które obsługują scenariusze testowania wielu użytkowników.

Sprawdzanie stanu

Sprawdzanie stanu systemu (SSC) jest przeprowadzane przed przygotowaniem docelowym, a jego czyszczenie – po tym przygotowaniu.

UserChecker jest zdefiniowany w sposób jawny, aby ułatwić deweloperom testowanie wielu użytkowników. Śledzi, czy test zmienił stan użytkowników na urządzeniu (np. utworzył użytkowników bez ich usunięcia podczas czyszczenia). Dodatkowo, jeśli ustawisz user-cleanup, automatycznie spróbuje zwolnić miejsce po zakończeniu testu, a jednocześnie będzie wyświetlać przydatne błędy, aby można było naprawić test.

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

Przygotowanie docelowe

Przygotowanie docelowe służy zwykle do konfigurowania urządzenia z określoną konfiguracją. W przypadku testowania wielu użytkowników można używać przygotowania do tworzenia użytkowników określonego typu oraz do przełączania się na innych użytkowników.

W przypadku typów urządzeń, które nie mają użytkownika dodatkowego, możesz użyć CreateUserPreparer, aby utworzyć użytkownika dodatkowego w AndroidTest.xml i przełączyć się na niego. Po zakończeniu testu przygotowanie przełącza się z powrotem i usuwa użytkownika dodatkowego.

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

Jeśli typ użytkownika, którego chcesz użyć, już istnieje na urządzeniu, użyj SwitchUserTargetPreparer, aby przełączyć się na istniejącego użytkownika. Typowe wartości user-type to system lub secondary.

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

Testy sterowane przez hosta

W niektórych przypadkach test musi przełączać użytkowników w ramach testu. Nie przełączaj się z poziomu platformy testowej po stronie urządzenia, np. UI Automator, ponieważ proces testowy może zostać w każdej chwili zakończony. Zamiast tego użyj platformy testowej po stronie hosta, np. platformy testowej sterowanej przez hosta w Tradefed, która zapewnia dostęp do ITestDevice, co umożliwia manipulowanie użytkownikami w dowolny sposób.

W przypadku testów sterowanych przez hosta, które zmieniają stan użytkownika, użyj UserChecker (opisanego w sekcji Sprawdzanie stanu), ponieważ zapewnia on, że test prawidłowo wyczyści dane po zakończeniu.