অ্যাপ্লিকেশন রোলের ফিচার আইটি অ্যাডমিনকে 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:namecom.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 ব্রডকাস্ট শুনতে পারবে। আপনার অ্যাপ যদি বুটস্ট্র্যাপ করার জন্য
ম্যানেজ করা কনফিগারেশনের উপর নির্ভর করে, তাহলে কীভাবে পরিবর্তনগুলি পড়তে এবং শুনতে হয় তা জানতে
ম্যানেজ করা কনফিগারেশন সেট-আপ করুন দেখুন।
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 দেখায়।
অ্যাপের ভূমিকা সংক্রান্ত নীতি সহ ডিভাইসটি প্রোভিশন করুন
অ্যাপ ডেভেলপাররা EMM ব্যবহার করে বা Android Management API কুইকস্টার্ট অনুসরণ করে তাদের অ্যাপ্লিকেশনে অ্যাপের ভূমিকা অ্যাসাইন করার বিষয়টি পরীক্ষা করতে পারেন। AMAPI Colab নোটবুক আপনাকে একটি এন্টারপ্রাইজ নথিভুক্ত করতে, একটি নীতি তৈরি করতে এবং একটি ডিভাইস প্রভিশন করতে দেয়।
অ্যাপের ভূমিকা সহ আপনার অ্যাপের জন্য নীতি সেট করুন
ApplicationPolicy.roles ব্যবহার করে আপনার অ্যাপের জন্য নির্ধারিত অ্যাপ রোলের সাথে policy সেট-আপ করুন।
MTD অ্যাপের জন্য কীভাবে ভূমিকা কনফিগার করতে হয় তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
{
"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-এর ফিঙ্গারপ্রিন্টের সাথে
মিলছে কিনা।
ফিঙ্গারপ্রিন্ট আলাদা হলে, অ্যাপে ভূমিকা অ্যাসাইন করা হবে না এবং
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" }
]
}
]
}
আপনার অ্যাপে ম্যানেজ করা কনফিগারেশন থাকলে, আইটি অ্যাডমিন অ্যাপ্লিকেশন নীতিতে প্রাসঙ্গিক 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