ทดสอบผู้ใช้หลายคน

หน้านี้อธิบายแง่มุมที่สำคัญของการทดสอบผู้ใช้หลายรายใน แพลตฟอร์ม Android สำหรับข้อมูลเกี่ยวกับการใช้การสนับสนุนผู้ใช้หลายคน โปรดดูที่ รองรับผู้ใช้หลายคน

เส้นทางอุปกรณ์

ตารางต่อไปนี้แสดงเส้นทางของอุปกรณ์หลายเส้นทางและวิธีแก้ไข ค่าทั้งหมดในคอลัมน์เส้นทางคือพื้นที่เก็บข้อมูลที่ใช้แซนด์บ็อกซ์เฉพาะผู้ใช้ พื้นที่เก็บข้อมูลของ Android มีการเปลี่ยนแปลงไปในช่วงหลายปีที่ผ่านมา โปรดอ่านเอกสารประกอบเกี่ยวกับพื้นที่เก็บข้อมูลเพื่อดูข้อมูลเพิ่มเติม

เส้นทาง เส้นทางระบบ (ไม่บังคับ) วัตถุประสงค์
/data/user/{userId}/{app.path} /data/data พื้นที่เก็บข้อมูลแอป
/storage/emulated/{userId} /sdcard พื้นที่เก็บข้อมูลภายในที่ใช้ร่วมกัน
/data/media/{userId} none ข้อมูลสื่อของผู้ใช้ (เช่น เพลง วิดีโอ)
/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 (User ID = 0) ไม่ว่าผู้ใช้คนใดจะเป็นผู้ใช้ปัจจุบัน ดังนั้นเส้นทางของอุปกรณ์ที่ขึ้นอยู่กับผู้ใช้ (เช่น /sdcard/) จะได้รับการแก้ไขเป็นผู้ใช้ระบบเสมอ ดูรายละเอียดเพิ่มเติมได้ที่เส้นทางอุปกรณ์

  • หากไม่ได้ระบุผู้ใช้เริ่มต้น คำสั่งย่อย adb แต่ละรายการจะมีค่า ผู้ใช้ แนวทางปฏิบัติแนะนำคือให้เรียกข้อมูลรหัสผู้ใช้ด้วย am get-current-user จากนั้นจ่าย ใช้ --user <userId> อย่างชัดแจ้งสำหรับคำสั่งที่รองรับ ระบบไม่รองรับ Flag ผู้ใช้ที่ชัดเจนสำหรับคำสั่งบางรายการจนถึง 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

  1. สร้างอินสแตนซ์ของ ContentProvider ที่โฮสต์โดยแอปซึ่งสามารถแสดงและจัดเก็บไฟล์ได้หากจำเป็น ใช้ที่จัดเก็บข้อมูลภายในของแอป
  2. ใช้คำสั่ง 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
```

การรองรับผู้ใช้หลายคนของ Trade Federation

แลกเปลี่ยน คือ โปรแกรมทดสอบของ 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 อัตโนมัติ เนื่องจากขั้นตอนการทดสอบอาจถูกปิดได้ทุกเมื่อ แต่ให้ใช้เฟรมเวิร์กทดสอบฝั่งโฮสต์ เช่น เฟรมเวิร์กทดสอบที่ขับเคลื่อนโดยโฮสต์ของ Tradefed ซึ่งให้สิทธิ์เข้าถึง ITestDevice และช่วยให้ผู้ใช้ดําเนินการต่างๆ ได้

ใช้ UserChecker (อธิบายไว้ในเครื่องมือตรวจสอบสถานะ) สําหรับการทดสอบที่ดำเนินการโดยโฮสต์ซึ่งเปลี่ยนแปลงสถานะของผู้ใช้ เนื่องจากจะช่วยให้การทดสอบล้างข้อมูลหลังการดำเนินการอย่างถูกต้อง