Uygulama rolleri özelliği, BT yöneticilerinin Android destekli bir cihazdaki yönetilen uygulamaya özel ayrıcalıklar vermesine olanak tanır. Belirli bir rol atanan uygulamalar; güç ve arka plan kısıtlamalarından, askıya alınmadan, hazırda bekletme modundan (Android 14 ve sonraki sürümlerde) muaf tutulabilir ve kullanıcı denetimleri (ör.uygulamayı zorla durdurma ve uygulama verilerini temizleme gibi kullanıcı işlemleri) devre dışı bırakılabilir (Android 11 ve sonraki sürümlerde). Böylece uygulamalar, kritik işlevlerini kesintisiz olarak yerine getirebilir. Ayrıca uygulama, kendisine atanan roller hakkında bilgilendirilebilir. Bu sayede, kullanıcı müdahalesi olmadan kendi kendine başlatılabilir.
Kullanılabilir uygulama rollerinin ve her role verilen özel ayrıcalıkların listesi için RoleType başlıklı makaleyi inceleyin.
Ön koşullar
Cihaz, AMAPI tabanlı bir EMM tarafından yönetilmelidir (özel DPC kullanan EMM'ler desteklenmez).
Uygulamanızı özelliği kullanmaya hazırlama
AMAPI SDK'sı ile entegrasyon yalnızca uygulamanın, kendisine atanan roller hakkında bildirim almak istemesi durumunda gereklidir. Bu sayede uygulama, kendisini başlatabilir (yani kullanıcı etkileşimi olmadan otomatik olarak başlatılabilir).
Uygulamanızda AMAPI SDK'sı ile entegrasyon
AMAPI SDK'sı ve uygulamanıza nasıl ekleyeceğiniz hakkında daha fazla bilgiyi AMAPI SDK entegrasyon kılavuzunda bulabilirsiniz.
Uygulamanın manifest dosyasına gerekli meta verileri ekleme
Android Device Policy'nin (ADP), uygulamanıza atanan rolleri bildirmek için NotificationReceiverService uygulayan sınıfınızın ComponentName değerini bilmesi gerekir. ADP tarafından otomatik olarak keşfedilebilmesi için hizmetinizi AndroidManifest.xml içinde uygun şekilde etiketlemeniz gerekir.
- Uygulamanızda tam olarak bir tane
enabledhizmeti olmalı ve bu hizmet,com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLESdeğerine eşitandroid:nameilemeta-dataiçermelidir. - Bu hizmette
android:exported,trueolarak ayarlanmalıdır. meta-dataöğesininandroid:valuedeğeri boş bir dize olarak ayarlanmalıdır.
<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 rolünü test ediyorsanız Android cihaz politikası'nın uygulamanıza yerel komut durumu güncellemeleri gönderebilmesi için hizmetinize aşağıdakini de eklemeniz gerekir:
meta-data
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_COMMAND_STATUS" android:value="" />
NotificationReceiverService'i genişleten bir hizmet oluşturun (veya mevcut hizmeti güncelleyin).
Mevcut NotificationReceiverService öğenizi oluşturun veya güncelleyin ve uygulamanıza atanan rolleri dinlemek için bir AppRolesListener uygulayın. Uygulamanıza atanan rolleri dinlemek için yalnızca getAppRolesListener() gereklidir. Uygulamanıza bir COMPANION_APP rolü atanmışsa getCommandListener() öğesini de uygulamanız gerekir:
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"
}
}
Rolleri birden fazla kez değişirse uygulamanız birden fazla kez bildirim alabilir. Tüm roller kaldırılırsa uygulamanız boş bir rol listesiyle bildirim almaya devam eder. Bu bildirim, uygulamanızı durdurulmuş durumdan çıkarır ve uygulamanıza verilen muafiyetlerle birlikte uygulamanız, kullanıcı etkileşimi olmadan kendisini başlatabilir. Uygulama rolleri bildirimi ve muafiyetleri sayesinde uygulamanız ACTION_BOOT_COMPLETED yayınlarını dinleyebilir. Uygulamanız, kendisini başlatmak için yönetilen yapılandırmalarına bağlıysa değişiklikleri nasıl okuyacağınızı ve dinleyeceğinizi öğrenmek için Yönetilen yapılandırmaları ayarlama başlıklı makaleyi inceleyin.
AMAPI SDK 1.9.0 sürümünden itibaren AppRolesSetRequest içindeki her rol, BT yöneticisinin politikada verdiği Role.ExtraCapabilities iznini de içerir. Örneğin, tamamlayıcı uygulama, yerel silme komutu vermesine izin verilip verilmediğini kontrol edebilir:
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()
}
Yalnızca BT yöneticisi ek özellikler verebilir. EnvironmentClient'ye ilettiğiniz bir rolde extraCapabilities değerini ayarlarsanız çağrı InvalidArgumentException ile başarısız olur.
Cihazı uygulama rolü politikalarıyla temel hazırlama
Uygulama geliştiriciler, EMM kullanarak veya Android Management API hızlı başlangıç kılavuzunu uygulayarak uygulamalarına uygulama rolleri atamayı test edebilirler. AMAPI Colab not defteri, bir kuruluş kaydetmenize,politika oluşturmanıza ve cihaz temel hazırlığı yapmanıza olanak tanır.
Uygulama rolleriyle uygulamanızın politikasını belirleme
ApplicationPolicy.roles kullanarak uygulamanızın sahip olması amaçlanan uygulama rolleriyle bir policy oluşturun.
Aşağıdaki örnekte, MTD uygulamaları için rolün nasıl yapılandırılacağı gösterilmektedir:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
Yalnızca COMPANION_APP rolü extraCapabilities özelliğini destekler. Tamamlayıcı uygulamanın cihazı veya iş profilini yerel olarak silmesine izin vermek için ilgili rolün extraCapabilities.localDeviceWipeCommand değerini LOCAL_DEVICE_WIPE_COMMAND_ALLOWED olarak ayarlayın.
Sistem, politikada belirtilen rolleri atamadan önce cihazdaki uygulama imzalama anahtarı sertifika parmak izinin Google Play Store'dakiyle eşleşip eşleşmediğini kontrol eder.
Parmak izi farklıysa roller uygulamaya atanmaz ve EMM'ye NonComplianceReason.APP_SIGNING_CERT_MISMATCH uyumsuzluğu bildirilir.
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"signingKeyCerts": [
{ "signingKeyCertFingerprintSha256": "base64-encoded-sha256" }
],
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
Uygulamanızda yönetilen yapılandırma varsa BT yöneticisi, uygulama politikasında ilgili restriction için bir ilk yapılandırma ayarlayabilir:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
],
"managedConfiguration": {
"<key>": "<value>"
}
}
]
}
Pil Muafiyeti Durumunu Doğrulama
Mobil Tehdit Savunması (MTD) rolüne sahip uygulamalar, standart arka plan güç kısıtlamalarından otomatik olarak muaf tutulur. Ancak bu muafiyet, sistemin Güç İzin Verilenler Listesi yerine Uygulamayı Beklemeye Alma Grubu tarafından uygulanır.
Uygulama muafiyetinin etkin olup olmadığını doğrulamak için:
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