این صفحه جنبه های مهم آزمایش چندین کاربر را در پلتفرم اندروید توضیح می دهد. برای اطلاعات در مورد اجرای پشتیبانی چند کاربره، به پشتیبانی از چند کاربر مراجعه کنید.
مسیرهای دستگاه
جدول زیر تعدادی از مسیرهای دستگاه و نحوه حل آنها را فهرست می کند. همه مقادیر موجود در ستون 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
تعامل داشته باشید.
- نمونهای از
ContentProvider
ایجاد کنید که توسط برنامه میزبانی میشود که بتواند فایلها را در صورت نیاز ارائه و ذخیره کند. از حافظه داخلی برنامه استفاده کنید. - از دستورات
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 ) برای آزمایشهای مبتنی بر میزبان که وضعیت کاربر را تغییر میدهد استفاده کنید، زیرا تضمین میکند که تست به درستی پس از خود تمیز میشود.