ऐप्लिकेशन की भूमिकाएं मैनेज करना

ऐप्लिकेशन की भूमिकाओं की सुविधा की मदद से, आईटी एडमिन Android डिवाइस पर मैनेज किए जा रहे ऐप्लिकेशन को खास अधिकार दे सकता है. कोई खास भूमिका असाइन करके, किसी ऐप्लिकेशन को बैटरी और बैकग्राउंड से जुड़ी पाबंदियों, सस्पेंड होने, और हाइबरनेशन (Android 14 और इसके बाद के वर्शन पर) से छूट दी जा सकती है.साथ ही, Android 11 और इसके बाद के वर्शन पर, उपयोगकर्ता के कंट्रोल (जैसे, ज़बरदस्ती रोकना और ऐप्लिकेशन का डेटा मिटाना) बंद किए जा सकते हैं. इससे ऐप्लिकेशन, बिना किसी रुकावट के अपना ज़रूरी काम कर पाता है. इसके अलावा, ऐप्लिकेशन को असाइन की गई भूमिकाओं के बारे में सूचना दी जा सकती है. इससे ऐप्लिकेशन, उपयोगकर्ता के इंटरैक्शन के बिना खुद को बूटस्ट्रैप कर सकता है.

उपलब्ध ऐप्लिकेशन भूमिकाओं और हर भूमिका को दिए गए खास अधिकारों की सूची देखने के लिए, RoleType पर जाएं.

ज़रूरी शर्तें

डिवाइस को AMAPI पर आधारित ईएमएम से मैनेज किया जाता हो. कस्टम डीपीसी का इस्तेमाल करने वाले ईएमएम के साथ यह सुविधा काम नहीं करती.

इस सुविधा का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन को तैयार करना

AMAPI SDK के साथ इंटिग्रेट करना सिर्फ़ तब ज़रूरी है, जब ऐप्लिकेशन को असाइन की गई भूमिकाओं की सूचना चाहिए.इससे ऐप्लिकेशन को खुद को बूटस्ट्रैप करने की अनुमति मिलती है. इसका मतलब है कि उपयोगकर्ता के इंटरैक्शन के बिना, ऐप्लिकेशन अपने-आप लॉन्च हो जाता है.

अपने ऐप्लिकेशन में AMAPI SDK टूल को इंटिग्रेट करना

AMAPI SDK और इसे अपने ऐप्लिकेशन में जोड़ने के तरीके के बारे में ज़्यादा जानकारी, AMAPI SDK को इंटिग्रेट करने की गाइड में मिल सकती है.

ऐप्लिकेशन के मेनिफ़ेस्ट में ज़रूरी मेटाडेटा जोड़ना

Android Device Policy (ADP) को आपकी क्लास के ComponentName की जानकारी होनी चाहिए. यह क्लास, NotificationReceiverService को लागू करती है, ताकि आपके ऐप्लिकेशन को असाइन की गई भूमिकाओं के बारे में सूचना दी जा सके. आपको AndroidManifest.xml में अपनी सेवा को सही तरीके से टैग करना होगा, ताकि एडीपी उसे अपने-आप ढूंढ सके.

  • आपके ऐप्लिकेशन में सिर्फ़ एक सेवा होनी चाहिए, जो enabled हो और जिसमें meta-data के साथ android:name की वैल्यू com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES के बराबर हो
  • इस सेवा के लिए, android:exported को true पर सेट करना ज़रूरी है
  • meta-data के android:value को खाली स्ट्रिंग पर सेट करना ज़रूरी है
<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 डिवाइस से जुड़ी नीति आपके ऐप्लिकेशन को लोकल निर्देश की स्थिति के अपडेट भेज सके:

<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()
  }

सिर्फ़ आईटी एडमिन ही अतिरिक्त सुविधाएं दे सकता है. अगर आपने EnvironmentClient को पास की गई भूमिका पर extraCapabilities सेट किया है, तो कॉल InvalidArgumentException के साथ फ़ेल हो जाता है.

ऐप्लिकेशन की भूमिकाओं से जुड़ी नीतियों के साथ डिवाइस को सेट अप करना

ऐप्लिकेशन डेवलपर, ईएमएम का इस्तेमाल करके या Android Management API की क्विकस्टार्ट गाइड में दिए गए निर्देशों का पालन करके, अपने ऐप्लिकेशन को ऐप्लिकेशन की भूमिकाएं असाइन करने की जांच कर सकते हैं. AMAPI Colab notebook की मदद से, किसी एंटरप्राइज़ को रजिस्टर किया जा सकता है, नीति बनाई जा सकती है, और डिवाइस को सेट अप किया जा सकता है.

ऐप्लिकेशन के लिए, ऐप्लिकेशन की भूमिकाओं के हिसाब से नीति सेट करना

ApplicationPolicy.roles का इस्तेमाल करके, policy को उन ऐप्लिकेशन भूमिकाओं के साथ सेट अप करें जो आपके ऐप्लिकेशन के लिए ज़रूरी हैं.

यहां दिए गए उदाहरण में, एमटीडी ऐप्लिकेशन के लिए भूमिका को कॉन्फ़िगर करने का तरीका बताया गया है:

{
  "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 पर सेट करें.

नीति में बताई गई भूमिकाएं असाइन करने से पहले, सिस्टम यह जांच करेगा कि डिवाइस पर मौजूद ऐप्लिकेशन के साइनिंग पासकोड के सर्टिफ़िकेट का फ़िंगरप्रिंट, Play Store पर मौजूद फ़िंगरप्रिंट से मेल खाता है या नहीं. अगर फ़िंगरप्रिंट अलग है, तो ऐप्लिकेशन को भूमिकाएं असाइन नहीं की जाएंगी और NonComplianceReason.APP_SIGNING_CERT_MISMATCH ईएमएम को नीति का पालन न करने की शिकायत की जाएगी.

{
  "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>"
      }
    }
  ]
}

बैटरी से जुड़ी छूट की स्थिति की पुष्टि करना

मोबाइल थ्रेट डिफ़ेंस (एमटीडी) की भूमिका वाले ऐप्लिकेशन को, बैकग्राउंड में बैटरी के इस्तेमाल से जुड़ी स्टैंडर्ड पाबंदियों से अपने-आप छूट मिल जाती है. हालांकि, यह छूट सिस्टम की पावर की अनुमति वाली सूची के बजाय, ऐप स्टैंडबाय बकेट से लागू की जाती है.

ऐप्लिकेशन को छूट मिली है या नहीं, इसकी पुष्टि करने के लिए:

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