Na tej stronie opisujemy ważne aspekty testowania na platformie Android z udziałem wielu użytkowników. Informacje o wdrażaniu 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 sposoby ich rozwiązywania. Wszystkie wartości w kolumnie Ścieżka to piaskownica pamięci masowej użytkownika. Sposób przechowywania danych na Androidzie zmieniał się z czasem. Więcej informacji znajdziesz w dokumentacji Pamięć.
Ścieżka | Ścieżka systemowa (opcjonalnie) | Cel |
---|---|---|
/data/user/{userId}/{app.path}
|
/data/data
|
Pamięć aplikacji |
/storage/emulated/{userId}
|
/sdcard
|
Wewnętrzna pamięć współdzielona |
/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 dostosowanej do 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 z reklamami między użytkownikami
Podczas pracy z wieloma użytkownikami przydatnych jest kilka poleceń adb
. Niektóre z tych poleceń są obsługiwane tylko na Androidzie 9 i nowszych:
adb shell am instrument --user <userId>
przeprowadza test z instrumentacją na konkretnym użytkowniku. Domyślnie używany jest bieżący użytkownik.adb install --user <userId>
instaluje pakiet dla konkretnego użytkownika. Aby mieć pewność, że pakiet zostanie zainstalowany dla wszystkich użytkowników, musisz wywołać tę funkcję w przypadku każdego z nich.adb uninstall --user <userId>
odinstalowuje pakiet dla konkretnego użytkownika. Wywołaj bez flagi--user
, aby odinstalować aplikację u wszystkich użytkowników.adb shell am get-current-user
pobiera identyfikator bieżącego użytkownika (na pierwszym planie).adb shell pm list users
otrzymuje listę wszystkich obecnych użytkowników.adb shell pm create-user
tworzy nowego użytkownika i zwraca jego identyfikator.adb shell pm remove-user
usuwa określonego 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 pakiety (-e
– włączone,-d
– wyłączone) dla konkretnego użytkownika. Domyślnie zawsze wyświetla listę użytkownika systemu.
Poniższe informacje pomogą Ci zrozumieć, jak adb
działa w przypadku wielu użytkowników:
adb
(a dokładniej demonadbd
) zawsze działa jako użytkownik systemowy (identyfikator użytkownika = 0) niezależnie od tego, który użytkownik jest aktualnie zalogowany. Ścieżki urządzeń zależne od użytkownika (np./sdcard/
) są zawsze rozpoznawane jako użytkownik systemu. Więcej informacji znajdziesz w sekcji Ścieżki urządzeń.Jeśli nie podasz domyślnego użytkownika, każdy podkomenda
adb
będzie miała innego użytkownika. Sprawdzoną metodą jest pobieranie identyfikatora użytkownika za pomocą funkcjiam get-current-user
, a następnie jawne używanie funkcji--user <userId>
w przypadku każdego polecenia, które ją obsługuje. Jawne flagi użytkownika nie były obsługiwane w przypadku wszystkich poleceń do Androida 9.Dostęp do ścieżek
/sdcard
użytkowników dodatkowych jest odmawiany od Androida 9. Szczegółowe informacje o tym, jak pobierać pliki podczas testowania, znajdziesz w artykule 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ą odizolowane w Androidzie 9 i nowszych wersjach, do przesyłania lub pobierania danych testowych od użytkownika innego niż systemowy musisz używać dostawców treści. Nie jest to konieczne, jeśli:
adbd
działa jako użytkownik root (za pomocąadb root
), co jest możliwe tylko w przypadku kompilacjiuserdebug
lubusereng
.Do przesyłania plików używasz Trade Federation (Tradefed)
ITestDevice
. W takim przypadku w konfiguracji testu używaj ścieżek/sdcard/
(np. zobacz kod źródłowypushFile
wNativeDevice.java
).
Gdy dostawca treści działa na koncie dodatkowego użytkownika, możesz uzyskać do niego dostęp za pomocą polecenia adb shell content
z odpowiednimi parametrami user
, uri
i innymi.
Obejście problemu dla deweloperów aplikacji
Do interakcji z plikami testowymi używaj adb content
i instancji ContentProvider
zamiast polecenia push
lub pull
.
- Utwórz instancję
ContentProvider
hostowaną przez aplikację, która może obsługiwać i przechowywać pliki w razie potrzeby. korzystać z pamięci wewnętrznej aplikacji; - Użyj poleceń
adb shell content
read
lubwrite
, aby wypchnąć lub pobrać pliki.
Obejście problemu z plikami multimedialnymi
Aby przesłać pliki multimedialne do partycji multimedialnej na karcie SD, użyj publicznych interfejsów API MediaStore
. Na 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
przypisanej do użytkownika.
Skompiluj bibliotekę 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 oficjalne jarzmo testowe Androida. W tej sekcji znajdziesz podsumowanie wbudowanej obsługi scenariuszy testów wielodostępnych w Tradefed.
Sprawdzanie stanu
Sprawdzanie stanu systemu jest przeprowadzane przed przygotowaniem miejsca docelowego, a czyszczenie jest przeprowadzane po przygotowaniu miejsca docelowego.
UserChecker
jest zdefiniowany w sposób jawny, aby ułatwić programistom testowanie wielu użytkowników. Śledzi, czy test zmienił stan użytkowników na urządzeniu (np. utworzył użytkowników bez usuwania ich w fazie końcowej). Jeśli ustawiona jest wartość user-cleanup
, po zakończeniu testu automatycznie następuje próba wyczyszczenia, ale nadal wyświetlane są przydatne błędy, dzięki czemu można naprawić test.
<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
<option name="user-cleanup" value="true" />
</system_checker>
Przygotowywanie danych docelowych
Przygotowywanie urządzeń docelowych służy zwykle do konfigurowania urządzenia w określony sposób. W przypadku testów z udziałem wielu użytkowników osoby przygotowujące mogą tworzyć użytkowników określonego typu, a także przełączać się na innych użytkowników.
W przypadku urządzeń, które nie mają użytkownika dodatkowego, możesz użyć CreateUserPreparer
, aby utworzyć użytkownika dodatkowego i przełączyć się na niego w AndroidTest.xml
. Po zakończeniu testu osoba przygotowująca wraca do poprzedniego użytkownika 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ć, jest już na urządzeniu, użyj SwitchUserTargetPreparer
, aby przełączyć się na istniejącego użytkownika. Typowe wartości w przypadku parametru 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ę w ramach platformy testowej po stronie urządzenia, np. UI Automator, ponieważ proces testowania może zostać w każdej chwili zakończony. Zamiast tego użyj platformy testowej po stronie hosta, takiej jak platforma testowa oparta na hoście Tradefed, która daje dostęp do ITestDevice
, co umożliwia dowolną manipulację użytkownika.
W przypadku testów sterowanych przez hosta, które zmieniają stan użytkownika, używaj UserChecker
(opisano w sekcji Sprawdzanie stanu), ponieważ zapewnia to prawidłowe czyszczenie po zakończeniu testu.