Birden Fazla Kullanıcıyı Test Etme

Bu sayfada, Android platformunda birden fazla kullanıcıyı test etmenin önemli yönleri açıklanmaktadır. Çoklu kullanıcı desteğinin uygulanması hakkında bilgi için bkz. Birden Çok Kullanıcıyı Destekleme .

Cihaz yolları

Aşağıdaki tabloda birkaç aygıt yolu ve bunların nasıl çözümlendiği listelenmektedir. Yol sütunundaki tüm değerler, kullanıcıya özel korumalı alan depolama alanıdır. Android'in depolama öyküsü zamanla değişti; daha fazla bilgi için Depolama belgelerini okuyun.

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

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

Aşağıda kullanıcıya özel bir yol kullanmanın bir örneği verilmiştir:

# 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ındaki adb etkileşimleri

Birden fazla kullanıcıyla uğraşırken birkaç adb komutu faydalı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 enstrümantasyon testi çalıştırır. Varsayılan olarak bu, geçerli kullanıcıyı kullanır.
  • adb install --user <userId> belirli bir kullanıcı için bir paket yükler. Bir paketin tüm kullanıcılar için kurulduğunu garanti etmek amacıyla bunu her kullanıcı için çağırmanız gerekir.
  • adb uninstall --user <userId> belirli bir kullanıcı için bir paketi kaldırır. Tüm kullanıcılar için kaldırma işlemini --user bayrağı olmadan arayı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 bir listesini alır.
  • adb shell pm create-user kimliği döndürerek yeni bir kullanıcı oluşturur.
  • 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 bir paketi devre dışı bırakır.
  • adb shell pm enable --user <userId> belirli bir kullanıcı için bir paketi etkinleştirir.
  • adb shell pm list packages --user <userId> belirli bir kullanıcı için paketleri (etkin için -e , devre dışı için -d ) listeler. Varsayılan olarak bu her zaman sistem kullanıcısı için listelenir.

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

  • adb (veya daha doğrusu adbd arka plan programı), hangi kullanıcının geçerli olduğuna bakılmaksızın her zaman sistem kullanıcısı (kullanıcı kimliği = 0) olarak çalışır. Bu nedenle kullanıcıya bağlı aygıt yolları (örneğin /sdcard/ ) her zaman sistem kullanıcısı olarak çözümlenir. Daha fazla ayrıntı için Cihaz yolları konusuna bakın.

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

  • İkincil kullanıcıların /sdcard yollarına erişimi, Android 9'dan itibaren reddedilir. Test sırasında dosyaların nasıl alınacağıyla ilgili ayrıntılar için Çok kullanıcılı veriler için İçerik sağlayıcı'ya bakın.

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

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

  • adbd root olarak çalışıyor ( adb root aracılığıyla), bu yalnızca userdebug veya usereng yapıları kullanılarak mümkün.

  • Dosyaları itmek/çekmek için Ticaret Federasyonu'nun (Tradefed'in) ITestDevice kullanıyorsunuz; bu durumda test yapılandırmanızda /sdcard/ yollarını kullanın (örneğin, NativeDevice.java pushFile kaynak koduna bakın).

İkincil kullanıcıda bir içerik sağlayıcı çalışırken, uygun user , uri ve belirtilen diğer parametrelerle adb shell content komutunu kullanarak ona erişebilirsiniz.

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

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

  1. Gerektiğinde dosyaları sunabilecek/depolayabilecek, uygulama tarafından barındırılan bir ContentProvider örneği oluşturun. Uygulamanın dahili depolama alanını kullanın.
  2. Dosyaları itmek/çekmek 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 göndermek 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 bir içerik sağlayıcı yükleme

Dosyaları kullanıcıya özel /sdcard yoluna okuyan ve yazan mevcut bir içerik sağlayıcıyı kurun ve kullanın.

make TradefedContentProvider kullanarak kaynaktan TradefedContentProvider.apk dosyasını 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 çoklu kullanıcı desteği

Tradefed resmi Android test donanımıdır. Bu bölüm Tradefed'in çok kullanıcılı test senaryolarına yönelik yerleşik desteğinin bir kısmını özetlemektedir.

Durum denetleyicileri

Sistem durumu denetleyicileri (SSC'ler) 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 birden fazla kullanıcıyı test ederken geliştiricilere yardımcı olmak için açıkça tanımlanmıştır. Bir testin cihazdaki kullanıcıların durumunu değiştirip değiştirmediğini (örneğin, sökme işleminde kaldırmadan kullanıcılar oluşturup oluşturmadığını) izler. Ayrıca, user-cleanup ayarlanmışsa testten sonra otomatik olarak temizlemeye çalışır ve testin düzeltilebilmesi için yararlı hatalar sağlamaya 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 belirli bir konfigürasyona sahip bir cihazı kurmak için kullanılır. Çok kullanıcılı test durumunda, hazırlayıcılar belirli bir türde kullanıcılar oluşturmak ve diğer kullanıcılara geçiş yapmak için kullanılabilir.

İkincil kullanıcısı olmayan cihaz türleri için, AndroidTest.xml dosyasında ikincil bir kullanıcı oluşturmak ve bu kullanıcıya geçiş yapmak için CreateUserPreparer kullanabilirsiniz. Testin sonunda hazırlayıcı 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 mevcutsa mevcut kullanıcıya geçmek için SwitchUserTargetPreparer kullanın. user-type için ortak değerler arasında system veya secondary bulunur.

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

Ana bilgisayar odaklı testler

Bazı durumlarda testin, test içindeki kullanıcıları değiştirmesi gerekir. UI Automator gibi cihaz tarafı test çerçevesinden geçiş yapmayın çünkü test süreci herhangi bir zamanda sonlandırılabilir. Bunun yerine, Tradefed'in Host-Driven Test Framework gibi, ITestDevice erişim sağlayan ve ihtiyaç duyulan her türlü kullanıcı manipülasyonuna izin veren bir ana bilgisayar tarafı test çerçevesi kullanın.

Testin kendi kendine temizlenmesini sağladığı için kullanıcı durumunu değiştiren ana bilgisayar odaklı testler için UserChecker ( Durum denetleyicileri bölümünde açıklanmıştır) kullanın.