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

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

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

  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

ติดตั้งผู้ให้บริการเนื้อหาทั่วไป

ติดตั้งและใช้ 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
```

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