Creare un controller dei criteri dei dispositivi

Questa guida descrive come sviluppare un controller dei criteri dei dispositivi (DPC) per i dispositivi in una distribuzione aziendale di Android. Un'app DPC, precedentemente nota come controller delle norme di lavoro, controlla i criteri locali dei dispositivi e le applicazioni di sistema sui dispositivi.

Informazioni sui DPC (controller criteri dispositivi)

In un deployment di Android Enterprise, un'azienda mantiene il controllo su vari aspetti dei dispositivi degli utenti, come l'isolamento delle informazioni di lavoro dai dati personali degli utenti, la preconfigurazione delle app approvate per l'ambiente o la disattivazione delle funzionalità dei dispositivi (ad esempio la fotocamera).

In qualità di EMM, sviluppi un'app DPC che può essere utilizzata dai clienti insieme alla console EMM e al server. Il cliente implementa il DPC sui dispositivi degli utenti che gestisce. Il DPC funge da ponte tra la console EMM (e il server) e il dispositivo. Un amministratore utilizza la console EMM per eseguire una serie di attività, inclusa la configurazione delle impostazioni del dispositivo e delle app.

Il DPC crea e gestisce il profilo di lavoro sul dispositivo su cui è installato. Il profilo di lavoro cripta le informazioni di lavoro e le mantiene separate dalle app e dai dati personali degli utenti. Prima di creare il profilo di lavoro, il DPC può anche eseguire il provisioning di un account Google Play gestito da utilizzare sul dispositivo.

Questa guida spiega come sviluppare un DPC (controller criteri dispositivi) in grado di creare e gestire i profili di lavoro.

Libreria di supporto DPC per EMM

La DPC Support Library per EMM include classi di utilità e helper che facilitano il provisioning e la gestione dei dispositivi Android in un ambiente aziendale. La libreria consente di sfruttare funzionalità importanti delle app DPC:

  • Assistenza per il provisioning degli account Google Play gestiti: Il provisioning degli account Google Play gestiti dall'app DPC richiede che le app Google Play e Google Play Services soddisfino i requisiti minimi relativi alla versione. Tuttavia, aggiornare queste app può essere complesso. La libreria di supporto DPC si occupa dell'aggiornamento di queste app e garantisce inoltre la compatibilità con i futuri aggiornamenti del processo di provisioning degli account Google Play gestiti. Per maggiori dettagli, consulta Assistenza per il provisioning degli account Google Play gestiti.
  • Supporto delle configurazioni gestite: l'utilizzo dell'API EMM di Google Play per gestire le configurazioni gestite per le app approvate è il modo più semplice per implementare le configurazioni gestite sul tuo DPC. La libreria di assistenza DPC ti consente di delegare a Google Play l'attività di applicazione delle configurazioni gestite (in precedenza limitazioni delle app) impostate dall'amministratore tramite la console EMM. L'utilizzo dell'API Play EMM per gestire le configurazioni gestite consente di applicare la configurazione dell'app a livello atomico durante l'installazione. Per ulteriori informazioni su come attivare questa funzionalità nel tuo DPC, consulta Applicazione di configurazioni gestite alle app di lavoro.

Per scaricare la raccolta, procedi nel seguente modo. Le attività descritte in questa guida presuppongono l'uso della DPC Support Library.

Scarica la DPC Support Library

Per utilizzare la DPC Support Library, scaricala dalla community dei provider EMM di Android Enterprise. Devi aggiungere la libreria al file build.gradle e occuparti di altre dipendenze quando crei l'app DPC. Ad esempio, la libreria richiede la libreria client di autenticazione di Google Play Services 11.4.0.

  1. Aggiungi la raccolta al file build.gradle:

    Trendy

    implementation(name:'dpcsupport-yyyymmdd', ext:'aar')
    

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
    
  2. Aggiungi la libreria client di autenticazione di Google Play Services alla versione 11.4.0 al file build.gradle:

    Trendy

    implementation 'com.google.android.gms:play-services-auth:11.4.0'
    

    Kotlin

    implementation("com.google.android.gms:play-services-auth:11.4.0")
    

L'esecuzione della libreria richiede determinate autorizzazioni, che devi quindi aggiungere al file manifest dell'app DPC quando la carichi su Google Play:

  <uses-permission android:name=
      "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
  <uses-permission android:name=
      "android.permission.GET_ACCOUNTS"/>
  <uses-permission android:name=
      "android.permission.MANAGE_ACCOUNTS"/>
  <uses-permission android:name=
      "android.permission.WRITE_SYNC_SETTINGS"/>
  <uses-permission android:name=
      "com.google.android.providers.gsf.permission.READ_GSERVICES"/>

