توضِّح هذه الصفحة الجوانب المهمة لاختبار حسابات مستخدمين متعدّدين على منصّة Android. للحصول على معلومات عن تنفيذ ميزة "الوصول المتعدد للمستخدمين"، يُرجى الاطّلاع على مقالة إتاحة ميزة "الوصول المتعدد للمستخدمين".
مسارات الأجهزة
يسرد الجدول التالي العديد من مسارات الأجهزة وكيفية حلّها. جميع القيم في عمود المسار هي مساحة تخزين في مساحة مغلقة خاصة بالمستخدم. تغيّرت قصة مساحة التخزين في Android بمرور الوقت. يُرجى الاطّلاع على مستندات مساحة التخزين للحصول على مزيد من المعلومات.
المسار | مسار النظام (اختياري) | الغرض |
---|---|---|
/data/user/{userId}/{app.path}
|
/data/data
|
مساحة تخزين التطبيق |
/storage/emulated/{userId}
|
/sdcard
|
مساحة التخزين الداخلية المشتركة |
/data/media/{userId}
|
بلا | بيانات الوسائط الخاصة بالمستخدم (مثل الموسيقى والفيديوهات) |
/data/system/users/{userId}
|
بلا | إعدادات/حالة النظام لكل مستخدم
لا يمكن الوصول إليها إلا من خلال تطبيقات النظام |
في ما يلي مثال على استخدام مسار خاص بالمستخدم:
# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/
تفاعلات Adb على مستوى المستخدمين
يمكنك استخدام العديد من أوامر adb
المفيدة عند التعامل مع مستخدمين متعددين. لا تتوفّر بعض هذه الأوامر إلا في الإصدار 9 من نظام Android والإصدارات الأحدث:
adb shell am instrument --user <userId>
يُجري اختبارًا لأدوات القياس ضد مستخدم معيّن. يتم استخدام المستخدم الحالي تلقائيًا.adb install --user <userId>
يُثبِّت حزمة لمستخدم معيّن. لضمان تثبيت حزمة لجميع المستخدمين، يجب استدعاء هذه السلسلة من الخطوات لكل مستخدم.- يلغي
adb uninstall --user <userId>
تثبيت حزمة لمستخدم محدّد. يمكنك طلب الإجراء بدون العلامة--user
لإزالة التطبيق لجميع المستخدمين. - يحصل
adb shell am get-current-user
على رقم تعريف المستخدم الحالي (في المقدّمة). - تحصل
adb shell pm list users
على قائمة بجميع المستخدمين الحاليين. adb shell pm create-user
ينشئ مستخدمًا جديدًا، ويعرض رقم التعريف.- تزيل
adb shell pm remove-user
مستخدمًا معيّنًا حسب رقم التعريف. adb shell pm disable --user <userId>
يوقف حزمة لمستخدم معيّن.adb shell pm enable --user <userId>
تفعِّل حزمة لمستخدم معيّن.- يسرد
adb shell pm list packages --user <userId>
الحِزم (-e
للحِزم المفعَّلة، و-d
للإيقاف) لمستخدم معيّن. يتم تلقائيًا إدراج هذا الإعداد دائمًا لمستخدم النظام.
تساعد المعلومات التالية في توضيح سلوك adb
مع مستخدمين متعدّدين:
يتم دائمًا تشغيل
adb
(أو بشكل أدق الخادم الداعمadbd
) بصفتها مستخدِم النظام (معرّف المستخدِم = 0) بغض النظر عن المستخدِم الحالي. لذلك، يتم دائمًا تحليل مسارات الجهاز التي تعتمد على المستخدم (مثل/sdcard/
) على أنّها مستخدم النظام. اطّلِع على مسارات الجهاز للحصول على مزيد من التفاصيل.إذا لم يتم تحديد مستخدم تلقائي، سيكون لكل أمر فرعي من نوع
adb
مستخدم مختلف. من أفضل الممارسات استرداد رقم تعريف المستخدم باستخدامam get-current-user
ثم استخدام--user <userId>
بشكل صريح لأي أمر يتيح ذلك. لم تكن علامات المستخدِم الصريحة متاحة لجميع الأوامر حتى الإصدار 9 من Android.تم حظر الوصول إلى مسارات
/sdcard
للمستخدمين الثانويين اعتبارًا من الإصدار Android 9. اطّلِع على موفِّر المحتوى لبيانات المستخدمين المتعدّدين للحصول على تفاصيل عن كيفية استرجاع الملفات أثناء الاختبار.
موفّر المحتوى لبيانات عدّة مستخدمين
بما أنّ تطبيق adb
يعمل كمستخدم نظام ويتم وضع البيانات في بيئة معزولة في Android 9 والإصدارات الأحدث، عليك استخدام مقدّمي المحتوى لإرسال أي بيانات اختبار أو
جلبها من مستخدم غير تابع للنظام. ليس ذلك ضروريًا في الحالات التالية:
يعمل
adbd
كجذر (من خلالadb root
)، وهو أمر لا يمكن تنفيذه إلا باستخدام الإصدارينuserdebug
أوusereng
.إذا كنت تستخدم مكتبة Trade Federation (Tradefed)
ITestDevice
لإرسال الملفات أو جلبها، استخدِم مسارات/sdcard/
في ملف الاختبار الإعدادي (على سبيل المثال، اطّلِع على رمز المصدر لـpushFile
فيNativeDevice.java
).
عندما يكون مقدّم المحتوى قيد التشغيل في حساب المستخدم الثانوي، يمكنك الوصول إليه باستخدام
الأمر adb shell content
مع user
وuri
المناسبة وغيرها من المَعلمات المحدّدة.
حلّ بديل لمطوّري التطبيقات
يمكنك التفاعل مع الملفات الاختبارية باستخدام adb content
ومثيل
ContentProvider
،
بدلاً من الأمر push
أو pull
.
- يمكنك إنشاء مثيل من
ContentProvider
يستضيفه التطبيق والذي يمكنه عرض الملفات وتخزينها عند الحاجة. استخدام مساحة التخزين الداخلية للتطبيق - استخدِم الأمرَين
adb shell content
read
أوwrite
لدفع الملفات أو سحبها.
حلّ بديل لملفات الوسائط
لدفع ملفات الوسائط إلى قسم الوسائط في بطاقة SD، استخدِم MediaStore
واجهة برمجة التطبيقات العلنية. مثلاً:
# 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
تثبيت موفّر محتوى عام
ثبِّت مقدّم محتوى حاليًا واستخدِمه لقراءة الملفات وكتابتها في ملف /sdcard
الخاص بالمستخدم.
أنشئ TradefedContentProvider.apk
من المصدر باستخدام
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
```
دعم المستخدمين المتعددين في الاتحاد التجاري
Tradefed هو أداة اختبار تطبيقات Android الرسمية. يلخّص هذا القسم بعضًا من ميزات التكامل المضمّنة في Tradefed لسيناريوهات الاختبار المتعدّد المستخدمين.
أدوات التحقّق من الحالة
يتم تشغيل أدوات التحقّق من حالة النظام (SSC) قبل أدوات الإعداد المستهدفة، ويتم تشغيل عملية التنظيف بعد هذه الأدوات.
تم تحديد UserChecker
بوضوح لمساعدة المطوّرين عند اختبار مستخدمين متعدّدين. وتتتبّع هذه السمة
ما إذا كان الاختبار قد غيّر حالة المستخدمين على الجهاز (على سبيل المثال،
إنشاء مستخدمين بدون إزالتهم في عملية الإزالة). بالإضافة إلى ذلك، في حال ضبط السمة user-cleanup
، ستحاول إزالتها تلقائيًا بعد إجراء الاختبار مع تقديم أخطاء مفيدة لحلّ المشكلة.
<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
<option name="user-cleanup" value="true" />
</system_checker>
جهة إعداد التقارير المستهدَفة
يتم استخدام أدوات إعداد الاستهداف عادةً لإعداد جهاز باستخدام إعدادات معيّنة. في حال الاختبار المتعدّد المستخدمين، يمكن استخدام أدوات إعداد الاختبار لإنشاء مستخدمين من نوع معيّن بالإضافة إلى التبديل إلى مستخدمين آخرين.
بالنسبة إلى أنواع الأجهزة التي لا تتضمّن مستخدمًا ثانويًا، يمكنك استخدام
CreateUserPreparer
لإنشاء التبديل إلى مستخدم ثانوي في
AndroidTest.xml
. في نهاية الاختبار، تنتقل الأداة مرة أخرى
وتحذف المستخدم الثانوي.
<target_preparer
class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>
إذا كان نوع المستخدم الذي تريده متوفّرًا على الجهاز، استخدِم رمز
SwitchUserTargetPreparer
للتبديل إلى المستخدم الحالي. تشمل القيم الشائعة لسمة
user-type
system
أو secondary
.
<target_preparer
class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
<option name="user-type" value="secondary" />
</target_preparer>
الاختبارات التي يجريها المضيف
في بعض الحالات، يجب تبديل المستخدمين خلال الاختبار. تجنَّب
إجراء التبديل من داخل إطار عمل الاختبار على جهة الجهاز، مثل
UI Automator،
لأنّه قد يؤدي إلى إنهاء عملية الاختبار في أي وقت. بدلاً من ذلك، استخدِم إطار عمل اختبار من جهة المضيف، مثل إطار عمل الاختبار المستنِد إلى المضيف في Tradefed، والذي يتيح الوصول إلى ITestDevice
، ما يسمح لأي مستخدم بإجراء أي تعديلات مطلوبة.
استخدِم UserChecker
(الموضّحة في
أداة التحقّق من الحالة) مع الاختبارات التي نجريها من قِبل المضيف والتي تغيّر حالة المستخدم لأنّها تضمن إزالة الاختبار بشكل صحيح من بعده.