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 giải quyết các đường dẫn đó. Tất cả giá trị trong cột Path (Đường dẫn) đều là bộ nhớ cát dành riêng cho người dùng. 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 về 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 trên mỗi người dùng
Chỉ các ứng dụng hệ thống mới có thể truy cập |
Dưới đâ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/
hoạt động tương tác với adb giữa người dùng
Một số lệnh adb
sẽ hữu ích khi 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, phương thức này 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-user
nhận mã nhận dạng người dùng hiện tại (nền trước).adb shell pm list users
nhận danh sách tất cả người dùng hiện tại.adb shell pm create-user
tạo một người dùng mới, trả về mã nhận dạng.adb shell pm remove-user
xoá một người dùng cụ thể theo mã nhận dạng.adb shell pm disable --user <userId>
tắt một gói cho một người dùng cụ thể.adb shell pm enable --user <userId>
bật 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 (-e
đối với gói đã bật,-d
đối với gói đã tắt) cho một người dùng cụ thể. Theo mặc định, mục 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
(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 nào hiện tại. 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 chi tiết.Nếu bạn không chỉ định người dùng mặc định, thì mỗi lệnh con
adb
sẽ có một người dùng khác nhau. Phương pháp hay nhất là truy xuất mã nhận dạng người dùng bằngam get-current-user
, sau đó sử dụng--user <userId>
một cách rõ ràng cho bất kỳ lệnh nào hỗ trợ mã đó. 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 các đường dẫn
/sdcard
của người dùng phụ sẽ bị từ chối kể từ Android 9. Hãy xem phần 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 đưa vào hộp cá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 lấy mọi dữ liệu kiểm thử từ người dùng không phải 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 thư mục gốc (thông quaadb root
). Bạn chỉ có thể thực hiện việc này bằng cách sử dụng bản dựnguserdebug
hoặcusereng
.Bạn đang sử dụng
ITestDevice
của Liên đoàn Thương mại (Tradefed's) để đẩy hoặc kéo các tệp, trong trường hợp đó, hãy sử dụng đường dẫn/sdcard/
trong cấu hình kiểm thử của bạn (ví dụ: xem mã nguồn chopushFile
trongNativeDevice.java
).
Khi một trình cung cấp nội dung đang chạy trong 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
và các tham số khác được chỉ định.
Giải pháp 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 thực thể của ContentProvider
thay vì lệnh push
hoặc pull
.
- Tạo một thực thể của
ContentProvider
do ứng dụng lưu trữ. Thực thể này có thể phân phát và lưu trữ 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 content
read
hoặcwrite
để đẩy hoặc kéo tệp.
Giải pháp cho tệp đa phương tiện
Để đẩy các tệp nội dung nghe nhìn vào phân vùng nội dung nghe nhìn của thẻ SD, hãy sử dụng MediaStore
API công khai. 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 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 Trade Federation
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 trường hợp 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 các trình chuẩn bị mục tiêu và quy trình dọn dẹp sẽ được chạy sau các 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. Phương thức này theo dõi xem một kiểm thử 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á người dùng đó trong quá trình tháo dỡ). Ngoài ra, nếu bạn đặt user-cleanup
, công cụ này sẽ tự động cố gắng dọn dẹp sau quá trình kiểm thử, mà vẫn cung cấp các lỗi hữu ích để có thể khắc phục quá trình kiểm thử.
<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 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 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 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 kiểm thử, trình chuẩn bị sẽ chuyển về và xoá người dùng phụ.
<target_preparer
class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>
Nếu kiểu người dùng mà bạn muốn đã có 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 thử do máy chủ điều khiển
Trong một số trường hợp, kiểm thử cần chuyển đổi người dùng trong phạm vi kiểm thử. Đừng chuyển đổi từ trong khung kiểm thử phía thiết bị, chẳng hạn như UI Automator, vì quá trình kiểm thử có thể bị tắt bất cứ lúc nào. Thay vào đó, hãy sử dụng khung kiểm thử phía máy chủ như Khung kiểm thử do máy chủ điều khiển của Tradefed. Khung này cấp quyền 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 phần Trình kiểm tra trạng thái) cho các kiểm thử do máy chủ điều khiển thay đổi trạng thái người dùng vì nó đảm bảo rằng kiểm thử sẽ dọn dẹp đúng cách sau khi kiểm thử.