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

ฟีเจอร์บทบาทของแอปพลิเคชันช่วยให้ผู้ดูแลระบบไอทีสามารถให้สิทธิ์พิเศษแก่ แอปพลิเคชันที่มีการจัดการในอุปกรณ์ที่ใช้ 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>"
      }
    }
  ]
}

ยืนยันสถานะการยกเว้นแบตเตอรี่

แอปที่มีบทบาทการป้องกันภัยคุกคามบนอุปกรณ์เคลื่อนที่ (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