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

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

  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
```

دعم ميزة "عدة مستخدمين" في 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 (الموضّح في أدوات التحقّق من الحالة) للاختبارات التي يديرها المضيف وتغيّر حالة المستخدم، لأنّها تضمن إزالة الاختبار بشكل صحيح بعد الانتهاء منه.