Na tej stronie opisano ważne aspekty testowania wielu użytkowników na Platforma Androida. 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 sposobów ich rozwiązywania. Wszystkie wartości w kolumnie Ścieżka odnoszą się do miejsca na dane w piaskownicy zależnej od użytkownika. Sposób wykorzystania miejsca na dane w Androidzie zmienia się z czasem. przeczytaj Miejsce na dane.
Ścieżka | Ścieżka systemowa (opcjonalna) | Cel |
---|---|---|
/data/user/{userId}/{app.path}
|
/data/data
|
Pamięć aplikacji |
/storage/emulated/{userId}
|
/sdcard
|
Udostępniona pamięć wewnętrzna |
/data/media/{userId}
|
brak | dane multimedialne użytkownika (np. muzyka, filmy); |
/data/system/users/{userId}
|
brak | Konfiguracja/stan systemu na użytkownika
Dostępne tylko dla aplikacji systemowych |
Oto przykład użycia ścieżki dla konkretnego 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 ADB między użytkownikami
W przypadku kontaktu z wieloma użytkownikami przydaje się kilka poleceń adb
. Niektóre z tych poleceń są obsługiwane tylko w Androidzie 9 i nowszych:
adb shell am instrument --user <userId>
przeprowadza test z instrumentacją przeciwko konkretnemu użytkownikowi. Domyślnie jest używany bieżący użytkownik.adb install --user <userId>
instaluje pakiet dla konkretnego użytkownika. Aby mieć pewność, że pakiet jest zainstalowany dla wszystkich użytkowników, musisz wywołać tę funkcję dla każdego z nich.adb uninstall --user <userId>
odinstalowuje pakiet dla określonego użytkownika. Wywołaj bez flagi--user
, aby odinstalować aplikację dla wszystkich użytkowników.adb shell am get-current-user
pobiera identyfikator bieżącego (pierwszego) użytkownika.adb shell pm list users
pobiera listę wszystkich istniejących 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 w przypadku określonego użytkownika.adb shell pm enable --user <userId>
włącza pakiet dla określonego użytkownika.adb shell pm list packages --user <userId>
wyświetla listę pakietów (-e
dla włączona,-d
– wyłączona) dla określonego użytkownika. Domyślnie jest tak zawsze dla użytkownika systemowego.
Poniżej znajdziesz informacje o tym, jak działa adb
w przypadku wielu użytkowników:
adb
(a dokładniej demonadbd
) zawsze działa jako systemowy użytkownik (identyfikator użytkownika = 0) niezależnie od tego, który użytkownik jest bieżący. Dlatego urządzenie ścieżki zależne od użytkownika (takie jak/sdcard/
) zawsze są realizowane jako użytkownika systemu. Więcej informacji znajdziesz w sekcji Ścieżki urządzeń.Jeśli nie określisz domyślnego użytkownika, każda komenda podrzędna
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życie funkcji--user <userId>
w przypadku dowolnego polecenia, które ją obsługuje. Dopiero od Androida 9 flagi użytkownika nie były obsługiwane w przypadku wszystkich poleceń.Odmowa dostępu do
/sdcard
ścieżek użytkowników pomocniczych od Android 9. Szczegółowe informacje o pobieraniu plików podczas testowania znajdziesz w artykule Dane wielu użytkowników – dostawca treści.
Dostawca treści dla danych wielu użytkowników
Ponieważ w Androidzie 9 lub nowszym adb
działa jako użytkownik systemu, a dane znajdują się w piaskownicy, musisz korzystać z dostawców treści, aby przekazywać
pobrać żadnych danych testowych
od użytkownika niesystemowego. Nie jest to konieczne, jeśli:
Działanie
adbd
jest uruchomione jako użytkownik root (przezadb root
), co jest możliwe tylko przy użyciu Kompilacje:userdebug
lubusereng
.Używasz federacji handlowej (Tradefed's).
ITestDevice
aby je wypchnąć lub pobrać. W takim przypadku użyj w teście ścieżek/sdcard/
config (zobacz kod źródłowy elementupushFile
wNativeDevice.java
).
Gdy na koncie użytkownika dodatkowego działa dostawca treści, możesz uzyskać do niego dostęp przez
za pomocą polecenia adb shell content
z odpowiednimi elementami user
, uri
i
inne parametry.
Obejście dla deweloperów aplikacji
Wejdź w interakcję z plikami testowymi, używając funkcji adb content
i instancji
ContentProvider
zamiast polecenia push
lub pull
.
- Utwórz instancję
ContentProvider
hostowaną przez aplikację, która może udostępniać i przechowywać pliki w razie potrzeby. Użyj pamięci wewnętrznej aplikacji. - Użyj poleceń
adb shell content
read
lubwrite
, aby przesłać lub pobrać pliki.
Sposób obejścia problemu w przypadku plików multimedialnych
Aby przekazać pliki multimedialne na partycję multimediów na karcie SD, użyj publicznego MediaStore
API. 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żyj istniejącego dostawcy treści, który odczytuje i zapisze pliki na ścieżce /sdcard
określonej dla danego użytkownika.
Utwórz TradefedContentProvider.apk
na podstawie źródła za pomocą 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 przez federację handlową
Tradefed to oficjalne narzędzie do testowania Androida. W tej sekcji znajdziesz podsumowanie niektórych wbudowanych obsługę scenariuszy testowania z udziałem wielu użytkowników
Sprawdzanie stanu
Sprawdzający stan systemu (SSC) są wykonywane przed docelowymi modułami przygotowującymi, a ich czyszczenie jest wykonywane po tych modułach.
UserChecker
jest zdefiniowany w sposób jawny, aby ułatwić programistom testowanie z udziałem wielu użytkowników. Śledzi
czy test zmienił stan użytkowników na urządzeniu (np.
utworzonych użytkowników bez usuwania ich podczas demontażu). Ponadto, jeśli user-cleanup
jest skonfigurowany, po zakończeniu testu automatycznie podejmuje próbę wyczyszczenia,
podając przydatne błędy, które umożliwiają naprawienie testu.
<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
<option name="user-cleanup" value="true" />
</system_checker>
Przygotowujący cel
Przygotowanie do kierowania jest zwykle wykorzystywane do konfiguracji urządzenia konfiguracji. W przypadku testów z udziałem wielu użytkowników osoby przygotowujące mogą służyć do tworzenia użytkowników określonego typu oraz przełączania się między nimi.
W przypadku typów urządzeń, które nie mają drugiego użytkownika, możesz użyć CreateUserPreparer
, aby utworzyć i przełączyć się na drugiego użytkownika w AndroidTest.xml
. Po zakończeniu testu osoba przygotowująca dane przełącza się z powrotem i usuwa użytkownika dodatkowego.
<target_preparer
class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>
Jeśli wybrany typ użytkownika już istnieje na urządzeniu, kliknij SwitchUserTargetPreparer
, aby przełączyć się na tego użytkownika. Typowe wartości w polu 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łączyć użytkowników w ramach testu. Nie przełączaj się z ramy testowej po stronie urządzenia, takiej jak UI Automator, ponieważ proces testowania może zostać przerwany w dowolnym momencie. Zamiast tego użyj danych po stronie hosta
platformę testową, taką jak test oparty na hostowaniu firmy Tradefed
platformy,
który daje dostęp do
ITestDevice
,
co pozwala na dowolną manipulację.
Używaj UserChecker
(opisanego w funkcji sprawdzania stanu) w przypadku testów sterowanych przez hosta, które zmieniają stan użytkownika, ponieważ zapewnia to prawidłowe wyczyszczenie po teście.