Trang này mô tả các khía cạnh quan trọng của việc kiểm thử nhiều người dùng trên nền tảng Android. Để biết thông tin về cách triển khai tính năng hỗ trợ nhiều người dùng, hãy xem phần Hỗ trợ nhiều người dùng.
Đường dẫn thiết bị
Bảng sau đây liệt kê một số đường dẫn thiết bị và cách phân giải các đường dẫn đó. Tất cả các giá trị trong cột Đường dẫn đều là bộ nhớ hộp cát dành riêng cho người dùng. Câu chuyện về bộ nhớ của Android đã thay đổi theo thời gian; hãy đọc tài liệu về Bộ nhớ để biết thêm thông tin.
| Đường dẫn | Đường dẫn hệ thống (không bắt buộc) | Mục đích |
|---|---|---|
/data/user/{userId}/{app.path}
|
/data/data
|
Bộ nhớ ứng dụng |
/storage/emulated/{userId}
|
/sdcard
|
Bộ nhớ trong dùng chung |
/data/media/{userId}
|
none | Dữ liệu nội dung nghe nhìn của người dùng (ví dụ: nhạc, video) |
/data/system/users/{userId}
|
none | Cấu hình/trạng thái hệ thống cho mỗi người dùng
Chỉ các ứng dụng hệ thống mới truy cập được |
Sau đây là ví dụ về cách 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/
adb tương tác giữa người dùng
Một số lệnh adb sẽ hữu ích khi bạn xử lý nhiều người dùng. Một số lệnh trong số này chỉ được hỗ trợ trên Android 9 trở lên:
adb shell am instrument --user <userId>chạy một kiểm thử đo lường đối với một người dùng cụ thể. Theo mặc định, lệnh này sẽ sử dụng người dùng hiện tại.adb install --user <userId>cài đặt mộ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 một gói cho một người dùng cụ thể. Gọi mà không có cờ--userđể gỡ cài đặt cho tất cả người dùng.adb shell am get-current-userlấy mã nhận dạng người dùng hiện tại (nền trước).adb shell pm list userslấy danh sách tất cả người dùng hiện tại.adb shell pm create-usertạo một người dùng mới và trả về mã nhận dạng.adb shell pm remove-userxoá một người dùng cụ thể theo mã nhận dạng.adb shell pm disable --user <userId>vô hiệu hoá một gói cho một người dùng cụ thể.adb shell pm enable --user <userId>cho phép mộ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 (-echo trạng thái đã bật,-dcho trạng thái đã tắt) của một người dùng cụ thể. Theo mặc định, danh sách này luôn dành 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 khi có nhiều người dùng:
adb(hoặc chính xác hơn là trình nềnadbd) luôn chạy dưới dạng người dùng hệ thống (mã nhận dạng người dùng = 0) bất kể người dùng hiện tại là ai. Do đó, các đường dẫn thiết bị phụ thuộc vào người dùng (chẳng hạn như/sdcard/) luôn phân giải dưới dạng người dùng hệ thống. Hãy xem phần Đường dẫn thiết bị để biết thêm thông tin.Nếu bạn không chỉ định người dùng mặc định, thì mỗi lệnh con
adbsẽ có một người dùng khác. Phương pháp hay nhất là truy xuất mã nhận dạng người dùng bằngam get-current-userrồi sử dụng rõ ràng--user <userId>cho mọi lệnh hỗ trợ mã nhận dạng người dùng. 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.Kể từ Android 9, người dùng phụ sẽ không có quyền truy cập vào
/sdcard. Hãy xem Trình cung cấp nội dung cho dữ liệu nhiều người dùng để biết thông tin chi tiết về cách truy xuất tệp trong quá trình kiểm thử.
Nhà cung cấp nội dung cho dữ liệu nhiều người dùng
Vì adb chạy dưới dạng người dùng hệ thống và dữ liệu được tách biệt trong Android 9 trở lên, nên bạn phải sử dụng trình cung cấp nội dung để đẩy hoặc kéo mọi dữ liệu kiểm thử từ một người dùng không phải là người dùng hệ thống. Bạn không cần làm việc này nếu:
adbdđang chạy dưới dạng gốc (thông quaadb 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ựnguserdebughoặcusereng.Bạn đang sử dụng
ITestDevicecủa Trade Federation (Tradefed) để đẩy hoặc kéo các tệp. Trong trường hợp này, hãy sử dụng các đường dẫn/sdcard/trong cấu hình kiểm thử (ví dụ: xem mã nguồn chopushFiletrongNativeDevice.java).
Khi một trình cung cấp nội dung đang chạy ở người dùng phụ, bạn có thể truy cập vào trình cung cấp đó bằng cách sử dụng lệnh adb shell content với user, uri thích hợp và các thông số khác được chỉ định.
Giải pháp thay thế cho nhà phát triển ứng dụng
Tương tác với các tệp kiểm thử bằng adb content và một phiên bản của ContentProvider, thay vì lệnh push hoặc pull.
- Tạo một thực thể
ContentProviderdo ứng dụng lưu trữ, có thể phân phát và lưu trữ các tệp khi cần. Sử dụng bộ nhớ trong của ứng dụng. - Sử dụng các lệnh
adb shell contentreadhoặcwriteđể đẩy hoặc kéo các tệp.
Giải pháp cho tệp nội dung nghe nhìn
Để đẩy các tệp đa phương tiện vào phân vùng đa phương tiện của thẻ SD, hãy sử dụng các 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 trình cung cấp nội dung chung
Cài đặt và sử dụng một trì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.
Tạo 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
```
Hỗ trợ nhiều người dùng trong Liên đoàn Thương mại
Tradefed là bộ kiểm thử Android chính thức. Phần này tóm tắt một số tính năng hỗ trợ tích hợp của Tradefed cho các tình huống kiểm thử 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ợ nhà phát triển khi kiểm thử nhiều người dùng. Thử nghiệm này theo dõi xem một 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 xoá họ trong quá trình tháo dỡ). Ngoài ra, nếu bạn đặt user-cleanup, thì hệ thống sẽ tự động tìm cách dọn dẹp sau khi kiểm thử, đồng thời vẫn cung cấp các lỗi hữu ích để bạn có thể khắc phục kiểm thử.
<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
<option name="user-cleanup" value="true" />
</system_checker>
Target preparer
Trình chuẩn bị mục tiêu thường được dùng để thiết lập một thiết bị có cấu hình cụ thể. Trong trường hợp kiểm thử nhiều người dùng, bạn có thể sử dụng các trình chuẩn bị để 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 những loại thiết bị không có người dùng phụ, bạn có thể dùng CreateUserPreparer để tạo và chuyển sang người dùng phụ trong AndroidTest.xml. Khi kết thúc kiểm tra, người chuẩn bị sẽ chuyển đổi lại và xoá 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 đã có trên thiết bị, hãy 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 thử do máy chủ lưu trữ điều khiển
Trong một số trường hợp, một bài kiểm thử cần chuyển đổi người dùng trong quá trình kiểm thử. Đừng chuyển đổi từ trong một khung kiểm thử phía thiết bị, chẳng hạn như UI Automator, vì quy trình kiểm thử có thể bị huỷ bất cứ lúc nào. Thay vào đó, hãy sử dụng một khung kiểm thử phía máy chủ lưu trữ như Khung kiểm thử dựa trên máy chủ lưu trữ của Tradefed, cho phép truy cập vào ITestDevice, cho phép mọi thao tác cần thiết của người dùng.
Sử dụng UserChecker (được mô tả trong Trình kiểm tra trạng thái) cho các kiểm thử do máy chủ lưu trữ điều khiển, thay đổi trạng thái người dùng vì nó đảm bảo rằng kiểm thử dọn dẹp đúng cách sau khi hoàn tất.