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

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

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

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

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

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

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

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

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

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

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

  • आपके ऐप्लिकेशन में सिर्फ़ एक ऐसी सेवा होनी चाहिए जो 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 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 ब्रॉडकास्ट सुन सकता है. अगर आपका ऐप्लिकेशन बूटस्ट्रैप करने के लिए, मैनेज किए गए कॉन्फ़िगरेशन पर निर्भर करता है, तो मैनेज किए गए कॉन्फ़िगरेशन सेट अप करना लेख पढ़ें. इसमें, बदलावों को पढ़ने और सुनने का तरीका बताया गया है.

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

ऐप्लिकेशन डेवलपर, ईएमएम का इस्तेमाल करके या 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" }
      ]
    }
  ]
}

नीति में बताई गई भूमिकाएं असाइन करने से पहले, सिस्टम यह जांच करेगा कि डिवाइस पर मौजूद ऐप्लिकेशन के साइनिंग की सर्टिफ़िकेट का फ़िंगरप्रिंट, 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