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

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

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

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

เส้นทาง เส้นทางของระบบ (ไม่บังคับ) วัตถุประสงค์
/data/user/{userId}/{app.path} /data/data พื้นที่เก็บข้อมูลแอป
/storage/emulated/{userId} /sdcard พื้นที่เก็บข้อมูลภายในที่ใช้ร่วมกัน
/data/media/{userId} none ข้อมูลสื่อของผู้ใช้ (เช่น เพลง วิดีโอ)
/data/system/users/{userId} none การกําหนดค่า/สถานะของระบบต่อผู้ใช้

เข้าถึงได้เฉพาะโดยแอประบบ

ตัวอย่างการใช้เส้นทางเฉพาะผู้ใช้มีดังนี้

# 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> ถอนการติดตั้งแพ็กเกจสำหรับผู้ใช้ที่เฉพาะเจาะจง เรียกใช้โดยไม่มี Flag --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) จะทำงานในฐานะผู้ใช้ระบบ (รหัสผู้ใช้ = 0) เสมอ ไม่ว่าจะมีผู้ใช้รายใดอยู่ในปัจจุบัน ดังนั้นเส้นทางของอุปกรณ์ที่ขึ้นอยู่กับผู้ใช้ (เช่น /sdcard/) จะได้รับการแก้ไขเป็นผู้ใช้ระบบเสมอ ดูรายละเอียดเพิ่มเติมได้ที่เส้นทางอุปกรณ์

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

  • ระบบจะปฏิเสธการเข้าถึงเส้นทาง /sdcard ของผู้ใช้รองตั้งแต่ Android 9 เป็นต้นไป ดูรายละเอียดเกี่ยวกับวิธีเรียกข้อมูลไฟล์ระหว่างการทดสอบได้ที่ผู้ให้บริการเนื้อหาสำหรับข้อมูลผู้ใช้หลายคน

ผู้ให้บริการเนื้อหาสำหรับข้อมูลผู้ใช้หลายคน

เนื่องจาก adb ทำงานในฐานะผู้ใช้ระบบและข้อมูลได้รับการแซนด์บ็อกซ์ใน Android 9 ขึ้นไป คุณจึงต้องใช้ผู้ให้บริการเนื้อหาเพื่อพุชหรือดึงข้อมูลทดสอบจากผู้ใช้ที่ไม่ใช่ระบบ ขั้นตอนนี้ไม่จำเป็นในกรณีต่อไปนี้

  • adbd ทำงานในฐานะผู้ใช้ระดับรูท (ผ่าน adb root) ซึ่งทำได้โดยใช้บิลด์ userdebug หรือ usereng เท่านั้น

  • คุณใช้ ITestDevice ของ Trade Federation (Tradefed) เพื่อพุชหรือดึงไฟล์ ในกรณีนี้ ให้ใช้เส้นทาง /sdcard/ ในการกำหนดค่าการทดสอบ (เช่น ดูซอร์สโค้ดของ pushFile ใน NativeDevice.java)

เมื่อผู้ให้บริการเนื้อหาทำงานอยู่ในผู้ใช้รอง คุณจะเข้าถึงได้โดยการใช้คำสั่ง adb shell content พร้อมพารามิเตอร์ user, uri และพารามิเตอร์อื่นๆ ที่เหมาะสมที่ระบุ

วิธีแก้ปัญหาสำหรับนักพัฒนาแอป

โต้ตอบกับไฟล์ทดสอบโดยใช้ adb content และอินสแตนซ์ของ ContentProvider แทนคำสั่ง push หรือ pull

  1. สร้างอินสแตนซ์ของ ContentProvider ที่โฮสต์โดยแอปซึ่งสามารถแสดงและจัดเก็บไฟล์ได้หากจำเป็น ใช้ที่จัดเก็บข้อมูลภายในของแอป
  2. ใช้คำสั่ง adb shell content read หรือ write เพื่อพุชหรือดึงไฟล์

วิธีแก้ปัญหาสำหรับไฟล์สื่อ

หากต้องการพุชไฟล์สื่อไปยังพาร์ติชันสื่อของการ์ด SD ให้ใช้ MediaStore public 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

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