Menguji beberapa pengguna

Laman ini menjelaskan aspek-aspek penting dari pengujian beberapa pengguna pada 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 jalur tersebut diselesaikan. Semua nilai di kolom Jalur adalah penyimpanan dengan sandbox khusus pengguna. Cerita penyimpanan Android telah berubah dari waktu ke waktu; baca dokumentasi Penyimpanan untuk mengetahui 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, pengguna saat ini akan digunakan.
  • 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 jika dinonaktifkan) untuk pengguna tertentu. Secara default, selalu daftar untuk pengguna sistem.

Informasi berikut membantu menjelaskan perilaku adb terhadap beberapa 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 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 dengan am get-current-user, lalu menggunakan --user <userId> secara eksplisit untuk perintah apa pun yang mendukungnya. Eksplisit pada Android 9 tidak didukung untuk semua perintah.

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

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

  1. Buat instance ContentProvider yang dihosting oleh aplikasi yang dapat menyalurkan dan menyimpan file jika diperlukan. Menggunakan penyimpanan internal aplikasi.
  2. Gunakan perintah adb shell content read atau write 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.

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 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 didefinisikan secara eksplisit untuk membantu developer saat menguji beberapa pengguna. 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>

Mempersiapkan target

Penyiapan target biasanya digunakan untuk menyiapkan perangkat dengan konfigurasi tertentu. Dalam kasus persiapan pengujian multi-pengguna 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. Larangan 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 berubah status pengguna karena memastikan bahwa pengujian dilakukan dengan benar setelah dirinya sendiri.