تست چندین کاربر

این صفحه جنبه های مهم آزمایش چندین کاربر را در پلتفرم اندروید توضیح می دهد. برای اطلاعات در مورد اجرای پشتیبانی چند کاربره، به پشتیبانی از چند کاربر مراجعه کنید.

مسیرهای دستگاه

جدول زیر تعدادی از مسیرهای دستگاه و نحوه حل آنها را فهرست می کند. همه مقادیر موجود در ستون Path یک ذخیره‌سازی جعبه ایمنی مخصوص کاربر هستند. داستان ذخیره سازی اندروید در طول زمان تغییر کرده است. برای اطلاعات بیشتر اسناد ذخیره سازی را بخوانید.

مسیر مسیر سیستم (اختیاری) هدف
/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 و بالاتر پشتیبانی می شوند:

  • 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 به‌عنوان کاربر سیستم اجرا می‌شود و داده‌ها در اندروید 9 و بالاتر در جعبه ایمنی قرار می‌گیرند، باید از ارائه‌دهندگان محتوا برای فشار دادن یا برداشتن داده‌های آزمایشی از یک کاربر غیر سیستمی استفاده کنید. این لازم نیست اگر:

  • adbd به صورت روت (از طریق adb root ) اجرا می شود، که فقط با استفاده از userdebug یا usereng Builds امکان پذیر است.

  • شما از ITestDevice فدراسیون تجارت (Tradefed) برای فشار دادن/کشیدن فایل ها استفاده می کنید، در این صورت از مسیرهای /sdcard/ در پیکربندی آزمایشی خود استفاده کنید (به عنوان مثال، کد منبع pushFile را در NativeDevice.java ببینید).

هنگامی که یک ارائه دهنده محتوا در کاربر ثانویه اجرا می شود، می توانید با استفاده از دستور adb shell content با user مناسب، uri و سایر پارامترهای مشخص شده به آن دسترسی داشته باشید.

راه حل برای توسعه دهندگان برنامه

با فایل های آزمایشی با استفاده از adb content و نمونه ای از ContentProvider ، به جای دستور push یا pull ، تعامل داشته باشید.

  1. نمونه‌ای از ContentProvider ایجاد کنید که توسط برنامه میزبانی شده است که می‌تواند فایل‌ها را در صورت نیاز ارائه/ذخیره کند. از حافظه داخلی برنامه استفاده کنید.
  2. از دستورات read یا write adb shell content برای فشار دادن/کشیدن فایل ها استفاده کنید.

راه حل برای فایل های رسانه ای

برای فشار دادن فایل های رسانه ای به پارتیشن رسانه ای کارت SD، از API های عمومی 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 مهار رسمی تست اندروید است. این بخش برخی از پشتیبانی های داخلی 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's Host-Driven Test Framework استفاده کنید، که به ITestDevice دسترسی می دهد و امکان دستکاری کاربر مورد نیاز را فراهم می کند.

از UserChecker (شرح شده در Status Checkers ) برای آزمایش‌های مبتنی بر میزبان که وضعیت کاربر را تغییر می‌دهد استفاده کنید، زیرا تضمین می‌کند که تست به درستی پس از خود تمیز می‌شود.