توضّح هذه الصفحة الجوانب المهمة لاختبار عدة مستخدمين على نظام 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.أنت تستخدم
ITestDeviceمن Trade Federation (Tradefed) لدفع الملفات أو سحبها، وفي هذه الحالة، استخدِم مسارات/sdcard/في إعدادات الاختبار (على سبيل المثال، اطّلِع على رمز المصدر الخاص بـpushFileفيNativeDevice.java).
عندما يكون موفّر المحتوى قيد التشغيل في حساب المستخدم الثانوي، يمكنك الوصول إليه باستخدام الأمر adb shell content مع تحديد user وuri والمعلَمات الأخرى المناسبة.
حل بديل لمطوّري التطبيقات
تفاعَل مع ملفات الاختبار باستخدام adb content ومثيل من
ContentProvider،
بدلاً من الأمر push أو pull.
- أنشِئ مثيلاً من
ContentProviderيستضيفه التطبيق ويمكنه عرض الملفات وتخزينها عند الحاجة. استخدام مساحة التخزين الداخلية للتطبيق - استخدِم الأمرَين
adb shell contentreadأو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
```
إتاحة استخدام Trade Federation لعدة مستخدمين
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 (الموضّح في
أدوات التحقّق من الحالة) للاختبارات التي يديرها المضيف وتغيّر حالة المستخدم، لأنّها تضمن إزالة الاختبار بشكل صحيح بعد الانتهاء منه.