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ı desteği uygulama hakkında bilgi edinmek için Birden çok kullanıcıyı destekleme başlıklı makaleyi inceleyin.

Cihaz yolları

Aşağıdaki tabloda, cihaz yollarından birkaçı ve bunların nasıl çözümlendiği listelenmektedir. Yol sütunundaki tüm değerler, kullanıcıya özel, korumalı alana alınmış bir depolama alanıdır. Android'in depolama alanı hikayesi zamanla değişti. şunu okuyun: Storage belgelerine göz atın.

Yol Sistem yolu (isteğe bağlı) Amaç
/data/user/{userId}/{app.path} /data/data Uygulama depolama alanı
/storage/emulated/{userId} /sdcard Paylaşılan dahili depolama
/data/media/{userId} yok Kullanıcı medya verileri (ör. 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ındaki adb etkileşimleri

Birden fazla kullanıcıyla çalışırken çeşitli adb komutları 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 araç testi çalıştırır. Varsayılan olarak, geçerli kullanıcı kullanılır.
  • adb install --user <userId>, belirli bir kullanıcı için bir paket yükler. Bir paketin tüm kullanıcılar için yüklenmesini sağlamak istiyorsanız bu işlevi her kullanıcı için çağırmanız gerekir.
  • adb uninstall --user <userId>, belirli bir kullanıcı için paketi kaldırır. Tüm kullanıcılar için yüklemeyi kaldırmak üzere --user işareti olmadan çağrı yapın.
  • adb shell am get-current-user, mevcut (ön plan) 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şturup kimliği döndürür.
  • adb shell pm remove-user, kimliğe göre belirli bir kullanıcıyı 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>, bir paketi belirli bir kullanıcı için etkinleştirir.
  • adb shell pm list packages --user <userId>, belirli bir kullanıcının paketlerini (etkin için -e, devre dışı için -d) listeler. Bu, varsayılan olarak her zaman sistem kullanıcısını listeler.

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

  • adb (veya daha doğrusu adbd daemon'ı) mevcut kullanıcıdan bağımsız olarak her zaman sistem kullanıcısı (kullanıcı kimliği = 0) olarak çalışır. Bu nedenle, kullanıcıya bağlı cihaz yolları (/sdcard/ gibi) her zaman sistem kullanıcısı olarak çözülür. Daha fazla ayrıntı için Cihaz yolları bölümüne bakın.

  • 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 açık kullanıcı işaretleri tüm komutlar için desteklenmiyordu.

  • Android 9'dan itibaren ikincil kullanıcıların /sdcard yollarına erişim 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 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 ve sonraki sürümlerde korumalı alanda bulunduğu için sistem kullanıcısı olmayan bir kullanıcıdan test verilerini göndermek veya almak için içerik sağlayıcıları kullanmanız gerekir. Aşağıdaki durumlarda bu işlem gerekmez:

  • adbd, yalnızcaadb root userdebug veya usereng derleme.

  • Ticari Federasyon (Ticaret Federasyonu) ITestDevice dosyaları aktarmak veya çekmek için test edin. Bu durumda, testinizde /sdcard/ yollarını kullanın (örneğin, pushFile için kaynak koduna bakın.) NativeDevice.java) dokunun.

Bir içerik sağlayıcı ikincil kullanıcıda çalışıyorsa ona adb shell content komutunu uygun user, uri ve belirtilen diğer parametreler.

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şime geçin.

  1. Uygulama tarafından barındırılan ve gerektiğinde dosya yayınlayıp depolayabilen bir ContentProvider örneği oluşturun. Uygulamanın dahili depolama alanını kullanın.
  2. Dosyaları aktarmak veya çekmek için adb shell content read ya da 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. Örnek:

# 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

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

TradefedContentProvider.apk öğesini şuradan derleyin: 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
```

Ticaret Federasyonu çok kullanıcılı desteği

Resmi şirket Tradefed'dir Android test bandı. Bu bölümde, Tradefed'in yerleşik olarak bulunan çok kullanıcılı test senaryoları için destek sağlar.

Durum kontrolörleri

Sistem durumu kontrolörleri (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, geliştiricilerin birden fazla kullanıcıyı test ederken yardımcı olması için açıkça tanımlanır. İzler Bir testin cihazdaki kullanıcıların durumunu değiştirip değiştirmediği (örneğin, kullanıcı oluşturma işlemi). Ayrıca, user-cleanup ayarlanmışsa testten sonra otomatik olarak temizlik yapmaya çalışır. testin düzeltilebilmesi için yararlı hatalar sunar.

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

Hedef hazırlayan

Hedef hazırlayıcılar genellikle belirli bir yapılandırma. Çok kullanıcılı testler söz konusu olduğunda, test hazırlayıcılar diğer kullanıcılara geçiş yapmayı öğretiyor.

İkincil kullanıcısı olmayan cihaz türleri için şunları kullanabilirsiniz: CreateUserPreparer oluşturmak için kullanıcı ve bu kullanıcıya geçiş yapın AndroidTest.xml. 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 simgesini kullanın. Şunun için ortak değerler: user-type, system veya secondary içerir.

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

Ana makineye dayalı testler

Bazı durumlarda, bir testin test içinde kullanıcıları değiştirmesi gerekir. Şunları Yapmayın: gibi bir cihaz tarafı test çerçevesinden (ör. Kullanıcı Arayüzü Otomatikleştirici, çünkü test süreci her an sonlandırılabilir. Bunun yerine, bir ana makine tarafı Tradefed'in Ana makineye dayalı testi gibi bir test çerçevesi çerçeve Bu da proje yaşam döngüsü ITestDevice, gerekli kullanıcı manipülasyonuna izin vererek.

UserChecker kullanın (şurada açıklanmıştır: Değişen ana makine tabanlı testler için durum denetleyicileri) temizlenmesini sağlar çünkü bu, testin kendisinden sonra düzgün bir şekilde temizlenmesini sağlar.