توضِّح هذه الصفحة الجوانب المهمة لاختبار حسابات مستخدمين متعدّدين على منصّة 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
ITestDevice
من Trade Federation (Tradefed) لدفع الملفات أو سحبها، استخدِم مسارات/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
(الموضَّح في
أدوات التحقّق من الحالة) للاختبارات المستندة إلى المضيف التي تغيّر
حالة المستخدم، لأنّها تضمن إزالة الاختبار بشكل صحيح بعد الانتهاء.