หน้านี้อธิบายแง่มุมที่สำคัญของการทดสอบผู้ใช้หลายรายใน แพลตฟอร์ม Android สำหรับข้อมูลเกี่ยวกับการใช้การสนับสนุนผู้ใช้หลายคน โปรดดูที่ การรองรับผู้ใช้หลายคน
เส้นทางอุปกรณ์
ตารางต่อไปนี้แสดงเส้นทางอุปกรณ์ต่างๆ และวิธีการแก้ไข ค่าทั้งหมดในคอลัมน์เส้นทางคือพื้นที่เก็บข้อมูลที่ใช้แซนด์บ็อกซ์เฉพาะผู้ใช้ เรื่องราวเกี่ยวกับพื้นที่เก็บข้อมูลของ Android มีการเปลี่ยนแปลงเมื่อเวลาผ่านไป อ่าน ดูข้อมูลเพิ่มเติมได้จากเอกสารประกอบของพื้นที่เก็บข้อมูล
เส้นทาง | เส้นทางระบบ (ไม่บังคับ) | วัตถุประสงค์ |
---|---|---|
/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
หลายคำสั่งมีประโยชน์เมื่อติดต่อกับผู้ใช้หลายคน บางส่วนของ
คำสั่งเหล่านี้ใช้ได้เฉพาะใน 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
(หรือถูกต้องกว่านั้น Daemon ของadbd
) จะทำงานเป็นระบบเสมอ user (รหัสผู้ใช้ = 0) ไม่ว่าผู้ใช้จะเป็นผู้ใช้ปัจจุบันหรือไม่ก็ตาม อุปกรณ์ ดังนั้น เส้นทางที่ผู้ใช้พึ่งพา (เช่น/sdcard/
) จะแปลงค่าเป็น ผู้ใช้ระบบ ดูรายละเอียดเพิ่มเติมได้ที่เส้นทางอุปกรณ์หากไม่ได้ระบุผู้ใช้เริ่มต้น คำสั่งย่อย
adb
แต่ละรายการจะมีผู้ใช้ต่างกัน แนวทางปฏิบัติแนะนำคือให้เรียกข้อมูล User-ID ด้วยam get-current-user
จากนั้น ใช้--user <userId>
อย่างชัดแจ้งสำหรับคำสั่งที่รองรับ อาจไม่เหมาะสม คำสั่งทั้งหมดไม่รองรับการแจ้งว่าผู้ใช้ไม่เหมาะสมจนกระทั่งเป็น Android 9การเข้าถึงเส้นทาง
/sdcard
ของผู้ใช้รองถูกปฏิเสธตั้งแต่วันที่ Android 9 โปรดดู ผู้ให้บริการเนื้อหาสำหรับข้อมูลผู้ใช้หลายรายสำหรับรายละเอียดเกี่ยวกับวิธี เพื่อเรียกดูไฟล์ระหว่างการทดสอบ
ผู้ให้บริการเนื้อหาสำหรับข้อมูลผู้ใช้หลายราย
เนื่องจาก adb
ทำงานในฐานะผู้ใช้ระบบ และข้อมูลของคุณจะอยู่ในแซนด์บ็อกซ์ใน Android 9 ขึ้นไป คุณจึงต้องใช้ผู้ให้บริการเนื้อหาเพื่อพุชหรือ
ดึงข้อมูลทดสอบจากผู้ใช้ที่ไม่ใช่ระบบ ซึ่งไม่จำเป็นในกรณีต่อไปนี้
adbd
ทำงานเป็นรูท (ผ่านadb root
) ซึ่งใช้ได้เฉพาะเมื่อใช้ บิลด์userdebug
หรือusereng
คุณกำลังใช้สหพันธ์การค้า (Tradefed's)
ITestDevice
เพื่อพุช/ดึงไฟล์ ซึ่งในกรณีนี้ใช้เส้นทาง/sdcard/
ในการทดสอบ (เช่น ดูซอร์สโค้ดของpushFile
ในNativeDevice.java
)
เมื่อผู้ให้บริการเนื้อหากำลังทำงานในผู้ใช้รอง คุณสามารถเข้าถึงผู้ให้บริการเนื้อหาได้โดย
โดยใช้คำสั่ง adb shell content
พร้อม user
, uri
และ
พารามิเตอร์อื่นๆ ที่ระบุ
วิธีแก้ปัญหาสำหรับนักพัฒนาแอป
โต้ตอบกับไฟล์ทดสอบโดยใช้ adb content
และอินสแตนซ์
ContentProvider
,
แทนคำสั่ง push
หรือ pull
- สร้างอินสแตนซ์ของ
ContentProvider
ที่โฮสต์โดยแอปที่แสดง/จัดเก็บไฟล์ได้ หากจำเป็น ใช้ที่จัดเก็บข้อมูลภายในของแอป - ใช้คำสั่ง
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
```
การสนับสนุนผู้ใช้หลายคนของสหพันธ์การค้า
แลกเปลี่ยน คือ โปรแกรมทดสอบของ 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 อัตโนมัติ
เนื่องจากขั้นตอนการทดสอบอาจถูกยกเลิกได้ทุกเมื่อ แต่ให้ใช้เฟรมเวิร์กการทดสอบฝั่งโฮสต์แทน เช่น
เฟรมเวิร์กการทดสอบที่ขับเคลื่อนด้วยโฮสต์
ซึ่งให้สิทธิ์เข้าถึง
ITestDevice
ทำให้ผู้ใช้สามารถชักจูงตามที่จำเป็นได้
ใช้ UserChecker
(ตามที่อธิบายไว้ใน
เครื่องมือตรวจสอบสถานะ) สำหรับการทดสอบที่ขับเคลื่อนโดยโฮสต์ซึ่งมีการเปลี่ยนแปลง
สถานะผู้ใช้ เนื่องจากช่วยให้มั่นใจว่าการทดสอบจะล้างข้อมูลออกได้อย่างถูกต้องหลังจากนั้น