アプリケーション ロール機能を使用すると、IT 管理者は Android 搭載デバイス上の管理対象アプリに特別な権限を付与できます。特定のロールを割り当てることで、アプリは電力とバックグラウンドの制限、一時停止、休止状態(Android 14 以降)から除外され、ユーザー コントロール(アプリの強制停止やアプリデータの消去などのユーザー操作を含む)が無効になります(Android 11 以降)。これにより、アプリは中断されることなく重要な機能を実行できます。また、アプリに割り当てられたロールが通知されるため、ユーザーの操作なしでアプリを起動できます。
extensionConfig使用可能なアプリケーション ロールと、各ロールに付与される特別な権限の一覧については、
RoleTypeをご覧ください。
前提条件
デバイスが AMAPI ベースの EMM によって管理されている(カスタム DPC を使用する EMM はサポートされていません)。
この機能を使用するためのアプリの準備
AMAPI SDK との統合は、割り当てられたロールをアプリに通知してアプリを起動できるようにする場合(ユーザー インタラクションなしで自動起動する場合)にのみ必要です。
アプリで AMAPI SDK と統合する
AMAPI SDK とアプリへの追加方法について詳しくは、 AMAPI SDK 統合ガイドをご覧ください。
必要なメタデータをアプリのマニフェストに追加する
Android Device Policy(ADP)は、割り当てられたロールをアプリに通知するために、ComponentName を実装するクラス
の NotificationReceiverService を知る必要があります。ADP によって自動的に検出されるように、AndroidManifest.xml でサービスに適切なタグを付ける必要があります。
- アプリには、
enabledであり、meta-dataがandroid:nameに等しいcom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLESを持つサービスが 1 つだけ必要です。 - このサービスでは、
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 ロールをテストする場合は、Android Device Policy がローカル
コマンドのステータス更新をアプリに送信できるように、次の
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 を使用するか、Android Management API クイックスタートに沿って、アプリのロールをアプリケーションに割り当てるテストを行うことができます 。AMAPI Colab ノートブックを使用すると、企業を登録し、ポリシーを作成して、デバイスをプロビジョニングできます。
アプリのロールを使用してアプリのポリシーを設定する
アプリに割り当てるアプリのロールで policy を設定するには、
ApplicationPolicy.roles を使用します。
次の例では、MTD アプリのロールを構成する方法を示します。
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
ポリシーで指定されたロールを割り当てる前に、デバイス上のアプリの署名鍵証明書フィンガープリントが Google Play ストアのフィンガープリントと一致していることが確認されます。フィンガープリントが異なる場合、ロールは
アプリに割り当てられず、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" }
]
}
]
}
アプリに管理対象設定がある場合、IT 管理者はアプリケーション ポリシーで関連する restrictions の初期
設定を行うことができます。
{
"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