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