ฟีเจอร์บทบาทของแอปพลิเคชันช่วยให้ผู้ดูแลระบบไอทีสามารถให้สิทธิ์พิเศษแก่แอปพลิเคชันที่มีการจัดการในอุปกรณ์ที่ทำงานด้วยระบบ Android การมอบหมายบทบาทที่เฉพาะเจาะจงจะช่วยให้แอปได้รับการยกเว้นจากข้อจำกัดด้านพลังงานและการทำงานในเบื้องหลัง การระงับ การไฮเบอร์เนต (ใน Android 14 ขึ้นไป) และปิดใช้การควบคุมของผู้ใช้ (เช่น การดำเนินการของผู้ใช้ เช่น การบังคับหยุดและการล้างข้อมูลแอป) (ใน Android 11 ขึ้นไป) ซึ่งจะช่วยให้แอปทำงานที่สำคัญได้โดยไม่ถูกขัดจังหวะ นอกจากนี้ แอปยังสามารถรับการแจ้งเตือนเกี่ยวกับบทบาทที่ได้รับมอบหมาย ซึ่งช่วยให้แอปสามารถเริ่มต้นระบบได้เองโดยไม่ต้องให้ผู้ใช้จัดการ
ดูรายการบทบาทของแอปพลิเคชันที่ใช้ได้และสิทธิ์พิเศษที่มอบให้กับแต่ละบทบาทได้ที่ RoleType
ข้อกำหนดเบื้องต้น
อุปกรณ์ได้รับการจัดการโดย EMM ที่ใช้ AMAPI (ระบบไม่รองรับ EMM ที่ใช้ DPC ที่กำหนดเอง)
เตรียมแอปให้พร้อมสำหรับการใช้ฟีเจอร์
คุณต้องผสานรวมกับ AMAPI SDK เฉพาะในกรณีที่แอปต้องการรับการแจ้งเตือนเกี่ยวกับบทบาทที่ได้รับมอบหมาย ซึ่งจะช่วยให้แอปเริ่มต้นระบบเองได้ (เช่น เปิดอัตโนมัติโดยไม่ต้องมีการโต้ตอบของผู้ใช้)
ผสานรวมกับ AMAPI SDK ในแอปของคุณ
ดูข้อมูลเพิ่มเติมเกี่ยวกับ AMAPI SDK และวิธีเพิ่มลงในแอปได้ในคู่มือการผสานรวม AMAPI SDK
เพิ่มข้อมูลเมตาที่จำเป็นลงในไฟล์ Manifest ของแอป
Android Device Policy (ADP) จำเป็นต้องทราบ ComponentName ของคลาสซึ่งใช้ NotificationReceiverService เพื่อแจ้งแอปเกี่ยวกับบทบาทที่ได้รับมอบหมาย คุณต้องติดแท็กบริการใน AndroidManifest.xml อย่างเหมาะสมเพื่อให้ ADP ค้นพบโดยอัตโนมัติได้
- แอปต้องมีบริการ
enabledเพียง 1 รายการ และมีmeta-dataที่มีandroid:nameเท่ากับcom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES - บริการนี้ต้องตั้งค่า
android:exportedเป็นtrue - ต้องตั้งค่า
android:valueของmeta-dataเป็นสตริงว่างเปล่า
<service
android:name=".MyNotificationReceiverService"
android:exported="true">
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>
หากคุณกำลังทดสอบบทบาท COMPANION_APP คุณควรเพิ่ม meta-data ต่อไปนี้ลงในบริการของคุณด้วย เพื่อให้ Android Device Policy สามารถส่งการอัปเดตสถานะคำสั่งในเครื่องไปยังแอปของคุณได้
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_COMMAND_STATUS" android:value="" />
สร้างบริการที่ขยาย NotificationReceiverService (หรืออัปเดตบริการที่มีอยู่)
สร้างหรืออัปเดต NotificationReceiverService ที่มีอยู่และใช้ AppRolesListener เพื่อฟังบทบาทที่มอบหมายให้กับแอปของคุณ โดยต้องใช้ getAppRolesListener() เพื่อฟังบทบาทที่มอบหมายให้กับแอปเท่านั้น หากแอปได้รับมอบหมายบทบาท COMPANION_APP คุณควรใช้ 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"
}
}
แอปของคุณอาจได้รับการแจ้งเตือนหลายครั้งหากบทบาทมีการเปลี่ยนแปลงหลายครั้ง หากนำบทบาททั้งหมดออก แอปจะยังคงได้รับแจ้งพร้อมรายการบทบาทที่ว่างเปล่า การแจ้งเตือนนี้จะทำให้แอปออกจากสถานะหยุดทำงาน และเมื่อรวมกับข้อยกเว้นที่แอปได้รับ แอปจะสามารถเริ่มต้นระบบเองได้โดยไม่ต้องมีการโต้ตอบจากผู้ใช้ การแจ้งเตือนและการยกเว้นบทบาทของแอปช่วยให้แอปของคุณฟังการออกอากาศ ACTION_BOOT_COMPLETED ได้ หากแอปของคุณต้องใช้การกำหนดค่าที่มีการจัดการเพื่อเริ่มต้นระบบด้วยตนเอง โปรดดูวิธีอ่านและฟังการเปลี่ยนแปลงที่หัวข้อตั้งค่าการกำหนดค่าที่มีการจัดการ
ตั้งแต่ AMAPI SDK 1.9.0 เป็นต้นไป แต่ละบทบาทใน AppRolesSetRequest จะมี Role.ExtraCapabilities ที่ผู้ดูแลระบบไอทีให้สิทธิ์ในนโยบายด้วย ตัวอย่างเช่น แอปที่ใช้ร่วมกันสามารถตรวจสอบได้ว่าได้รับอนุญาตให้ออกคำสั่งล้างข้อมูลในเครื่องหรือไม่ ดังนี้
import com.google.android.managementapi.approles.model.AppRolesSetRequest
import com.google.android.managementapi.approles.model.AppRolesSetResponse
import com.google.android.managementapi.common.model.Role
...
override fun onAppRolesSet(request: AppRolesSetRequest): AppRolesSetResponse {
val canWipeLocally =
request.roles.any { role ->
role.roleType == Role.RoleType.COMPANION_APP &&
role.extraCapabilities.localDeviceWipeCommand ==
Role.ExtraCapabilities.LocalDeviceWipeCommand.LOCAL_DEVICE_WIPE_COMMAND_ALLOWED
}
Log.i(TAG, "onAppRolesSet: canWipeLocally=$canWipeLocally")
return AppRolesSetResponse.getDefaultInstance()
}
มีเพียงผู้ดูแลระบบไอทีเท่านั้นที่ให้สิทธิ์เพิ่มเติมได้ หากคุณตั้งค่า extraCapabilities ในบทบาทที่ส่งไปยัง EnvironmentClient การเรียกจะล้มเหลวพร้อมข้อผิดพลาด InvalidArgumentException
จัดสรรอุปกรณ์ด้วยนโยบายบทบาทของแอป
นักพัฒนาแอปสามารถทดสอบการมอบหมายบทบาทของแอปให้กับแอปพลิเคชันของตนโดยใช้ EMM หรือทำตามคู่มือเริ่มใช้งานฉบับย่อของ Android Management API Colab Notebook ของ AMAPI ช่วยให้คุณลงทะเบียนองค์กร สร้างนโยบาย และจัดสรรอุปกรณ์ได้
กำหนดนโยบายสำหรับแอปด้วยบทบาทของแอป
ตั้งค่า policy ด้วยบทบาทของแอปที่แอปของคุณควรจะมีโดยใช้ ApplicationPolicy.roles
ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าบทบาทสำหรับแอป MTD
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
เฉพาะบทบาท COMPANION_APP เท่านั้นที่รองรับ extraCapabilities หากต้องการอนุญาตให้แอปที่ใช้ร่วมกันล้างข้อมูลในอุปกรณ์หรือโปรไฟล์งานในเครื่อง ให้ตั้งค่า extraCapabilities.localDeviceWipeCommand เป็น LOCAL_DEVICE_WIPE_COMMAND_ALLOWED สำหรับบทบาทนั้น
ก่อนที่จะมอบหมายบทบาทตามที่ระบุไว้ในนโยบาย ระบบจะตรวจสอบว่าลายนิ้วมือของใบรับรองคีย์ Signing ของแอปในอุปกรณ์ตรงกับลายนิ้วมือจาก Play Store
หากลายนิ้วมือแตกต่างกัน ระบบจะไม่กำหนดบทบาทให้กับแอปและจะรายงานการไม่ปฏิบัติตามข้อกำหนดของ NonComplianceReason.APP_SIGNING_CERT_MISMATCH ไปยัง EMM
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"signingKeyCerts": [
{ "signingKeyCertFingerprintSha256": "base64-encoded-sha256" }
],
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
หากแอปมีการกำหนดค่าที่มีการจัดการ ผู้ดูแลระบบไอทีจะตั้งค่าการกำหนดค่าเริ่มต้นสำหรับ restriction ที่เกี่ยวข้องในนโยบายแอปพลิเคชันได้ ดังนี้
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
],
"managedConfiguration": {
"<key>": "<value>"
}
}
]
}
ยืนยันสถานะการยกเว้นแบตเตอรี่
แอปที่มีบทบาท Mobile Threat Defense (MTD) จะได้รับการยกเว้นจากข้อจำกัดด้านพลังงานในเบื้องหลังแบบมาตรฐานโดยอัตโนมัติ อย่างไรก็ตาม การยกเว้นนี้จะดำเนินการโดย App Standby Bucket แทนรายการที่อนุญาตให้ใช้พลังงานของระบบ
วิธียืนยันว่าการยกเว้นแอปมีผลอยู่
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