Oltre a questi passaggi preliminari di configurazione e deployment, devi anche inizializzare la funzionalità di libreria specifica nel codice DPC, a seconda della capacità che vuoi implementare. I dettagli sono inclusi nelle sezioni pertinenti di seguito.

Crea un DPC (controller criteri dispositivi)

Crea il tuo DPC sul modello esistente utilizzato per le applicazioni di amministrazione del dispositivo. In particolare, la tua app deve sottoclasse DeviceAdminReceiver (una classe del pacchetto android.app.admin) come descritto in Amministrazione dispositivo.

Crea un profilo di lavoro

Per un esempio che illustra come creare un profilo di lavoro di base, vedi BasicManagedProfile su GitHub.

Per creare un profilo di lavoro su un dispositivo in cui è già presente un profilo personale, verifica innanzitutto se il dispositivo è in grado di supportarlo, verificando l'esistenza della funzionalità di sistema FEATURE_MANAGED_USERS:

Kotlin

if (!packageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {
    // This device does not support work profiles!
}

Java

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {
    // This device does not support work profiles!
}

Se il dispositivo supporta i profili di lavoro, creane uno inviando un intent con un'azione ACTION_PROVISION_MANAGED_PROFILE. In alcuni documenti, profilo gestito è un termine generico che equivale a profilo di lavoro nel contesto di Android nell'azienda. Includi come extra il nome del pacchetto di amministrazione del dispositivo:

Kotlin

val provisioningActivity = getActivity()

// You'll need the package name for the DPC app.
val myDPCPackageName = "com.example.myDPCApp"

// Set up the provisioning intent
val adminComponent = ComponentName(provisioningActivity.applicationContext, MyAdminReceiver::class.java)
provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString())
if (provisioningIntent.resolveActivity(provisioningActivity.packageManager) == null) {
    // No handler for intent! Can't provision this device.
    // Show an error message and cancel.
} else {
    // REQUEST_PROVISION_MANAGED_PROFILE is defined
    // to be a suitable request code
    startActivityForResult(provisioningIntent,
            REQUEST_PROVISION_MANAGED_PROFILE)
    provisioningActivity.finish()
}

Java

Activity provisioningActivity = getActivity();
// You'll need the package name for the DPC app.
String myDPCPackageName = "com.example.myDPCApp";
// Set up the provisioning intent
Intent provisioningIntent =
        new Intent("android.app.action.PROVISION_MANAGED_PROFILE");
ComponentName adminComponent = new ComponentName(provisioningActivity.getApplicationContext(), MyAdminReceiver.class);
provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString());
if (provisioningIntent.resolveActivity(provisioningActivity.getPackageManager())
         == null) {
    // No handler for intent! Can't provision this device.
    // Show an error message and cancel.
} else {
    // REQUEST_PROVISION_MANAGED_PROFILE is defined
    // to be a suitable request code
    startActivityForResult(provisioningIntent,
            REQUEST_PROVISION_MANAGED_PROFILE);
    provisioningActivity.finish();
}

Il sistema risponde a questo intento nel seguente modo:

  • Verifica che il dispositivo sia criptato. In caso contrario, il sistema chiede all'utente di criptare il dispositivo prima di procedere.
  • Crea un profilo di lavoro.
  • Rimuove le applicazioni non obbligatorie dal profilo di lavoro.
  • Copia l'app DPC nel profilo di lavoro e imposta il DPC stesso come proprietario del profilo.

Esegui l'override di onActivityResult() per verificare se il provisioning è riuscito:

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    // Check if this is the result of the provisioning activity
    if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) {
        // If provisioning was successful, the result code is
        // Activity.RESULT_OK
        if (resultCode == Activity.RESULT_OK) {
            // Work profile created and provisioned.
        } else {
            // Provisioning failed.
        }
        return
    } else {
        // This is the result of some other activity. Call the superclass.
        super.onActivityResult(requestCode, resultCode, data)
    }
}

Java

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check if this is the result of the provisioning activity
    if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) {
        // If provisioning was successful, the result code is
        // Activity.RESULT_OK
        if (resultCode == Activity.RESULT_OK) {
            // Work profile created and provisioned.
        } else {
            // Provisioning failed.
        }
        return;
    } else {
        // This is the result of some other activity. Call the superclass.
        super.onActivityResult(requestCode, resultCode, data);
    }
}

Completa l'attivazione del profilo di lavoro

Una volta eseguito il provisioning del profilo, il sistema chiama il metodo DeviceAdminReceiver.onProfileProvisioningComplete() dell'app DPC. Esegui l'override di questo metodo di callback per completare l'attivazione del profilo di lavoro.

