Halaman ini menjelaskan aspek penting dalam menguji beberapa pengguna di platform Android. Untuk informasi tentang cara menerapkan dukungan multi-pengguna, lihat Mendukung beberapa pengguna.
Jalur perangkat
Tabel berikut mencantumkan beberapa jalur perangkat dan cara me-resolve-nya. Semua nilai di kolom Path adalah penyimpanan dengan sandbox khusus pengguna. Kisah penyimpanan Android telah berubah dari waktu ke waktu; baca dokumentasi Penyimpanan untuk informasi selengkapnya.
Jalur | Jalur sistem (opsional) | Tujuan |
---|---|---|
/data/user/{userId}/{app.path}
|
/data/data
|
Penyimpanan aplikasi |
/storage/emulated/{userId}
|
/sdcard
|
Penyimpanan internal bersama |
/data/media/{userId}
|
none | Data media pengguna (misalnya, musik, video) |
/data/system/users/{userId}
|
none | Konfigurasi/status sistem per pengguna
Hanya dapat diakses oleh aplikasi sistem |
Berikut adalah contoh penggunaan jalur khusus pengguna:
# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/
interaksi adb di seluruh pengguna
Beberapa perintah adb
berguna saat menangani banyak pengguna. Beberapa
perintah ini hanya didukung di Android 9 dan
yang lebih baru:
adb shell am instrument --user <userId>
menjalankan uji instrumentasi terhadap pengguna tertentu. Secara default, ini menggunakan pengguna saat ini.adb install --user <userId>
akan menginstal paket untuk pengguna tertentu. Untuk memastikan paket diinstal untuk semua pengguna, Anda harus memanggilnya untuk setiap pengguna.adb uninstall --user <userId>
meng-uninstal paket untuk pengguna tertentu. Panggil tanpa tanda--user
untuk meng-uninstal bagi semua pengguna.adb shell am get-current-user
mendapatkan ID pengguna saat ini (latar depan).adb shell pm list users
mendapatkan daftar semua pengguna yang ada.adb shell pm create-user
membuat pengguna baru, yang menampilkan ID.adb shell pm remove-user
menghapus pengguna tertentu berdasarkan ID.adb shell pm disable --user <userId>
menonaktifkan paket untuk pengguna tertentu.adb shell pm enable --user <userId>
mengaktifkan paket untuk pengguna tertentu.adb shell pm list packages --user <userId>
mencantumkan paket (-e
untuk diaktifkan,-d
untuk dinonaktifkan) untuk pengguna tertentu. Secara default, ini selalu mencantumkan untuk pengguna sistem.
Informasi berikut membantu menjelaskan perilaku adb
dengan beberapa pengguna:
adb
(atau lebih tepatnya daemonadbd
) selalu berjalan sebagai pengguna sistem (ID pengguna = 0) terlepas dari pengguna mana yang saat ini. Oleh karena itu, jalur perangkat yang bergantung pada pengguna (seperti/sdcard/
) selalu di-resolve sebagai pengguna sistem. Lihat Jalur perangkat untuk mengetahui detail selengkapnya.Jika pengguna default tidak ditentukan, setiap subperintah
adb
akan memiliki pengguna yang berbeda. Praktik terbaiknya adalah mengambil ID pengguna denganam get-current-user
, lalu menggunakan--user <userId>
secara eksplisit untuk perintah apa pun yang mendukungnya. Flag pengguna eksplisit tidak didukung untuk semua perintah hingga Android 9.Akses ke jalur
/sdcard
pengguna sekunder ditolak mulai Android 9. Lihat Penyedia konten untuk data multi-pengguna untuk mengetahui detail tentang cara mengambil file selama pengujian.
Penyedia konten untuk data multi-pengguna
Karena adb
berjalan sebagai pengguna sistem dan data di-sandbox di Android 9 dan yang lebih baru, Anda harus menggunakan penyedia konten untuk mengirim atau
mengambil data pengujian dari pengguna nonsistem. Hal ini tidak diperlukan jika:
adbd
berjalan sebagai root (melaluiadb root
), yang hanya dapat dilakukan menggunakan builduserdebug
atauusereng
.Anda menggunakan
ITestDevice
Trade Federation (Tradefed) untuk mengirim atau mengambil file, dalam hal ini gunakan jalur/sdcard/
dalam konfigurasi pengujian Anda (misalnya, lihat kode sumber untukpushFile
diNativeDevice.java
).
Saat penyedia konten berjalan di pengguna sekunder, Anda dapat mengaksesnya dengan
menggunakan perintah adb shell content
dengan user
, uri
, dan
parameter lain yang sesuai yang ditentukan.
Solusi untuk developer aplikasi
Berinteraksi dengan file pengujian menggunakan adb content
dan instance
ContentProvider
,
bukan perintah push
atau pull
.
- Buat instance
ContentProvider
yang dihosting oleh aplikasi yang dapat menyalurkan dan menyimpan file jika diperlukan. Menggunakan penyimpanan internal aplikasi. - Gunakan perintah
adb shell content
read
atauwrite
untuk mengirim atau menarik file.
Solusi untuk file media
Untuk mengirim file media ke partisi media kartu SD, gunakan API publik
MediaStore
. Contoh:
# 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
Menginstal penyedia konten umum
Instal dan gunakan penyedia konten yang ada yang membaca dan menulis file ke
jalur /sdcard
khusus pengguna.
Build TradefedContentProvider.apk
dari sumber menggunakan
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
```
Dukungan multi-pengguna Trade Federation
Tradefed adalah harness pengujian Android resmi. Bagian ini merangkum beberapa dukungan bawaan Tradefed untuk skenario pengujian multi-pengguna.
Pemeriksa status
Pemeriksa status sistem (SSC) dijalankan sebelum penyiapan target, dan pembersihannya dijalankan setelah penyiapan tersebut.
UserChecker
ditentukan secara eksplisit untuk membantu developer saat menguji beberapa pengguna. Fitur ini melacak apakah pengujian telah mengubah status pengguna di perangkat (misalnya, membuat pengguna tanpa menghapusnya dalam pembongkaran). Selain itu, jika user-cleanup
ditetapkan, user-cleanup
akan otomatis mencoba membersihkan setelah pengujian, sekaligus
memberikan error yang berguna sehingga pengujian dapat diperbaiki.
<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
<option name="user-cleanup" value="true" />
</system_checker>
Penyiapan target
Penyiapan target biasanya digunakan untuk menyiapkan perangkat dengan konfigurasi tertentu. Dalam kasus pengujian multi-pengguna, pembuat persiapan dapat digunakan untuk membuat pengguna dari jenis tertentu serta beralih ke pengguna lain.
Untuk jenis perangkat yang tidak memiliki pengguna sekunder, Anda dapat menggunakan
CreateUserPreparer
untuk membuat dan beralih ke pengguna sekunder di
AndroidTest.xml
. Di akhir pengujian, pembuat persiapan beralih kembali dan
menghapus pengguna sekunder.
<target_preparer
class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>
Jika jenis pengguna yang Anda inginkan sudah ada di perangkat, gunakan
SwitchUserTargetPreparer
untuk beralih ke pengguna yang ada. Nilai umum untuk
user-type
mencakup system
atau secondary
.
<target_preparer
class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
<option name="user-type" value="secondary" />
</target_preparer>
Pengujian yang didorong host
Dalam beberapa kasus, pengujian perlu mengalihkan pengguna dalam pengujian. Jangan
beralih dari dalam framework pengujian sisi perangkat, seperti
UI Automator,
karena proses pengujian dapat dihentikan kapan saja. Sebagai gantinya, gunakan framework pengujian
sisi host seperti Framework pengujian
yang didorong host Tradefed,
yang memberikan akses ke
ITestDevice
,
sehingga memungkinkan manipulasi pengguna yang diperlukan.
Gunakan UserChecker
(dijelaskan di
Pemeriksa status) untuk pengujian berbasis host yang mengubah
status pengguna karena memastikan bahwa pengujian selesai dengan benar setelah pengujian itu sendiri.