Tính năng vai trò ứng dụng cho phép quản trị viên CNTT cấp các đặc quyền đặc biệt cho một ứng dụng được quản lý trên thiết bị chạy Android. Bằng cách chỉ định một vai trò cụ thể, ứng dụng có thể được miễn các hạn chế về nguồn và chế độ nền, tạm ngưng, ngủ đông (trên Android 14 trở lên) và tắt các chế độ kiểm soát của người dùng (tức là bao gồm các hành động của người dùng như buộc dừng và xoá dữ liệu ứng dụng) (trên Android 11 trở lên), cho phép ứng dụng thực hiện chức năng quan trọng mà không bị gián đoạn. Ngoài ra, ứng dụng có thể được thông báo về các vai trò được chỉ định, cho phép ứng dụng tự khởi động mà không cần sự can thiệp của người dùng.
Để biết danh sách các vai trò ứng dụng hiện có và các đặc quyền đặc biệt được cấp cho
từng vai trò, hãy xem RoleType.
Điều kiện tiên quyết
Thiết bị được quản lý bằng EMM dựa trên AMAPI (không hỗ trợ EMM sử dụng DPC tuỳ chỉnh).
Chuẩn bị ứng dụng để sử dụng tính năng này
Bạn chỉ cần tích hợp với SDK AMAPI nếu ứng dụng muốn được thông báo về các vai trò được chỉ định, cho phép ứng dụng tự khởi động (tức là tự động khởi chạy mà không cần lượt tương tác của người dùng).
Tích hợp với SDK AMAPI trong ứng dụng
Bạn có thể tìm thêm thông tin về SDK AMAPI và cách thêm SDK này vào ứng dụng trong hướng dẫn tích hợp SDK AMAPI.
Thêm siêu dữ liệu bắt buộc vào tệp kê khai của ứng dụng
Android Device Policy (ADP) cần biết ComponentName của lớp
triển khai NotificationReceiverService để thông báo cho ứng dụng của bạn về các
vai trò được chỉ định. Bạn phải gắn thẻ dịch vụ của mình trong AndroidManifest.xml một cách phù hợp để ADP có thể tự động phát hiện dịch vụ đó.
- Ứng dụng của bạn phải có chính xác một dịch vụ
enabledvà cómeta-datavớiandroid:namebằngcom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES - Dịch vụ này phải có
android:exportedđược đặt thànhtrue android:valuecủameta-dataphải được đặt thành một chuỗi trống
<service
android:name=".MyNotificationReceiverService"
android:exported="true">
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>
Nếu đang kiểm thử vai trò COMPANION_APP, bạn cũng nên thêm
meta-data sau đây vào dịch vụ để Android Device Policy có thể gửi thông tin cập nhật trạng thái lệnh cục bộ
đến ứng dụng của bạn:
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_COMMAND_STATUS" android:value="" />
Tạo một dịch vụ mở rộng NotificationReceiverService (hoặc cập nhật dịch vụ hiện có)
Tạo hoặc cập nhật NotificationReceiverService hiện có và triển khai
AppRolesListener để theo dõi các vai trò được chỉ định cho ứng dụng của bạn. Bạn chỉ cần
getAppRolesListener() để theo dõi các vai trò được chỉ định cho
ứng dụng của mình. Nếu ứng dụng của bạn được chỉ định vai trò COMPANION_APP, bạn cũng nên triển khai
getCommandListener():
import android.util.Log
import com.google.android.managementapi.approles.AppRolesListener
import com.google.android.managementapi.approles.model.AppRolesSetRequest
import com.google.android.managementapi.approles.model.AppRolesSetResponse
import com.google.android.managementapi.commands.CommandListener
import com.google.android.managementapi.commands.model.Command
import com.google.android.managementapi.notification.NotificationReceiverService
class MyNotificationReceiverService : NotificationReceiverService() {
// If your app wants to listen for roles assigned
override fun getAppRolesListener(): AppRolesListener =
object : AppRolesListener {
override fun onAppRolesSet(request: AppRolesSetRequest): AppRolesSetResponse {
val roleTypes = request.roles.map { role -> role.roleType }
Log.i(TAG, "onAppRolesSet: $roleTypes")
return AppRolesSetResponse.getDefaultInstance()
}
}
// If your app wants to listen for local command status updates
// Only relevant for COMPANION_APP role
override fun getCommandListener(): CommandListener {
return object : CommandListener {
override fun onCommandStatusChanged(command: Command) {
Log.i(TAG, "onCommandStatusChanged")
}
}
}
private companion object {
const val TAG = "MyNotificationReceiverService"
}
}
Ứng dụng của bạn có thể được thông báo nhiều lần nếu vai trò của ứng dụng thay đổi nhiều lần. Nếu tất cả vai trò đều bị xoá, ứng dụng của bạn vẫn sẽ được thông báo bằng một danh sách vai trò trống. Thông báo này sẽ đưa ứng dụng của bạn ra khỏi trạng thái dừng và cùng với các trường hợp miễn trừ được cấp cho ứng dụng, ứng dụng có thể tự khởi động mà không cần bất kỳ tương tác nào của người dùng. Nhờ thông báo và trường hợp miễn trừ về vai trò ứng dụng, ứng dụng của bạn
có thể theo dõi các lượt truyền tin ACTION_BOOT_COMPLETED. Nếu ứng dụng của bạn phụ thuộc vào
các cấu hình được quản lý để tự khởi động, hãy xem
Thiết lập cấu hình được quản lý để biết cách đọc và theo dõi
các thay đổi.
Cung cấp thiết bị theo chính sách về vai trò ứng dụng
Nhà phát triển ứng dụng có thể kiểm thử việc chỉ định vai trò ứng dụng cho ứng dụng của họ bằng EMM hoặc làm theo hướng dẫn bắt đầu nhanh về Android Management API. Sổ tay Colab của AMAPI cho phép bạn đăng ký một doanh nghiệp, tạo chính sách và cung cấp thiết bị.
Đặt chính sách cho ứng dụng của bạn theo vai trò ứng dụng
Thiết lập policy theo các vai trò ứng dụng mà ứng dụng của bạn dự định có bằng cách sử dụng
ApplicationPolicy.roles.
Ví dụ sau đây cho biết cách định cấu hình vai trò cho ứng dụng MTD:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
Trước khi chỉ định các vai trò như được chỉ định trong chính sách, hệ thống sẽ kiểm tra để đảm bảo rằng dấu vân tay chứng chỉ khoá ký của ứng dụng trên thiết bị khớp với vân tay trong Cửa hàng Play.
Nếu vân tay khác nhau, các vai trò sẽ không được chỉ định cho
ứng dụng và NonComplianceReason.APP_SIGNING_CERT_MISMATCH
việc không tuân thủ sẽ được báo cáo cho EMM.
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"signingKeyCerts": [
{ "signingKeyCertFingerprintSha256": "base64-encoded-sha256" }
],
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
Nếu ứng dụng của bạn có cấu hình được quản lý, thì quản trị viên CNTT có thể thiết lập cấu hình ban đầu
cho các restriction có liên quan trong chính sách ứng dụng:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
],
"managedConfiguration": {
"<key>": "<value>"
}
}
]
}
Xác minh trạng thái miễn trừ pin
Các ứng dụng có vai trò Phòng vệ mối đe doạ trên thiết bị di động (MTD) sẽ tự động được miễn các hạn chế về nguồn ở chế độ nền thông thường. Tuy nhiên, trường hợp miễn trừ này được triển khai bằng Nhóm chờ ứng dụng chứ không phải Danh sách cho phép nguồn của hệ thống.
Cách xác minh xem trường hợp miễn trừ ứng dụng có đang hoạt động hay không:
import android.app.usage.UsageStatsManager
import android.content.Context
// UsageStatsManager.STANDBY_BUCKET_EXEMPTED is annotated as a @SystemApi. We can redefine it for clarity.
// Define this at the top level of your file, or inside a companion object
private const val STANDBY_BUCKET_EXEMPTED = 5
private fun isAppExemptedFromAppStandbyBucket(): Boolean =
(getSystemService(Context.USAGE_STATS_SERVICE) as? UsageStatsManager)
?.appStandbyBucket == STANDBY_BUCKET_EXEMPTED