หน้านี้อธิบายแง่มุมที่สำคัญของการทดสอบผู้ใช้หลายรายใน แพลตฟอร์ม 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
(หรือที่ถูกต้องกว่าคือ daemonadbd
) จะทำงานเป็นผู้ใช้ ระบบ (รหัสผู้ใช้ = 0) เสมอ ไม่ว่าผู้ใช้ปัจจุบันจะเป็นใครก็ตาม ดังนั้น เส้นทางของอุปกรณ์ ที่ขึ้นอยู่กับผู้ใช้ (เช่น/sdcard/
) จะได้รับการแก้ไขเป็นผู้ใช้ระบบเสมอ ดูรายละเอียดเพิ่มเติมได้ที่เส้นทางของอุปกรณ์หากไม่ได้ระบุผู้ใช้เริ่มต้น แต่ละคำสั่งย่อย
adb
จะมีผู้ใช้ที่แตกต่างกัน แนวทางปฏิบัติแนะนำคือการดึงข้อมูลรหัสผู้ใช้ด้วยam get-current-user
จากนั้น ใช้--user <userId>
อย่างชัดเจนสำหรับคำสั่งที่รองรับ ระบบไม่รองรับการแจ้งผู้ใช้ที่โจ่งแจ้ง สำหรับคำสั่งบางอย่างจนกว่าจะถึง Android 9ระบบจะปฏิเสธการเข้าถึงเส้นทาง
/sdcard
ของผู้ใช้รองตั้งแต่ Android 9 เป็นต้นไป ดูรายละเอียดเกี่ยวกับวิธี ดึงข้อมูลไฟล์ระหว่างการทดสอบได้ที่ ผู้ให้บริการเนื้อหาสำหรับข้อมูลแบบหลายผู้ใช้
ผู้ให้บริการเนื้อหาสำหรับข้อมูลแบบหลายผู้ใช้
เนื่องจาก adb
ทำงานในฐานะผู้ใช้ระบบและข้อมูลจะอยู่ในแซนด์บ็อกซ์ใน Android 9 ขึ้นไป คุณจึงต้องใช้ Content Provider เพื่อพุชหรือดึงข้อมูลทดสอบจากผู้ใช้ที่ไม่ใช่ระบบ ไม่จำเป็นในกรณีต่อไปนี้
adbd
ทำงานในฐานะผู้ใช้ระดับราก (ผ่านadb root
) ซึ่งทำได้เฉพาะเมื่อใช้ บิลด์userdebug
หรือusereng
เท่านั้นคุณใช้ Trade Federation (Tradefed)
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
ติดตั้งผู้ให้บริการเนื้อหาทั่วไป
ติดตั้งและใช้ Content Provider ที่มีอยู่ซึ่งอ่านและเขียนไฟล์ไปยังเส้นทาง /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
เนื่องจากกระบวนการทดสอบอาจถูกหยุดได้ทุกเมื่อ ให้ใช้เฟรมเวิร์กการทดสอบฝั่งโฮสต์ เช่น เฟรมเวิร์กการทดสอบที่ขับเคลื่อนด้วยโฮสต์ของ Tradefed แทน
ซึ่งจะให้สิทธิ์เข้าถึง
ITestDevice
ทำให้สามารถจัดการผู้ใช้ได้ตามต้องการ
ใช้ UserChecker
(อธิบายไว้ในเครื่องมือตรวจสอบสถานะ) สำหรับการทดสอบที่โฮสต์เป็นผู้ดำเนินการซึ่งเปลี่ยนสถานะของผู้ใช้ เนื่องจากจะช่วยให้มั่นใจได้ว่าการทดสอบจะล้างข้อมูลของตัวเองอย่างถูกต้อง