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ı 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
|
Paylaşılan dahili depolama alanı |
/data/media/{userId}
|
yok | Kullanıcı medya verileri (ör. müzik, video) |
/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ı 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 mevcut 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ının paketini kaldırır. Yüklemeyi tüm kullanıcılar için 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şturarak 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>
, belirli bir kullanıcı için bir paketi 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ğrusuadbd
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ı (ö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ğiniam get-current-user
ile almak ve ardından bunu destekleyen tüm komutlar için--user <userId>
'yi açıkça kullanmaktır. Uygunsuz kullanıcı işaretleri, Android 9'a kadar tüm komutlar için desteklenmemektedir.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ı bölümüne 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 test verilerini aktarmak veya almak için içerik sağlayıcıları kullanmanız gerekir. Aşağıdaki durumlarda bu işlem gerekmez:
adbd
, yalnızcauserdebug
veyausereng
derlemeleri kullanıldığında, kök olarak (adb root
aracılığıyla) çalışıyor.Dosyaları göndermek veya almak için Trade Federation'ın (Tradefed)
ITestDevice
sürümünü kullanıyorsanız test yapılandırmanızda/sdcard/
yollarını kullanın (örneğin,NativeDevice.java
içindekipushFile
için kaynak koda bakın).
İkincil kullanıcıda çalışan bir içerik sağlayıcıya, uygun user
, uri
ve diğer parametrelerle birlikte 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şime geçin.
- 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. - Dosyaları göndermek veya almak için
adb shell content
read
veyawrite
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
herkese açık 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.
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 çok kullanıcılı desteği
Tradefed, resmi Android test aracıdır. Bu bölümde, Tradefed'in çok kullanıcılı test senaryoları için yerleşik desteğinin bir kısmı özetlenmiştir.
Durum denetleyiciler
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. Bir testin, cihazdaki kullanıcıların durumunu değiştirip değiştirmediğini (örneğin, kullanıcıları ortadan kaldırarak kaldırmadan oluşturma) izler. Buna ek olarak, user-cleanup
ayarlanırsa otomatik olarak testten sonra temizlemeyi dener 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ırlayan
Hedef hazırlayıcılar genellikle bir cihazı belirli bir yapılandırmayla ayarlamak için kullanılır. Birden fazla kullanıcıyla test hazırlama işleminde, belirli bir türde kullanıcı oluşturmak ve diğer kullanıcılara geçmek için hazırlayıcılar kullanılabilir.
İkincil kullanıcısı olmayan cihaz türlerinde, AndroidTest.xml
'da ikincil kullanıcı oluşturmak ve bu kullanıcıya CreateUserPreparer
ile geçmek içinAndroidTest.xml
'ı kullanabilirsiniz. Hazırlayıcı, testin sonunda tekrar birincil kullanıcıya geçer 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 mevcut kullanıcıya geçiş yapmak için SwitchUserTargetPreparer
öğesini kullanın. user-type
için yaygın değerler system
veya secondary
'dir.
<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ıları değiştirmesi gerekir. Test işlemi herhangi bir zamanda sonlandırılabileceğinden, UI Automator gibi cihaz tarafında bir test çerçevesi içinden geçiş yapmayın. Bunun yerine, Tradefed'in ana makine tarafı test çerçevesi gibi bir ana makine tarafı test çerçevesi kullanın. Bu çerçeve, ITestDevice
'a erişim sağlar ve gerekli tüm kullanıcı manipülasyonlarını yapmanıza olanak tanır.
UserChecker
(Durum kontrolörleri bölümünde açıklanmıştır) kullanıcı durumunu değiştiren, barındırıcı tarafından yürütülen testler için kullanın. Bu, testin kendinden sonra düzgün bir şekilde temizlenmesini sağlar.