בדיקת מספר משתמשים

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

נתיבי מכשיר

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

נָתִיב נתיב מערכת (אופציונלי) מַטָרָה
/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 עבור disabled) עבור משתמש ספציפי. כברירת מחדל, זה תמיד מופיע עבור משתמש המערכת.

המידע הבא עוזר להסביר כיצד adb מתנהג עם מספר משתמשים:

  • adb (או ליתר דיוק ה- adbd daemon) פועל תמיד כמשתמש המערכת (זיהוי משתמש = 0) ללא קשר למשתמש הנוכחי . לכן נתיבים של מכשיר שהם תלויי משתמש (כגון /sdcard/ ) תמיד נפתרים כמשתמש המערכת. ראה נתיבי מכשיר לפרטים נוספים.

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

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

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

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

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

  • אתה משתמש ITestDevice של Trade Federation (של 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
```

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

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

בודק סטטוס

בודקי מצב מערכת (SSCs) מופעלים לפני מכיני היעד, והניקוי שלהם מופעל לאחר מכינים אלה.

UserChecker מוגדר במפורש כדי לסייע למפתחים בעת בדיקת מספר משתמשים. הוא עוקב אחר האם בדיקה שינתה את מצב המשתמשים במכשיר (לדוגמה, משתמשים שנוצרו מבלי להסיר אותם ב-teardown). בנוסף, אם 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 Test Framework של Tradefed, המעניקה גישה ל- ITestDevice , המאפשרת כל מניפולציה של משתמש הדרושה.

השתמש UserChecker (מתואר ב- Status checkers ) עבור בדיקות מונעות מארח שמשנות את מצב המשתמש מכיוון שהוא מבטיח שהבדיקה מתנקה כראוי אחרי עצמה.