Birden fazla kullanıcıyı test etme

Bu sayfada, Android platformunda birden fazla kullanıcıyı test etmenin önemli yönleri açıklanmaktadır. Çok kullanıcılı destek uygulama hakkında bilgi edinmek için Birden fazla kullanıcıyı destekleme başlıklı makaleyi inceleyin.

Cihaz yolları

Aşağıdaki tabloda, cihaz yollarından bazıları ve bunların nasıl çözüldüğü listelenmiştir. Yol sütunundaki tüm değerler, kullanıcıya özel bir korumalı alan depolama alanıdır. Android'in depolama alanı ile ilgili yaklaşımı zaman içinde değişti. Daha fazla bilgi için Depolama belgelerini inceleyin.

Yol Sistem yolu (isteğe bağlı) Amaç
/data/user/{userId}/{app.path} /data/data Uygulama depolama alanı
/storage/emulated/{userId} /sdcard Dahili olarak paylaşılan depolama alanı
/data/media/{userId} yok Kullanıcı medya verileri (örneğin, müzik, videolar)
/data/system/users/{userId} yok Kullanıcı başına sistem yapılandırması/durumu

Yalnızca sistem uygulamaları tarafından erişilebilir

Kullanıcıya özel bir yol kullanma örneğini aşağıda bulabilirsiniz:

# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/

Kullanıcılar arasında adb etkileşimleri

Birden fazla kullanıcıyla çalışırken çeşitli adb komutlar yararlıdır. Bu komutlardan bazıları yalnızca Android 9 ve sonraki sürümlerde desteklenir:

  • adb shell am instrument --user <userId>, belirli bir kullanıcıya karşı bir araç testi çalıştırır. Bu işlev varsayılan olarak mevcut kullanıcıyı kullanır.
  • adb install --user <userId>, belirli bir kullanıcı için paket yükler. Bir paketin tüm kullanıcılara yüklendiğinden emin olmak için bu işlevi her kullanıcı için çağırmanız gerekir.
  • adb uninstall --user <userId>, belirli bir kullanıcının paketini kaldırır. Tüm kullanıcılar için kaldırmak üzere --user işareti olmadan çağrı yapın.
  • adb shell am get-current-user, geçerli (ön plandaki) kullanıcı kimliğini alır.
  • adb shell pm list users, mevcut tüm kullanıcıların listesini alır.
  • adb shell pm create-user yeni bir kullanıcı oluşturur ve kimliği döndürür.
  • adb shell pm remove-user, belirli bir kullanıcıyı kimliğe göre kaldırır.
  • adb shell pm disable --user <userId> belirli bir kullanıcı için paketi devre dışı bırakır.
  • adb shell pm enable --user <userId>, belirli bir kullanıcı için paketi etkinleştirir.
  • adb shell pm list packages --user <userId>, belirli bir kullanıcı için paketleri listeler (-e etkin, -d devre dışı). Varsayılan olarak bu her zaman sistem kullanıcısı için listelenir.

Aşağıdaki bilgiler, adb'nın birden fazla kullanıcıyla nasıl çalıştığını açıklamaya yardımcı olur:

  • adb (veya daha doğrusu adbd daemon) sistem kullanıcısı (kullanıcı kimliği = 0) olarak her zaman çalışır. Bu nedenle, kullanıcıya bağlı cihaz yolları (ör. /sdcard/) her zaman sistem kullanıcısı olarak çözümlenir. Daha fazla bilgi için Cihaz yolları başlıklı makaleyi inceleyin.

  • Varsayılan bir kullanıcı belirtilmezse her adb alt komutunun farklı bir kullanıcısı olur. En iyi uygulama, kullanıcı kimliğini am get-current-user ile almak ve ardından bunu destekleyen tüm komutlar için --user <userId>'yi açıkça kullanmaktır. Android 9'a kadar tüm komutlar için açık kullanıcı işaretleri desteklenmiyordu.

  • Android 9'dan itibaren ikincil kullanıcıların /sdcard yollarına erişimi reddedilir. Test sırasında dosyaların nasıl alınacağı hakkında ayrıntılı bilgi için Çok kullanıcılı veriler için içerik sağlayıcı başlıklı makaleyi inceleyin.

Çok kullanıcılı veriler için içerik sağlayıcı

