Halaman ini menjelaskan aspek penting dalam pengujian beberapa pengguna di platform Android. Untuk informasi tentang penerapan dukungan multi-pengguna, lihat Mendukung Banyak Pengguna .
Jalur perangkat
Tabel berikut mencantumkan beberapa jalur perangkat dan cara penyelesaiannya. Semua nilai di kolom Jalur adalah penyimpanan sandbox khusus pengguna. Kisah penyimpanan Android telah berubah seiring waktu; baca dokumentasi Penyimpanan untuk informasi lebih lanjut.
Jalur | Jalur sistem (opsional) | Tujuan |
---|---|---|
/data/user/{userId}/{app.path} | /data/data | Penyimpanan aplikasi |
/storage/emulated/{userId} | /sdcard | Penyimpanan internal bersama |
/data/media/{userId} | tidak ada | Data media pengguna (misalnya, musik, video) |
/data/system/users/{userId} | tidak ada | Konfigurasi/status sistem per pengguna Hanya dapat diakses oleh aplikasi sistem |
Berikut ini 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 antar pengguna
Beberapa perintah adb
berguna saat berhadapan dengan banyak pengguna. Beberapa perintah berikut hanya didukung di Android 9 dan lebih tinggi:
-
adb shell am instrument --user <userId>
menjalankan uji instrumentasi terhadap pengguna tertentu. Secara default ini menggunakan pengguna saat ini. -
adb install --user <userId>
menginstal paket untuk pengguna tertentu. Untuk menjamin bahwa suatu paket diinstal untuk semua pengguna, Anda harus memanggil ini untuk setiap pengguna. -
adb uninstall --user <userId>
menghapus instalasi paket untuk pengguna tertentu. Panggil tanpa tanda--user
untuk menghapus instalan semua pengguna. -
adb shell am get-current-user
mendapatkan ID pengguna (latar depan) saat ini. -
adb shell pm list users
mendapatkan daftar semua pengguna yang ada. -
adb shell pm create-user
membuat pengguna baru, mengembalikan 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 pengguna sistem.
Informasi berikut membantu menjelaskan bagaimana adb
berperilaku dengan banyak 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 diselesaikan sebagai pengguna sistem. Lihat Jalur perangkat untuk detail selengkapnya.Jika pengguna default tidak ditentukan, setiap subperintah
adb
memiliki pengguna yang berbeda. Praktik terbaiknya adalah mengambil ID pengguna denganam get-current-user
lalu secara eksplisit menggunakan--user <userId>
untuk perintah apa pun yang mendukungnya. Tanda 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 detail tentang cara mengambil file selama pengujian.
Penyedia konten untuk data multi-pengguna
Karena adb
berjalan sebagai pengguna sistem dan data dimasukkan ke dalam sandbox di Android 9 dan lebih tinggi, Anda harus menggunakan penyedia konten untuk mendorong atau menarik data pengujian apa pun dari pengguna nonsistem. Ini tidak diperlukan jika:
adbd
berjalan sebagai root (melaluiadb root
), yang hanya dapat dilakukan menggunakan builduserdebug
atauusereng
.Anda menggunakan
ITestDevice
Federasi Dagang (Tradefed) untuk mendorong/menarik file, dalam hal ini gunakan jalur/sdcard/
dalam konfigurasi pengujian Anda (misalnya, lihat kode sumber untukpushFile
diNativeDevice.java
).
Ketika 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 pengembang 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 menyajikan/menyimpan file jika diperlukan. Gunakan penyimpanan internal aplikasi. - Gunakan perintah
read
atauwrite
adb shell content
untuk mendorong/menarik file.
Solusi untuk file media
Untuk memasukkan file media ke partisi media kartu SD, gunakan API publik MediaStore
. Misalnya:
# 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 generik
Instal dan gunakan penyedia konten yang ada yang membaca dan menulis file ke jalur khusus pengguna /sdcard
.
Bangun 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 Federasi Perdagangan
Tradefed adalah alat uji Android resmi. Bagian ini merangkum beberapa dukungan bawaan Tradefed untuk skenario pengujian multi-pengguna.
Pemeriksa status
Pemeriksa status sistem (SSC) dijalankan sebelum pembuat target, dan pembersihannya dijalankan setelah pembuat target tersebut.
UserChecker
didefinisikan secara eksplisit untuk membantu pengembang saat menguji banyak pengguna. Ini melacak apakah pengujian telah mengubah status pengguna di perangkat (misalnya, membuat pengguna tanpa menghapusnya dalam pembongkaran). Selain itu, jika user-cleanup
diatur, maka secara otomatis akan mencoba membersihkan setelah pengujian, namun tetap memberikan kesalahan yang berguna sehingga pengujian dapat diperbaiki.
<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
<option name="user-cleanup" value="true" />
</system_checker>
Penyusun sasaran
Penyusun target biasanya digunakan untuk menyiapkan perangkat dengan konfigurasi tertentu. Dalam kasus persiapan pengujian multi-pengguna dapat digunakan untuk membuat pengguna dengan tipe 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 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 sudah 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>
Tes berbasis host
Dalam beberapa kasus, suatu pengujian perlu mengalihkan pengguna dalam pengujian tersebut . Jangan beralih dari dalam kerangka pengujian sisi perangkat, seperti UI Automator , karena proses pengujian dapat dihentikan kapan saja. Sebagai gantinya, gunakan kerangka pengujian sisi host seperti Kerangka Uji Berbasis Host Tradefed, yang memberikan akses ke ITestDevice
, memungkinkan manipulasi pengguna apa pun yang diperlukan.
Gunakan UserChecker
(dijelaskan dalam Pemeriksa status ) untuk pengujian berbasis host yang mengubah status pengguna karena hal ini memastikan bahwa pengujian tersebut dibersihkan dengan benar.