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

หน้านี้อธิบายแง่มุมที่สำคัญของการทดสอบผู้ใช้หลายรายใน แพลตฟอร์ม 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

  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
```

การสนับสนุนผู้ใช้หลายคนของสหพันธ์การค้า

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