Menguji Banyak Pengguna

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 daemon adbd ) 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 dengan am 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 (melalui adb root ), yang hanya dapat dilakukan menggunakan build userdebug atau usereng .

  • Anda menggunakan ITestDevice Federasi Dagang (Tradefed) untuk mendorong/menarik file, dalam hal ini gunakan jalur /sdcard/ dalam konfigurasi pengujian Anda (misalnya, lihat kode sumber untuk pushFile di NativeDevice.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 .

  1. Buat instance ContentProvider yang dihosting oleh aplikasi yang dapat menyajikan/menyimpan file jika diperlukan. Gunakan penyimpanan internal aplikasi.
  2. Gunakan perintah read atau write 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.