Kiểm tra nhiều người dùng

Trang này mô tả các khía cạnh quan trọng của việc thử nghiệm nhiều người dùng trên nền tảng Android. Để biết thông tin về cách triển khai hỗ trợ nhiều người dùng, hãy xem Hỗ trợ nhiều người dùng .

Đường dẫn thiết bị

Bảng sau liệt kê một số đường dẫn thiết bị và cách giải quyết chúng. Tất cả các giá trị trong cột Đường dẫn đều là bộ lưu trữ có hộp cát dành riêng cho người dùng. Câu chuyện lưu trữ của Android đã thay đổi theo thời gian; đọc tài liệu Lưu trữ để biết thêm thông tin.

Con đường Đường dẫn hệ thống (tùy chọn) Mục đích
/data/user/{userId}/{app.path} /data/data Bộ nhớ ứng dụng
/storage/emulated/{userId} /sdcard Bộ nhớ trong được chia sẻ
/data/media/{userId} không có Dữ liệu phương tiện của người dùng (ví dụ: nhạc, video)
/data/system/users/{userId} không có Cấu hình/trạng thái hệ thống cho mỗi người dùng

Chỉ có thể truy cập được bằng ứng dụng hệ thống

Dưới đây là ví dụ về việc sử dụng đường dẫn dành riêng cho người dùng:

# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/

tương tác adb giữa người dùng

Một số lệnh adb rất hữu ích khi xử lý nhiều người dùng. Một số lệnh này chỉ được hỗ trợ trong Android 9 trở lên:

  • adb shell am instrument --user <userId> chạy thử nghiệm khả năng đo lường đối với một người dùng cụ thể. Theo mặc định, điều này sử dụng người dùng hiện tại.
  • adb install --user <userId> cài đặt gói cho một người dùng cụ thể. Để đảm bảo rằng một gói được cài đặt cho tất cả người dùng, bạn phải gọi gói này cho mọi người dùng.
  • adb uninstall --user <userId> gỡ cài đặt gói cho một người dùng cụ thể. Gọi không có cờ --user để gỡ cài đặt cho tất cả người dùng.
  • adb shell am get-current-user lấy ID người dùng (nền trước) hiện tại.
  • adb shell pm list users sẽ nhận được danh sách tất cả người dùng hiện có.
  • adb shell pm create-user tạo một người dùng mới, trả về ID.
  • adb shell pm remove-user sẽ xóa một người dùng cụ thể theo ID.
  • adb shell pm disable --user <userId> vô hiệu hóa gói cho một người dùng cụ thể.
  • adb shell pm enable --user <userId> kích hoạt gói cho một người dùng cụ thể.
  • adb shell pm list packages --user <userId> liệt kê các gói ( -e để bật, -d để tắt) cho một người dùng cụ thể. Theo mặc định, điều này luôn liệt kê cho người dùng hệ thống.

Thông tin sau đây giúp giải thích cách adb hoạt động với nhiều người dùng:

  • adb (hay chính xác hơn là daemon adbd ) luôn chạy với tư cách là người dùng hệ thống (ID người dùng = 0) bất kể người dùng hiện tại là ai . Do đó, đường dẫn thiết bị phụ thuộc vào người dùng (chẳng hạn như /sdcard/ ) luôn được coi là người dùng hệ thống. Xem Đường dẫn thiết bị để biết thêm chi tiết.

  • Nếu người dùng mặc định không được chỉ định thì mỗi lệnh con adb sẽ có một người dùng khác. Cách tốt nhất là truy xuất ID người dùng bằng am get-current-user rồi sử dụng rõ ràng --user <userId> cho bất kỳ lệnh nào hỗ trợ nó. Cờ người dùng rõ ràng không được hỗ trợ cho tất cả các lệnh cho đến Android 9.

  • Quyền truy cập vào đường dẫn /sdcard của người dùng phụ bị từ chối kể từ Android 9. Hãy xem Nhà cung cấp nội dung để biết dữ liệu nhiều người dùng để biết chi tiết về cách truy xuất tệp trong quá trình thử nghiệm.

Nhà cung cấp nội dung cho dữ liệu nhiều người dùng

