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

تصف هذه الصفحة الجوانب المهمة لاختبار العديد من المستخدمين على نظام 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 مفيدة عند التعامل مع عدة مستخدمين. بعض هذه الأوامر مدعومة فقط في نظام التشغيل Android 9 والإصدارات الأحدث:

  • يقوم 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> بشكل صريح لأي أمر يدعمه. لم تكن علامات المستخدم الصريحة مدعومة لجميع الأوامر حتى Android 9.

  • تم رفض الوصول إلى مسارات /sdcard للمستخدمين الثانويين بدءًا من Android 9. راجع موفر المحتوى للحصول على بيانات المستخدمين المتعددين للحصول على تفاصيل حول كيفية استرداد الملفات أثناء الاختبار.

مزود المحتوى لبيانات المستخدمين المتعددين

نظرًا لأن adb يعمل كمستخدم النظام وتكون البيانات في وضع الحماية في Android 9 والإصدارات الأحدث، فيجب عليك استخدام موفري المحتوى لدفع أو سحب أي بيانات اختبار من مستخدم غير نظام. هذا ليس ضروريا إذا:

  • يعمل adbd كجذر (من خلال adb root )، وهو أمر ممكن فقط باستخدام إصدارات userdebug أو usereng .

  • أنت تستخدم ITestDevice التابع للاتحاد التجاري (Tradefed's) لدفع/سحب الملفات، وفي هذه الحالة استخدم /sdcard/ المسارات في تكوين الاختبار الخاص بك (على سبيل المثال، راجع الكود المصدري لـ pushFile في NativeDevice.java ).

عند تشغيل موفر محتوى لدى المستخدم الثانوي، يمكنك الوصول إليه باستخدام أمر adb shell content مع تحديد user المناسب و uri والمعلمات الأخرى.

الحل البديل لمطوري التطبيقات

تفاعل مع ملفات الاختبار باستخدام adb content ومثيل ContentProvider ، بدلاً من أمر push أو pull .

  1. قم بإنشاء مثيل لـ ContentProvider يستضيفه التطبيق والذي يمكنه تقديم/تخزين الملفات عند الحاجة. استخدم وحدة التخزين الداخلية للتطبيق.
  2. استخدم أوامر read أو write adb shell content لدفع/سحب الملفات.

الحل البديل لملفات الوسائط

لدفع ملفات الوسائط إلى قسم الوسائط في بطاقة 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 لسيناريوهات اختبار المستخدمين المتعددين.

أجهزة فحص الحالة

يتم تشغيل مدققي حالة النظام (SSCs) قبل المعدين المستهدفين، ويتم تشغيل عملية التنظيف الخاصة بهم بعد هؤلاء المعدين.

يتم تعريف 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's Host-Driven Test Framework ، والذي يتيح الوصول إلى ITestDevice ، مما يسمح بأي معالجة مطلوبة من قبل المستخدم.

استخدم UserChecker (الموصوف في مدققات الحالة ) للاختبارات التي يحركها المضيف والتي تغير حالة المستخدم لأنها تضمن تنظيف الاختبار بشكل صحيح بعده.