จัดการบทบาทของแอปพลิเคชัน

ฟีเจอร์บทบาทของแอปพลิเคชันช่วยให้ผู้ดูแลระบบไอทีสามารถให้สิทธิ์พิเศษแก่ แอปพลิเคชันที่มีการจัดการในอุปกรณ์ที่ใช้ Android การกำหนด บทบาทที่เฉพาะเจาะจงจะช่วยให้แอปได้รับการยกเว้นจากข้อจำกัดด้านพลังงานและเบื้องหลัง การระงับ การหยุดทำงานชั่วคราว (ใน Android 14 ขึ้นไป) และมีการควบคุมของผู้ใช้ (เช่น การดำเนินการของผู้ใช้ อย่างการบังคับหยุดและล้างข้อมูลแอป) ที่ปิดใช้ (ใน Android 11 ขึ้นไป) ซึ่งจะช่วยให้แอปสามารถทำหน้าที่สำคัญได้โดยไม่หยุดชะงัก นอกจากนี้ แอปจะได้รับการแจ้งเตือนเกี่ยวกับบทบาทที่ได้รับมอบหมาย ซึ่งช่วยให้แอปเริ่มต้น ด้วยตัวเองได้โดยไม่ต้องให้ผู้ใช้จัดการ

ดูรายการบทบาทของแอปพลิเคชันที่ใช้ได้และสิทธิ์พิเศษที่มอบให้แก่ แต่ละบทบาทได้ที่ RoleType

ข้อกำหนดเบื้องต้น

อุปกรณ์ได้รับการจัดการโดย EMM ที่ใช้ AMAPI (ระบบไม่รองรับ EMM ที่ใช้ DPC ที่กำหนดเอง)

เตรียมแอปให้พร้อมสำหรับการใช้ฟีเจอร์

การผสานรวมกับ AMAPI SDK จะจำเป็นก็ต่อเมื่อแอปต้องการรับการแจ้งเตือน เกี่ยวกับบทบาทที่ได้รับมอบหมาย ซึ่งจะช่วยให้แอปเริ่มต้นตัวเองได้ (เช่น เปิดตัวโดยอัตโนมัติ โดยไม่ต้องมีการโต้ตอบจากผู้ใช้)

ผสานรวมกับ AMAPI SDK ในแอป

ดูข้อมูลเพิ่มเติมเกี่ยวกับ AMAPI SDK และวิธีเพิ่มลงในแอปได้ในคู่มือการผสานรวม AMAPI SDK

เพิ่มข้อมูลเมตาที่จำเป็นลงในไฟล์ Manifest ของแอป

Device Policy ของ Android (ADP) จำเป็นต้องทราบComponentNameของชั้นเรียน ซึ่งใช้ NotificationReceiverService เพื่อแจ้งเตือนแอปเกี่ยวกับ บทบาทที่ได้รับมอบหมาย คุณต้องติดแท็กบริการใน AndroidManifest.xml อย่างเหมาะสม เพื่อให้ ADP ค้นพบบริการได้โดยอัตโนมัติ

  • แอปต้องมีบริการเพียง 1 รายการซึ่งเป็น enabled และมี 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 ได้ หากแอปของคุณต้องใช้ การกำหนดค่าที่มีการจัดการเพื่อเริ่มต้นด้วยตัวเอง โปรดดูวิธีอ่านและฟัง การเปลี่ยนแปลงในตั้งค่าการกำหนดค่าที่มีการจัดการ

จัดสรรอุปกรณ์ด้วยนโยบายบทบาทของแอป

นักพัฒนาแอปสามารถทดสอบการกำหนดบทบาทของแอปให้กับแอปพลิเคชันของตนโดยใช้ EMM หรือทำตามการเริ่มต้นใช้งาน Android Management API อย่างรวดเร็ว สมุดบันทึก Colab ของ AMAPI ช่วยให้คุณลงทะเบียนองค์กร สร้างนโยบาย และจัดสรรอุปกรณ์ได้

ตั้งค่านโยบายสำหรับแอปด้วยบทบาทของแอป

ตั้งค่า policy โดยใช้บทบาทของแอปที่แอปของคุณควรมีโดยใช้ ApplicationPolicy.roles

ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าบทบาทสำหรับแอป MTD

{
  "applications": [

    {
      "packageName": "com.example.mtd",
      "installType": "FORCE_INSTALLED",
      "roles": [
        { "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
      ]
    }
  ]
}

ก่อนที่จะกำหนดบทบาทตามที่ระบุไว้ในนโยบาย ระบบจะตรวจสอบว่าลายนิ้วมือของใบรับรองคีย์การลงนามของแอปในอุปกรณ์ตรงกับลายนิ้วมือจาก 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>"
      }
    }
  ]
}