اختبار مستخدمين متعدّدين

توضِّح هذه الصفحة الجوانب المهمة لاختبار حسابات مستخدمين متعدّدين على منصّة 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.

  1. يمكنك إنشاء مثيل من ContentProvider يستضيفه التطبيق والذي يمكنه عرض الملفات وتخزينها عند الحاجة. استخدام مساحة التخزين الداخلية للتطبيق
  2. استخدِم الأمرَين 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 (الموضّحة في أداة التحقّق من الحالة) مع الاختبارات التي نجريها من قِبل المضيف والتي تغيّر حالة المستخدم لأنّها تضمن إزالة الاختبار بشكل صحيح من بعده.