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

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

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

جدول زیر تعدادی از مسیرهای دستگاه و نحوه حل آنها را فهرست می کند. همه مقادیر موجود در ستون 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 انجام ندهید، زیرا فرآیند آزمایش می‌تواند در هر زمانی از بین برود. در عوض، از یک چارچوب تست سمت میزبان مانند چارچوب تست Host-driven Tradefed استفاده کنید، که به ITestDevice دسترسی می‌دهد و امکان دستکاری کاربر مورد نیاز را فراهم می‌کند.

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