অ্যাপ্লিকেশন ভূমিকা পরিচালনা করুন

অ্যাপ্লিকেশন রোলস ফিচারটি একজন আইটি অ্যাডমিনকে অ্যান্ড্রয়েড-চালিত ডিভাইসে থাকা কোনো ম্যানেজড অ্যাপ্লিকেশনকে বিশেষ সুবিধা দেওয়ার সুযোগ করে দেয়। একটি নির্দিষ্ট রোল নির্ধারণ করার মাধ্যমে, একটি অ্যাপকে পাওয়ার ও ব্যাকগ্রাউন্ড সীমাবদ্ধতা, সাসপেনশন, হাইবারনেশন (অ্যান্ড্রয়েড ১৪+ সংস্করণে) থেকে অব্যাহতি দেওয়া যায় এবং এর ওপর ব্যবহারকারীর নিয়ন্ত্রণ (যেমন—ফোর্স-স্টপ করা ও অ্যাপ ডেটা মুছে ফেলার মতো ব্যবহারকারীর কার্যকলাপ) নিষ্ক্রিয় করা যায় (অ্যান্ড্রয়েড ১১+ সংস্করণে), যার ফলে এটি কোনো বাধা ছাড়াই তার গুরুত্বপূর্ণ কাজটি সম্পাদন করতে পারে। এছাড়াও, অ্যাপটিকে তার নির্ধারিত রোলগুলো সম্পর্কে অবহিত করা যেতে পারে, যা এটিকে ব্যবহারকারীর হস্তক্ষেপ ছাড়াই নিজে থেকে বুটস্ট্র্যাপ হতে সাহায্য করে।

উপলব্ধ অ্যাপ্লিকেশন রোলগুলির তালিকা এবং প্রতিটি রোলের জন্য প্রদত্ত বিশেষ সুবিধাগুলির জন্য, RoleType দেখুন।

পূর্বশর্ত

ডিভাইসটি একটি AMAPI ভিত্তিক EMM দ্বারা পরিচালিত হয় (কাস্টম DPC ব্যবহারকারী EMM সমর্থিত নয়)।

ফিচারটি ব্যবহারের জন্য আপনার অ্যাপ প্রস্তুত করুন।

AMAPI SDK-এর সাথে ইন্টিগ্রেশন শুধুমাত্র তখনই প্রয়োজন, যখন অ্যাপটি তার নির্ধারিত রোলগুলো সম্পর্কে অবহিত হতে চায়, যা এটিকে নিজে থেকেই বুটস্ট্র্যাপ করতে (অর্থাৎ ব্যবহারকারীর হস্তক্ষেপ ছাড়াই স্বয়ংক্রিয়ভাবে চালু হতে) সক্ষম করে।

আপনার অ্যাপে AMAPI SDK-এর সাথে একীভূত করুন

AMAPI SDK ইন্টিগ্রেশন গাইড- এ আপনি AMAPI SDK সম্পর্কে আরও তথ্য এবং আপনার অ্যাপে এটি কীভাবে যুক্ত করবেন তা জানতে পারবেন।

অ্যাপের ম্যানিফেস্টে প্রয়োজনীয় মেটাডেটা যোগ করুন।

আপনার অ্যাপকে তার নির্ধারিত ভূমিকাগুলো সম্পর্কে অবহিত করার জন্য, অ্যান্ড্রয়েড ডিভাইস পলিসি (ADP)-কে আপনার NotificationReceiverService ইমপ্লিমেন্ট করা ক্লাসের ComponentName জানতে হয়। আপনাকে অবশ্যই 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 যোগ করা উচিত, যাতে অ্যান্ড্রয়েড ডিভাইস পলিসি আপনার অ্যাপে স্থানীয় কমান্ড স্ট্যাটাস আপডেট পাঠাতে পারে:

<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 ব্যবহার করে অথবা অ্যান্ড্রয়েড ম্যানেজমেন্ট এপিআই কুইকস্টার্ট অনুসরণ করে তাদের অ্যাপ্লিকেশনে অ্যাপ রোল নির্ধারণ পরীক্ষা করতে পারেন। AMAPI কোলাব নোটবুক আপনাকে একটি এন্টারপ্রাইজ এনরোল করতে, একটি পলিসি তৈরি করতে এবং একটি ডিভাইস প্রভিশন করতে দেয়।

অ্যাপ রোলের মাধ্যমে আপনার অ্যাপের জন্য নীতি নির্ধারণ করুন।

ApplicationPolicy.roles ব্যবহার করে আপনার অ্যাপের জন্য নির্ধারিত অ্যাপ রোলগুলোসহ একটি policy সেট আপ করুন।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে MTD অ্যাপগুলির জন্য ভূমিকাটি কনফিগার করতে হয়:

{
  "applications": [

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

পলিসিতে উল্লেখিত ভূমিকাগুলো বরাদ্দ করার আগে, সিস্টেমটি যাচাই করবে যে ডিভাইসে থাকা অ্যাপটির সাইনিং কী সার্টিফিকেটের ফিঙ্গারপ্রিন্টটি প্লে স্টোরের ফিঙ্গারপ্রিন্টের সাথে মেলে কি না। যদি ফিঙ্গারপ্রিন্টটি ভিন্ন হয়, তবে অ্যাপটিকে ভূমিকাগুলো বরাদ্দ করা হবে না এবং 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) রোলযুক্ত অ্যাপগুলি স্বয়ংক্রিয়ভাবে সাধারণ ব্যাকগ্রাউন্ড পাওয়ার সীমাবদ্ধতা থেকে অব্যাহতি পায়। তবে, এই অব্যাহতিটি সিস্টেমের পাওয়ার অ্যালাওলিস্টের পরিবর্তে অ্যাপ স্ট্যান্ডবাই বাকেটের মাধ্যমে প্রয়োগ করা হয়।

অ্যাপ ছাড়টি সক্রিয় আছে কিনা তা যাচাই করতে:

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