ऐप्लिकेशन की भूमिकाओं की सुविधा की मदद से, आईटी एडमिन, Android पर चलने वाले डिवाइस पर मैनेज किए जा रहे ऐप्लिकेशन को खास विशेषाधिकार दे सकता है. किसी ऐप्लिकेशन को कोई खास भूमिका असाइन करने पर, उसे पावर और बैकग्राउंड से जुड़ी पाबंदियों, निलंबित करने, हाइबरनेट करने (Android 14 और उसके बाद के वर्शन पर) से छूट मिल सकती है.साथ ही, उपयोगकर्ता के कंट्रोल (जैसे, Android 11 और उसके बाद के वर्शन पर, ऐप्लिकेशन को ज़बरदस्ती बंद करने और ऐप्लिकेशन का डेटा मिटाने जैसी उपयोगकर्ता की कार्रवाइयों को शामिल करना) बंद किए जा सकते हैं. इससे, ऐप्लिकेशन अपने ज़रूरी फ़ंक्शन को बिना किसी रुकावट के पूरा कर सकता है. इसके अलावा, ऐप्लिकेशन को असाइन की गई भूमिकाओं के बारे में सूचना मिल सकती है. इससे, वह उपयोगकर्ता के हस्तक्षेप के बिना खुद को बूटस्ट्रैप कर सकता है.
उपलब्ध ऐप्लिकेशन की भूमिकाओं और हर भूमिका को दिए गए खास विशेषाधिकारों की सूची देखने के लिए, RoleType देखें.
ज़रूरी शर्तें
डिवाइस को AMAPI पर आधारित EMM मैनेज करता हो. कस्टम DPC का इस्तेमाल करने वाले EMM को शामिल नहीं किया जा सकता.
ऐप्लिकेशन को इस सुविधा का इस्तेमाल करने के लिए तैयार करना
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 ब्रॉडकास्ट के बारे में सुन सकता है. अगर आपका ऐप्लिकेशन खुद को बूटस्ट्रैप करने के लिए,
मैनेज किए गए कॉन्फ़िगरेशन पर निर्भर करता है, तो बदलावों को पढ़ने और सुनने
के तरीके के बारे में जानने के लिए,
मैनेज किए गए कॉन्फ़िगरेशन सेट अप करना लेख पढ़ें.
ऐप्लिकेशन की भूमिकाओं की नीतियों के साथ डिवाइस को प्रोविज़न करना
ऐप्लिकेशन डेवलपर, EMM का इस्तेमाल करके या Android Management API के क्विकस्टार्ट को फ़ॉलो करके, अपने ऐप्लिकेशन को ऐप्लिकेशन की भूमिकाएं असाइन करने की जांच कर सकते हैं. AMAPI Colab notebook की मदद से, कोई कंपनी रजिस्टर की जा सकती है, नीति बनाई जा सकती है, और डिवाइस को प्रोविज़न किया जा सकता है.
ऐप्लिकेशन की भूमिकाओं के साथ अपने ऐप्लिकेशन के लिए नीति सेट करना
अपने ऐप्लिकेशन की भूमिकाओं के साथ policy सेट अप करें, जिनका इस्तेमाल करके आपका ऐप्लिकेशन
ApplicationPolicy.roles के लिए है.
यहां दिए गए उदाहरण में, MTD ऐप्लिकेशन के लिए भूमिका को कॉन्फ़िगर करने का तरीका बताया गया है:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
नीति में बताई गई भूमिकाएं असाइन करने से पहले, सिस्टम यह जांच करेगा कि डिवाइस पर ऐप्लिकेशन के साइनिंग कुंजी सर्टिफ़िकेट का फ़िंगरप्रिंट, Play Store पर मौजूद फ़िंगरप्रिंट से मेल खाता है या नहीं.
अगर फ़िंगरप्रिंट अलग है, तो भूमिकाएं ऐप्लिकेशन को असाइन नहीं की जाएंगी. साथ ही, EMM को नीति का उल्लंघन करने की वजह के तौर पर जानकारी दी जाएगी.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" }
]
}
]
}
अगर आपके ऐप्लिकेशन में मैनेज किया गया कॉन्फ़िगरेशन है, तो आईटी एडमिन, ऐप्लिकेशन की नीति में, काम की restrictions के लिए शुरुआती
कॉन्फ़िगरेशन सेट अप कर सकता है:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
],
"managedConfiguration": {
"<key>": "<value>"
}
}
]
}
बैटरी से जुड़ी छूट की स्थिति की पुष्टि करना
Mobile Threat Defense (MTD) की भूमिका वाले ऐप्लिकेशन को, बैकग्राउंड में पावर से जुड़ी सामान्य पाबंदियों से अपने-आप छूट मिल जाती है. हालांकि, यह छूट, सिस्टम की Power Allowlist के बजाय, 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