Un'implementazione tipica del callback DeviceAdminReceiver.onProfileProvisioningComplete():

Attiva il profilo di lavoro

Una volta completate queste attività, chiama il metodo setProfileEnabled() del gestore dei criteri dei dispositivi per attivare il profilo di lavoro:

Kotlin

// Get the device policy manager
val myDevicePolicyMgr = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val componentName = myDeviceAdminReceiver.getComponentName(this)
// Set the name for the newly created work profile.
myDevicePolicyMgr.setProfileName(componentName, "My New Work Profile")
// ...and enable the profile
myDevicePolicyMgr.setProfileEnabled(componentName)

Java

// Get the device policy manager
DevicePolicyManager myDevicePolicyMgr =
        (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName componentName = myDeviceAdminReceiver.getComponentName(this);
// Set the name for the newly created work profile.
myDevicePolicyMgr.setProfileName(componentName, "My New Work Profile");
// ...and enable the profile
myDevicePolicyMgr.setProfileEnabled(componentName);

Configurare i criteri relativi ai dispositivi

L'app DPC applica i criteri relativi ai dispositivi impostati da un amministratore per soddisfare i requisiti e i vincoli di un'organizzazione. Ad esempio, il criterio di sicurezza potrebbe richiedere il blocco dei dispositivi dopo un determinato numero di tentativi di inserimento della password non riusciti. Il DPC invia una query alla console EMM per conoscere i criteri correnti, quindi applica i criteri utilizzando l'API Amministrazione dispositivo.

Per informazioni su come applicare i criteri relativi ai dispositivi, vedi Criteri.

Applica configurazioni gestite alle app di lavoro

Le configurazioni gestite ti consentono di offrire ai tuoi clienti la possibilità di preconfigurare le app approvate per il deployment e di aggiornarle facilmente quando la configurazione deve cambiare. La configurazione di un'app prima del deployment garantisce che la sicurezza e altri criteri dell'organizzazione vengano soddisfatti al momento dell'installazione dell'app sul dispositivo di destinazione.

Le funzionalità dell'app sono definite dallo sviluppatore dell'app in uno schema XML (lo schema delle configurazioni gestite) che accompagna l'app al momento del caricamento su Google Play (per maggiori dettagli, vedi Configurare le configurazioni gestite).

Puoi recuperare questo schema dall'app affinché venga mostrato agli amministratori dei tuoi clienti nella console EMM, fornire un'interfaccia utente in cui vengono visualizzate le varie opzioni definite nello schema e consentire agli amministratori di preconfigurare le impostazioni dell'app. La configurazione gestita risultante impostata dall'amministratore viene in genere archiviata sul server EMM, che utilizza l'API EMM di Google Play per impostare Managedconfigurationsfordevice o Managedconfigurationsforuser. Per i dettagli, vedi Configurazioni gestite tramite Play.

Le configurazioni gestite possono essere applicate all'app utilizzando l'API EMM di Google Play (approccio consigliato) o direttamente dal DPC (come descritto nella sezione Applicare le configurazioni gestite direttamente dall'DPC). L'utilizzo dell'API EMM di Play presenta diversi vantaggi, tra cui una facile implementazione perché puoi utilizzare la DPC Support Library per semplificare le attività DPC. Inoltre, l'API EMM di Google Play:

  • Imposta la configurazione a livello atomico quando viene installata una nuova app, garantendo così che l'app sia pronta la prima volta che l'utente lancia l'app.
  • Consente di gestire le configurazioni per singolo utente, in modo da evitare di monitorare il provisioning in base al dispositivo.

Applica le configurazioni gestite utilizzando l'API EMM di Google Play

Per utilizzare l'API EMM di Google Play per le configurazioni gestite, il DPC deve consentire a Google Play di impostare le configurazioni. La DPC Support Library si occupa di questo compito eseguendo il proxy della configurazione inviata da Google Play.

Per utilizzare l'API Play EMM, scarica la DPC Support Library, quindi abilita il supporto delle configurazioni gestite nel tuo DPC.

Abilita il supporto delle configurazioni gestite nel tuo DPC

Importa questa classe nel DPC:

com.google.android.apps.work.dpcsupport.ManagedConfigurationsSupport

Inizializzare la libreria delle configurazioni gestite. In questo esempio, "admin" è il nomeComponente di DeviceAdminRicevir.

Kotlin

var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)

Java

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

Abilita le configurazioni gestite:

Kotlin

managedConfigurationsSupport.enableManagedConfigurations()

Java

managedConfigurationsSupport.enableManagedConfigurations();

Con questa libreria inizializzata nel tuo DPC, puoi utilizzare l'API EMM di Google Play nella console e nel server EMM per applicare configurazioni gestite alle app approvate, anziché codificare queste attività direttamente nell'DPC. Per i dettagli, consulta Configurazioni gestite tramite Play.

Applica le configurazioni gestite direttamente dal DPC (controller criteri dispositivi)

Per modificare le impostazioni di configurazione di un'app direttamente dal DPC, chiama il metodo DevicePolicyManager.setApplicationNetworks() e trasmetti i parametri per DeviceAdminRicevir dell'app DPC, il nome del pacchetto dell'app di destinazione e il Bundle che comprende la configurazione gestita dell'app impostata dall'amministratore. Per maggiori dettagli, consulta Modalità di interazione tra console EMM e DPC e Configurare le configurazioni gestite. Tuttavia, tieni presente che questo approccio alternativo all'applicazione delle configurazioni gestite non è consigliato nelle implementazioni degli account della versione gestita di Google Play.

Assistenza per il provisioning dell'account della versione gestita di Google Play

La DPC Support Library include il supporto per il provisioning degli account della versione gestita di Google Play. Per utilizzare questo tipo di assistenza, devi prima inizializzare la libreria, quindi puoi verificare l'ambiente di lavoro e aggiungere un account della versione gestita di Google Play.

Inizializza l'assistenza per gli account Google Play gestiti nel tuo DPC (controller criteri dispositivi)

Importa questa classe nel DPC:

com.google.android.apps.work.dpcsupport.AndroidForWorkAccountSupport

Inizializzare la libreria di compatibilità del provisioning. In questo esempio, "admin" è il ComponentName del DeviceAdminReceiver.

Kotlin

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Java

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

Assicurati che l'ambiente di lavoro per gli account della versione gestita di Google Play

Dopo che il DPC ha eseguito il provisioning di un dispositivo in modalità proprietario del profilo (ACTION_PROVISION_MANAGED_PROFILE) o proprietario del dispositivo (ACTION_PROVISION_MANAGED_DEVICE), assicurati che il dispositivo possa supportare gli account della versione gestita di Google Play chiamando:

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

Il callback segnala l'esito positivo o negativo della procedura. Quando il callback viene ripristinato, è possibile aggiungere un account della versione gestita di Google Play. Se il callback segnala un errore, chiedi all'utente di assicurarsi che il dispositivo abbia una connessione di rete (ad esempio, se il download non va a buon fine). In altri casi, segnala l'errore a Google.

Kotlin

object : WorkingEnvironmentCallback() {
    override fun onSuccess() {
        // Can now provision the managed Google Play Account
    }
    override fun onFailure(error: Error) {
        // Notify user, handle error (check network connection)
    }
}

Java

new WorkingEnvironmentCallback() {
    @Override
    public void onSuccess() {
        // Can now provision the managed Google Play Account
    }

    @Override
    public void onFailure(Error error) {
        // Notify user, handle error (check network connection)
    }
}

Aggiungere un account della versione gestita di Google Play

L'elemento AccountManager del framework Android può aggiungere un account della versione gestita di Google Play a un dispositivo. Per semplificare l'interazione con AccountManager, utilizza la funzione helper (mostrata nell'esempio di seguito) dalla DPC Support Library. La funzione gestisce il token restituito dal server di Google Play e facilita il provisioning dell'account della versione gestita di Google Play. La funzione restituisce quando l'account della versione gestita di Google Play è in uno stato valido:

Kotlin

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)

Java

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token: il token di autenticazione dell'utente generato dalla chiamata Users.generateAuthenticationToken() dell'API EMM di Google Play.
  • accountAddedCallback: restituisce l'account della versione gestita di Google Play che è stato aggiunto correttamente al dispositivo. Questo callback deve includere i metodi onAccountReady() e onFailure().

Kotlin

val workAccountAddedCallback = object : WorkAccountAddedCallback() {
    override fun onAccountReady(account: Account, deviceHint: String) {
        // Device account was successfully added to the device
        // and is ready to be used.
    }

    override fun onFailure(error: Error) {
        // The account was not successfully added. Check that the token
        // provided was valid (it expires after a certain period of time).
    }
}

Java

WorkAccountAddedCallback workAccountAddedCallback =
    new WorkAccountAddedCallback() {
        @Override
        public void onAccountReady(Account account, String deviceHint) {
            // Device account was successfully added to the device
            // and is ready to be used.
        }

        @Override
        public void onFailure(Error error) {
            // The account was not successfully added. Check that the token
            // provided was valid (it expires after a certain period of time).
        }
};