adb chạy với tư cách là người dùng hệ thống và dữ liệu được đóng hộp cát trong Android 9 trở lên nên bạn phải sử dụng nhà cung cấp nội dung để đẩy hoặc lấy bất kỳ dữ liệu thử nghiệm nào từ người dùng không thuộc hệ thống. Điều này là không cần thiết nếu:

  • adbd đang chạy bằng root (thông qua adb root ), điều này chỉ có thể thực hiện được bằng cách sử dụng các bản dựng userdebug hoặc usereng .

  • Bạn đang sử dụng ITestDevice của Liên đoàn Thương mại (Tradefed's) để đẩy/kéo tệp, trong trường hợp đó hãy sử dụng đường dẫn /sdcard/ trong cấu hình thử nghiệm của bạn (ví dụ: xem mã nguồn cho pushFile trong NativeDevice.java ).

Khi nhà cung cấp nội dung đang chạy trong người dùng phụ, bạn có thể truy cập nó bằng cách sử dụng lệnh adb shell content với user thích hợp, uri và các thông số khác được chỉ định.

Giải pháp dành cho nhà phát triển ứng dụng

Tương tác với các tệp thử nghiệm bằng adb content và một phiên bản của ContentProvider , thay vì lệnh push hoặc pull .

  1. Tạo một phiên bản ContentProvider được ứng dụng lưu trữ để có thể phân phát/lưu trữ tệp khi cần. Sử dụng bộ nhớ trong của ứng dụng.
  2. Sử dụng lệnh read hoặc write adb shell content để đẩy/kéo tệp.

Giải pháp cho tệp phương tiện

Để đẩy các tệp phương tiện vào phân vùng phương tiện của thẻ SD, hãy sử dụng API công khai MediaStore . Ví dụ:

# 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

Cài đặt nhà cung cấp nội dung chung

Cài đặt và sử dụng nhà cung cấp nội dung hiện có để đọc và ghi tệp vào đường dẫn /sdcard dành riêng cho người dùng.

Xây dựng TradefedContentProvider.apk từ nguồn bằng cách sử dụng 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
```

Liên đoàn Thương mại hỗ trợ nhiều người dùng

Tradefed là khai thác thử nghiệm chính thức của Android. Phần này tóm tắt một số hỗ trợ tích hợp của Tradefed cho các kịch bản thử nghiệm nhiều người dùng.

Trình kiểm tra trạng thái

Trình kiểm tra trạng thái hệ thống (SSC) được chạy trước trình chuẩn bị mục tiêu và quá trình dọn dẹp của chúng được chạy sau những trình chuẩn bị đó.

UserChecker được xác định rõ ràng để hỗ trợ các nhà phát triển khi thử nghiệm nhiều người dùng. Nó theo dõi xem thử nghiệm có thay đổi trạng thái của người dùng trên thiết bị hay không (ví dụ: đã tạo người dùng mà không xóa họ khi phân tích). Ngoài ra, nếu user-cleanup được đặt, nó sẽ tự động cố gắng dọn dẹp sau khi kiểm tra, trong khi vẫn cung cấp các lỗi hữu ích để có thể khắc phục kiểm tra.

<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
    <option name="user-cleanup" value="true" />
</system_checker>

Người chuẩn bị mục tiêu

Trình chuẩn bị mục tiêu thường được sử dụng để thiết lập một thiết bị có cấu hình cụ thể. Trong trường hợp người chuẩn bị kiểm tra nhiều người dùng có thể được sử dụng để tạo người dùng thuộc một loại cụ thể cũng như chuyển sang người dùng khác.

Đối với các loại thiết bị không có người dùng phụ, bạn có thể sử dụng CreateUserPreparer để tạo và chuyển sang người dùng phụ trong AndroidTest.xml . Khi kết thúc bài kiểm tra, người chuẩn bị sẽ quay lại và xóa người dùng phụ.

<target_preparer
  class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>

Nếu loại người dùng bạn muốn đã tồn tại trên thiết bị, hãy sử dụng SwitchUserTargetPreparer để chuyển sang người dùng hiện có. Các giá trị phổ biến cho user-type bao gồm system hoặc secondary .

<target_preparer
  class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
    <option name="user-type" value="secondary" />
</target_preparer>

Kiểm tra theo hướng máy chủ

Trong một số trường hợp, bài kiểm tra cần chuyển đổi người dùng trong bài kiểm tra . Không thực hiện chuyển đổi từ bên trong khung kiểm tra phía thiết bị, chẳng hạn như UI Automator , vì quá trình kiểm tra có thể bị hủy bất kỳ lúc nào. Thay vào đó, hãy sử dụng khung kiểm tra phía máy chủ như Khung kiểm tra dựa trên máy chủ của Tradefed, cho phép truy cập vào ITestDevice , cho phép người dùng thực hiện mọi thao tác cần thiết.

Sử dụng UserChecker (được mô tả trong Trình kiểm tra trạng thái ) cho các thử nghiệm do máy chủ điều khiển làm thay đổi trạng thái người dùng vì nó đảm bảo rằng quá trình kiểm tra sẽ tự dọn dẹp đúng cách.