בדיקה של כמה משתמשים

בדף הזה מתוארים היבטים חשובים של בדיקת כמה משתמשים בפלטפורמת Android. מידע על הטמעה של תמיכה בריבוי משתמשים זמין במאמר בנושא תמיכה בריבוי משתמשים.

נתיבי מכשירים

בטבלה הבאה מפורטים כמה מנתיבי המכשירים והאופן שבו הם נפתרים. כל הערכים בעמודה נתיב הם אחסון בסביבת ארגז חול שספציפי למשתמש. האופן שבו מתבצע האחסון ב-Android השתנה עם הזמן. מידע נוסף זמין במסמכי התיעוד בנושא אחסון.

נתיב נתיב מערכת (אופציונלי) מטרה
/data/user/{userId}/{app.path} /data/data אחסון של אפליקציות
/storage/emulated/{userId} /sdcard נפח אחסון פנימי משותף
/data/media/{userId} none נתוני מדיה של המשתמש (לדוגמה, מוזיקה, סרטונים)
/data/system/users/{userId} none הגדרת המערכת או המצב שלה לכל משתמש

אפשר לגשת אליהן רק דרך אפליקציות מערכת

דוגמה לשימוש בנתיב ספציפי למשתמש:

# 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> מריץ בדיקת מכשור (instrumentation) מול משתמש ספציפי. כברירת מחדל, המשתמש הנוכחי משמש להגדרה הזו.
  • 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 (או ליתר דיוק, תהליך הרקע adb) תמיד פועל כמשתמש מערכת (מזהה משתמש = 0) ללא קשר למשתמש הנוכחי.adbd לכן נתיבי מכשירים שתלויים במשתמש (כמו /sdcard/) תמיד נפתרים כמשתמש המערכת. פרטים נוספים זמינים במאמר בנושא נתיבי מכשירים.

  • אם לא מציינים משתמש ברירת מחדל, לכל פקודת משנה adb יש משתמש אחר. השיטה המומלצת היא לאחזר את מזהה המשתמש באמצעות am get-current-user ואז להשתמש במפורש ב---user <userId> לכל פקודה שתומכת בכך. עד Android 9, לא הייתה תמיכה בדגלים מפורשים של משתמשים בכל הפקודות.

  • הגישה ל-/sdcard נתיבים של משתמשים משניים נחסמת החל מ-Android 9. במאמר בנושא ספק תוכן לנתונים של כמה משתמשים מוסבר איך לאחזר קבצים במהלך הבדיקה.

ספק תוכן לנתונים של כמה משתמשים

מכיוון ש-adb פועל כמשתמש המערכת והנתונים נמצאים בארגז חול ב-Android 9 ומעלה, צריך להשתמש בספקי תוכן כדי לדחוף או למשוך נתוני בדיקה ממשתמש שאינו משתמש המערכת. לא צריך לעשות את זה אם:

  • adbd פועל כבסיס (דרך adb root), וזה אפשרי רק באמצעות גרסאות build של userdebug או usereng.

  • אתם משתמשים ב-Trade Federation ‏ (Tradefed) ITestDevice כדי להעלות או להוריד את הקבצים. במקרה כזה, צריך להשתמש בנתיבי /sdcard/ בקובץ ההגדרות של הבדיקה (לדוגמה, אפשר לעיין בקוד המקור של pushFile ב-NativeDevice.java).

כשספק תוכן פועל במשתמש המשני, אפשר לגשת אליו באמצעות הפקודה adb shell content עם הפרמטרים המתאימים user, uri ופרמטרים אחרים שצוינו.

פתרון עקיף למפתחי אפליקציות

כדי לבצע פעולות בקובצי בדיקה, משתמשים ב-adb content ובמופע של ContentProvider במקום בפקודה push או pull.

  1. יוצרים מופע של ContentProvider שמתארח באפליקציה ויכול להציג ולאחסן קבצים לפי הצורך. שימוש באחסון הפנימי של האפליקציה.
  2. משתמשים בפקודות adb shell content read או write כדי לשלוח או למשוך את הקבצים.

פתרון עקיף לקובצי מדיה

כדי להעביר קובצי מדיה למחיצת המדיה בכרטיס ה-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
```

תמיכה בריבוי משתמשים ב-Trade Federation

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 (כפי שמתואר בבודקי סטטוס) לבדיקות שמבוססות על המארח ומשנות את מצב המשתמש, כי כך אפשר לוודא שהבדיקה מנקה את עצמה כמו שצריך.