หน้านี้อธิบายประเด็นสำคัญของการทดสอบผู้ใช้หลายรายบนแพลตฟอร์ม 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
รับ ID ผู้ใช้ปัจจุบัน (เบื้องหน้า) -
adb shell pm list users
รับรายชื่อผู้ใช้ที่มีอยู่ทั้งหมด -
adb shell pm create-user
สร้างผู้ใช้ใหม่โดยส่งคืน ID -
adb shell pm remove-user
ลบผู้ใช้ที่ระบุด้วย ID -
adb shell pm disable --user <userId>
ปิดการใช้งานแพ็คเกจสำหรับผู้ใช้เฉพาะ -
adb shell pm enable --user <userId>
เปิดใช้งานแพ็คเกจสำหรับผู้ใช้เฉพาะ -
adb shell pm list packages --user <userId>
แสดงรายการแพ็คเกจ (-e
สำหรับเปิดใช้งาน-d
สำหรับปิดการใช้งาน) สำหรับผู้ใช้เฉพาะ ตามค่าเริ่มต้น รายการนี้จะแสดงรายการสำหรับผู้ใช้ระบบเสมอ
ข้อมูลต่อไปนี้ช่วยอธิบายว่า adb
มีพฤติกรรมอย่างไรกับผู้ใช้หลายคน:
adb
(หรือแม่นยำกว่าadbd
daemon) จะทำงานในฐานะ ผู้ใช้ระบบ เสมอ (ID ผู้ใช้ = 0) ไม่ว่าผู้ใช้คนใดจะเป็นปัจจุบัน ดังนั้นเส้นทางอุปกรณ์ที่ขึ้นอยู่กับผู้ใช้ (เช่น/sdcard/
) จะถูกแก้ไขในฐานะผู้ใช้ระบบเสมอ ดู เส้นทางอุปกรณ์ สำหรับรายละเอียดเพิ่มเติมหากไม่ได้ระบุผู้ใช้ดีฟอลต์ คำสั่งย่อย
adb
แต่ละคำสั่งจะมีผู้ใช้ที่แตกต่างกัน แนวทางปฏิบัติที่ดีที่สุดคือการดึงข้อมูล ID ผู้ใช้ด้วยam get-current-user
จากนั้นใช้--user <userId>
อย่างชัดเจนสำหรับคำสั่งใดๆ ที่รองรับ ไม่รองรับการตั้งค่าสถานะผู้ใช้ที่ชัดเจนสำหรับคำสั่งทั้งหมดจนกระทั่ง Android 9การเข้าถึงเส้นทาง
/sdcard
ของผู้ใช้รองถูกปฏิเสธโดยเริ่มตั้งแต่ Android 9 เป็นต้นไป ดู ผู้ให้บริการเนื้อหาสำหรับข้อมูลผู้ใช้หลายคน สำหรับรายละเอียดเกี่ยวกับวิธีการดึงไฟล์ระหว่างการทดสอบ
ผู้ให้บริการเนื้อหาสำหรับข้อมูลผู้ใช้หลายคน
เนื่องจาก adb
ทำงานในฐานะผู้ใช้ระบบและข้อมูลอยู่ในแซนด์บ็อกซ์ใน Android 9 ขึ้นไป คุณต้องใช้ผู้ให้บริการเนื้อหาเพื่อพุชหรือดึงข้อมูลทดสอบจากผู้ใช้ที่ไม่ใช่ระบบ สิ่งนี้ ไม่ จำเป็นหาก:
adbd
ทำงานในฐานะรูท (ผ่านadb root
) ซึ่งเป็นไปได้โดยใช้userdebug
หรือusereng
builds เท่านั้นคุณกำลังใช้
ITestDevice
ของ Trade Federation (Tradefed's) เพื่อพุช/ดึงไฟล์ ซึ่งในกรณีนี้ให้ใช้เส้นทาง/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
```
การสนับสนุนผู้ใช้หลายรายของสหพันธ์การค้า
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 เนื่องจากกระบวนการทดสอบอาจถูกหยุดทำงานเมื่อใดก็ได้ ให้ใช้เฟรมเวิร์กการทดสอบฝั่งโฮสต์แทน เช่น Host-Driven Test Framework ของ Tradefed ซึ่งให้สิทธิ์เข้าถึง ITestDevice
แทน ทำให้ผู้ใช้สามารถจัดการใดๆ ก็ตามที่จำเป็นได้
ใช้ UserChecker
(อธิบายไว้ใน Status checkers ) สำหรับการทดสอบที่ขับเคลื่อนด้วยโฮสต์ซึ่งเปลี่ยนสถานะผู้ใช้ เนื่องจากช่วยให้แน่ใจว่าการทดสอบจะล้างข้อมูลอย่างเหมาะสมหลังจากนั้น