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

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

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

בטבלה הבאה מפורטים כמה מנתיבי המכשירים והאופן שבו הם מזוהים. כל הערכים בעמודה Path הם אחסון בקונטיינר חול ספציפי למשתמש. האופן שבו מנוהל האחסון ב-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> מפעיל בדיקת מכשור למשתמש ספציפי. כברירת מחדל, המערכת תשתמש במשתמש הנוכחי.
  • 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 פועל בתור משתמש המערכת והנתונים מועברים לארגז חול ב-Android 9 ואילך, צריך להשתמש בספקי תוכן כדי לדחוף או למשוך נתוני בדיקה ממשתמש שאינו משתמש מערכת. לא צריך לעשות זאת אם:

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

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

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

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

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

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

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

כדי לדחוף קובצי מדיה למחיצת המדיה של כרטיס ה-SD, צריך להשתמש ב-MediaStore ציבורי ממשקי API. לדוגמה:

# 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
```

תמיכה במשתמשים מרובים של Federation (איחוד הסחר)

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

בודקי סטטוס

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