adb, sistem kullanıcısı olarak çalıştığı ve veriler Android 9 ile sonraki sürümlerde korumalı alanda tutulduğu için sistem kullanıcısı olmayan bir kullanıcıdan test verilerini göndermek veya çekmek için içerik sağlayıcıları kullanmanız gerekir. Aşağıdaki durumlarda bu gerekli değildir:

  • adbd, yalnızca userdebug veya usereng derlemeleri kullanılarak mümkün olan bir şekilde kök olarak (adb root aracılığıyla) çalıştırılıyor.

  • Dosyaları göndermek veya çekmek için Trade Federation'ı (Tradefed) kullanıyorsunuz. ITestDevice Bu durumda, test yapılandırmanızda /sdcard/ yollarını kullanın (örneğin, NativeDevice.java içindeki pushFile için kaynak koduna bakın).

İçerik sağlayıcı ikincil kullanıcıda çalışırken uygun user, uri ve diğer parametreleri belirterek adb shell content komutunu kullanarak erişebilirsiniz.

Uygulama geliştiriciler için geçici çözüm

push veya pull komutu yerine adb content ve ContentProvider örneğini kullanarak test dosyalarıyla etkileşimde bulunun.

  1. Gerekli durumlarda dosya sunup depolayabilen, uygulama tarafından barındırılan bir ContentProvider örneği oluşturun. Uygulamanın dahili depolama alanını kullanma
  2. Dosyaları göndermek veya almak için adb shell content read veya write komutlarını kullanın.

Medya dosyaları için geçici çözüm

Medya dosyalarını SD kartın medya bölümüne aktarmak için MediaStore genel API'lerini kullanın. Örneğin:

# 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

Genel içerik sağlayıcı yükleme

Dosyaları kullanıcıya özel /sdcard yoluna okuyup yazan mevcut bir içerik sağlayıcıyı yükleyip kullanın.

make TradefedContentProvider kullanarak kaynaktan TradefedContentProvider.apk oluşturun:

```
# 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
```

Ticaret Federasyonu'nda çok kullanıcılı destek

Tradefed, resmi Android test bandıdır. Bu bölümde, Tradefed'in çok kullanıcılı test senaryoları için yerleşik desteğinin bir özeti verilmektedir.

Durum kontrolü araçları

Sistem durumu denetleyicileri (SSCs) hedef hazırlayıcılardan önce çalıştırılır ve temizleme işlemleri bu hazırlayıcılardan sonra çalıştırılır.

UserChecker Geliştiricilerin birden fazla kullanıcıyı test etmesine yardımcı olmak için açıkça tanımlanır. Testin, cihazdaki kullanıcıların durumunu değiştirip değiştirmediğini (ör. kullanıcıları kaldırarak değil, oluşturarak) izler. Ayrıca, user-cleanup ayarlanırsa testten sonra otomatik olarak temizlik yapmaya çalışır ve testin düzeltilebilmesi için faydalı hatalar sunmaya devam eder.

<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
    <option name="user-cleanup" value="true" />
</system_checker>

Hedef hazırlayıcı

Hedef hazırlayıcılar genellikle bir cihazı belirli bir yapılandırmayla ayarlamak için kullanılır. Çok kullanıcılı testlerde, hazırlayıcılar belirli bir türde kullanıcı oluşturmak ve diğer kullanıcılara geçmek için kullanılabilir.

İkincil kullanıcısı olmayan cihaz türlerinde, CreateUserPreparer kullanarak ikincil kullanıcı oluşturabilir ve bu kullanıcıya geçebilirsiniz.AndroidTest.xml Testin sonunda hazırlayan kişi geri döner ve ikincil kullanıcıyı siler.

<target_preparer
  class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>

İstediğiniz kullanıcı türü cihazda zaten varsa SwitchUserTargetPreparer simgesini kullanarak mevcut kullanıcıya geçin. user-type için yaygın değerler arasında system veya secondary yer alır.

<target_preparer
  class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
    <option name="user-type" value="secondary" />
</target_preparer>

Ana makine tarafından yönlendirilen testler

Bazı durumlarda, bir testin test içinde kullanıcı değiştirmesi gerekir. Test işlemi herhangi bir zamanda sonlandırılabilir. Bu nedenle, UI Automator gibi cihaz tarafı test çerçevesi içinden geçiş yapmayın. Bunun yerine, Tradefed'in Host-driven test framework'ü gibi ana makine tarafında bir test çerçevesi kullanın. Bu çerçeve, ITestDevice'e erişim sağlayarak gereken tüm kullanıcı manipülasyonlarına olanak tanır.

Kullanıcı durumunu değiştiren ana makine odaklı testler için UserChecker simgesini kullanın (Durum denetleyiciler bölümünde açıklanmıştır). Bu simge, testin kendisinden sonra düzgün bir şekilde temizlenmesini sağlar.