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-userpobiera identyfikator bieżącego (pierwszoplanowego) użytkownika.adb shell pm list userspobiera listę wszystkich użytkowników.adb shell pm create-usertworzy nowego użytkownika i zwraca jego identyfikator.adb shell pm remove-userusuwa 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 (-edla włączonych,-ddla 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 demonadbd) 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
adbma innego użytkownika. Sprawdzoną metodą jest pobranie identyfikatora użytkownika za pomocą poleceniaam get-current-usera 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
/sdcarduż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:
adbddziała jako root (za pomocąadb root), co jest możliwe tylko w przypadku kompilacjiuserdebuglubusereng.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łowypushFilewNativeDevice.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,
.
- Utwórz instancję
ContentProviderhostowaną przez aplikację, która może obsługiwać i przechowywać pliki w razie potrzeby. Użyj pamięci wewnętrznej aplikacji. - Aby przesyłać i pobierać pliki, użyj poleceń
adb shell contentreadlubwrite.
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.