Uygulama rolleri özelliği, bir BT yöneticisinin Android destekli bir cihazda yönetilen bir uygulamaya özel ayrıcalıklar vermesine olanak tanır. Belirli bir rol atandığında uygulama, güç ve arka plan kısıtlamalarından, askıya alma işleminden, hazırda bekleme modundan (Android 14 ve sonraki sürümlerde) muaf tutulabilir ve kullanıcı kontrolleri (ör.uygulamayı durdurmaya zorlama ve uygulama verilerini temizleme gibi kullanıcı işlemleri) devre dışı bırakılabilir (Android 11 ve sonraki sürümlerde). Böylece uygulama, kritik işlevini kesintisiz olarak gerçekleştirebilir. Ayrıca, uygulamaya atanan roller hakkında bildirim gönderilebilir. Bu sayede uygulama, kullanıcı müdahalesi olmadan kendini başlatabilir.
Kullanılabilen 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önetiliyor (özel bir DPC kullanan EMM'ler desteklenmez).
Uygulamanızı özelliği kullanmaya hazırlama
AMAPI SDK'sı ile entegrasyon yalnızca uygulamanın, kendisine atanan rollerden haberdar olmak ve böylece kendini başlatmak (ör. kullanıcı etkileşimi olmadan otomatik olarak başlatmak) istemesi durumunda gereklidir.
Uygulamanızda AMAPI SDK'sı ile entegrasyon yapma
AMAPI SDK ve bu SDK'yı uygulamanıza ekleme hakkında daha fazla bilgiyi AMAPI SDK entegrasyon kılavuzunda bulabilirsiniz.
Uygulamanın manifest dosyasına gerekli meta verileri ekleyin.
Android Device Policy (ADP), uygulamanızı atanan roller hakkında bilgilendirmek için NotificationReceiverService'ı uygulayan sınıfınızın ComponentName bilgisini bilmelidir. Hizmetinizi AndroidManifest.xml içinde uygun şekilde etiketlemeniz gerekir. Böylece hizmetiniz ADP tarafından otomatik olarak keşfedilebilir.
- Uygulamanızda tam olarak bir hizmet olmalı ve bu hizmet
enabledolmalıdır. Ayrıca,meta-dataileandroid:namedeğericom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLESdeğerine eşit olmalıdır. - Bu hizmette
android:exported,trueolarak ayarlanmalıdır. meta-dataöğesininandroid:valueözelliği 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 Device Policy'nin uygulamanıza yerel komut durumu güncellemeleri gönderebilmesi için hizmetinize aşağıdaki meta-data öğesini de eklemeniz gerekir:
<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 COMPANION_APP rolü atanırsa getCommandListener() 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 bilgilendirilebilir. Tüm roller kaldırılırsa uygulamanıza yine de boş bir rol listesiyle bildirim gönderilir. Bu bildirim, uygulamanızı durdurulmuş durumdan çıkarır ve uygulamanıza verilen muafiyetlerle birlikte, uygulamanız herhangi bir kullanıcı etkileşimi olmadan kendini başlatabilir. Uygulama rolleri bildirimi ve muafiyetler sayesinde uygulamanız ACTION_BOOT_COMPLETED yayınlarını dinleyebilir. Uygulamanızın kendi kendini başlatmak için yönetilen yapılandırmalara bağımlılığı varsa değişiklikleri okuma ve işleyici hakkında bilgi edinmek için Yönetilen yapılandırmaları ayarlama başlıklı makaleyi inceleyin.
Cihazı uygulama rolleri politikalarıyla sağlama
Uygulama geliştiriciler, bir EMM kullanarak veya Android Management API hızlı başlangıç kılavuzunu izleyerek uygulamalarına uygulama rolleri atamayı test edebilir. AMAPI Colab not defteri, bir işletmeyi kaydetmenize,politika oluşturmanıza ve cihaz sağlama işlemini gerçekleştirmenize 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" }
]
}
]
}
Sistem, politikada belirtilen rolleri atamadan önce cihazdaki uygulamanın imzalama anahtarı sertifikası parmak izinin Play Store'dakiyle eşleşip eşleşmediğini kontrol eder.
Parmak izi farklıysa roller uygulamaya atanmaz ve NonComplianceReason.APP_SIGNING_CERT_MISMATCH
uygunsuzluk EMM'ye 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ındaki ilgili restriction'ler için ilk yapılandırmayı 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üç izin 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