בדף הזה מתוארים היבטים חשובים של בדיקת משתמשים מרובים בפלטפורמת 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.החל מגרסה Android 9, לא ניתנת גישה לנתיבי
/sdcard
של משתמשים משניים. במאמר ספק תוכן לנתונים של משתמשים מרובים מוסבר איך לאחזר קבצים במהלך הבדיקה.
ספק תוכן לנתונים של כמה משתמשים
מכיוון ש-adb
פועל כמשתמש המערכת והנתונים נמצאים בארגז חול (sandboxing) ב-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
.
- יוצרים מכונה של
ContentProvider
שמתארח באפליקציה, שיכולה להציג ולשמור קבצים לפי הצורך. להשתמש באחסון הפנימי של האפליקציה. - משתמשים בפקודות
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
```
תמיכה בריבוי משתמשים באיחוד הסחר
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, כי תהליך הבדיקה יכול להיפסק בכל שלב. במקום זאת, כדאי להשתמש ב-framework של בדיקה בצד המארח, כמו framework של בדיקה מבוססת-מארח של TradeFederal, שמעניקה גישה ל-ITestDevice
, וכך מאפשרת לבצע מניפולציות על המשתמשים במקרה הצורך.
מומלץ להשתמש ב-UserChecker
(כפי שמתואר בקטע כלי לבדיקת סטטוס) לבדיקות שמנוהלות על ידי המארח ושמשנות את מצב המשתמש, כי כך אפשר לוודא שהבדיקה תנקה אחרי עצמה בצורה תקינה.