Создание контроллера политик на устройствах

В этом руководстве описывается, как разработать контроллер политик устройств (DPC) для устройств, развернутых в Android Enterprise. Приложение DPC, ранее известное как контроллер рабочих политик, управляет локальными правилами для устройств и системными приложениями на устройствах.

О контроллерах политик на устройствах

При развертывании Android Enterprise компания сохраняет контроль над различными аспектами пользовательских устройств, например изолирует рабочую информацию от личных данных пользователей, предварительно настраивает одобренные приложения для среды или отключает возможности устройства (например, камеру).

Как поставщик услуг EMM, вы разрабатываете приложение DPC, которое ваши клиенты могут использовать вместе с консолью EMM и сервером. Клиент развертывает DPC на управляемых устройствах пользователей. Контроллер политики устройств служит связующим звеном между консолью (и сервером) EMM и устройством. Администратор использует консоль EMM для выполнения различных задач, включая настройку параметров устройств и приложений.

Контроллер политики создает рабочий профиль на устройстве, на котором он установлен, и управляет им. Рабочий профиль шифрует рабочую информацию и хранит ее отдельно от личных приложений и данных пользователей. Перед созданием рабочего профиля контроллер политики устройств также может подготовить корпоративный аккаунт Google Play для использования на устройстве.

В этом руководстве рассказывается, как разработать контроллер политики устройств, который может создавать рабочие профили и управлять ими.

Библиотека поддержки контроллера политик на устройствах для поставщиков услуг по управлению мобильной инфраструктурой предприятия

Библиотека поддержки DPC для EMM состоит из утилит и вспомогательных классов, которые упрощают инициализацию устройств Android и управление ими в корпоративной среде. Библиотека позволяет использовать важные функции в приложениях контроллера политики устройств:

  • Поддержка инициализации аккаунтов корпоративного Google Play. Для инициализации аккаунтов корпоративного Google Play из приложения контроллера политики устройств требуется, чтобы приложения Google Play и сервисов Google Play соответствовали минимальным требованиям к версии. Однако обновление этих приложений может быть сложным. Библиотека поддержки DPC отвечает за обновление этих приложений, а также обеспечивает совместимость с будущими обновлениями процесса инициализации корпоративных аккаунтов Google Play. Подробнее о поддержке инициализации корпоративных аккаунтов Google Play…
  • Поддержка управляемых конфигураций. Использование Play EMM API для работы с управляемыми конфигурациями одобренных приложений – самый простой способ реализовать управляемые конфигурации в контроллере политик устройств. Библиотека поддержки DPC позволяет делегировать Google Play задачу по применению управляемых конфигураций (ранее – ограничений для приложений), заданных администратором в консоли EMM. Использование Play EMM API для работы с управляемыми конфигурациями позволяет применять конфигурацию приложения атомарно во время установки. Подробнее о том, как включить эту функцию в DPC, рассказывается в статье Как применить управляемые конфигурации к рабочим приложениям.

Чтобы скачать библиотеку, выполните следующие действия: Задачи, описанные в этом руководстве, предполагают использование библиотеки поддержки DPC.

Скачайте библиотеку поддержки DPC

Чтобы использовать библиотеку поддержки контроллера политик, скачайте ее из сообщества поставщиков услуг по управлению мобильной инфраструктурой Android Enterprise. При создании приложения DPC необходимо добавить библиотеку в файл build.gradle и позаботиться о других зависимостях. Например, для библиотеки требуется клиентская библиотека аутентификации сервисов Google Play версии 11.4.0.

  1. Добавьте библиотеку в файл build.gradle:

    Яркий

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

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
  2. Добавьте клиентскую библиотеку аутентификации сервисов Google Play версии 11.4.0 в файл build.gradle:

    Яркий

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

    Kotlin

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

Для работы библиотеки требуются определенные разрешения, поэтому при загрузке приложения в Google Play необходимо добавить их в манифест приложения DPC:

  <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"/>

Помимо этих предварительных шагов по настройке и развертыванию, вам также необходимо инициализировать определенные функции библиотеки в коде DPC в зависимости от того, что вы хотите реализовать. Подробная информация приведена в соответствующих разделах ниже.

Создание контроллера политик на устройствах

Создайте контроллер политики на основе существующей модели, используемой для приложений администрирования устройств. В частности, в приложении должен быть подкласс DeviceAdminReceiver (класс из пакета android.app.admin), как описано в статье Администрирование устройств.

Как создать рабочий профиль

Пример создания базового рабочего профиля можно найти в разделе BasicManagedProfile на сайте GitHub.

Чтобы создать рабочий профиль на устройстве, на котором уже есть личный профиль, сначала проверьте, поддерживает ли устройство рабочий профиль. Для этого убедитесь, что на устройстве есть системная функция 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!
}

Если устройство поддерживает рабочие профили, создайте рабочий профиль, отправив намерение с действием ACTION_PROVISION_MANAGED_PROFILE. В некоторых документах управляемый профиль – это общий термин, который означает то же самое, что и рабочий профиль в контексте Android Enterprise. Укажите название пакета администратора устройства в качестве дополнительного параметра:

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();
}

В ответ на это намерение система выполняет следующие действия:

  • Проверяет, зашифровано ли устройство. Если это не так, система предложит пользователю зашифровать устройство, прежде чем продолжить.
  • Создает рабочий профиль.
  • Удаляет необязательные приложения из рабочего профиля.
  • Копирует приложение DPC в рабочий профиль и назначает DPC владельцем профиля.

Переопределите onActivityResult(), чтобы проверить, успешно ли выполнена инициализация:

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);
    }
}

Завершите настройку рабочего профиля

После настройки профиля система вызывает метод DeviceAdminReceiver.onProfileProvisioningComplete() приложения DPC. Переопределите этот метод обратного вызова, чтобы завершить включение рабочего профиля.

Обычно DeviceAdminReceiver.onProfileProvisioningComplete() обратный вызов выполняет следующие действия:

Активируйте рабочий профиль

После этого вызовите метод setProfileEnabled() менеджера правил для устройств, чтобы активировать рабочий профиль.

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);

Настройте правила для устройств

Приложение DPC применяет правила для устройств, заданные администратором в соответствии с требованиями и ограничениями организации. Например, правила безопасности могут требовать, чтобы устройства блокировались после определенного количества неудачных попыток ввода пароля. DPC запрашивает у консоли EMM текущие правила, а затем применяет их с помощью Device Administration API.

Подробнее о том, как применять правила для устройств…

Как применить управляемые конфигурации к рабочим приложениям

Управляемые конфигурации позволяют клиентам предварительно настраивать приложения, одобренные для развертывания, и легко обновлять их при необходимости. Настройка приложения перед развертыванием гарантирует, что при установке приложения на целевом устройстве будут соблюдены требования безопасности и другие правила организации.

Возможности приложения определяются разработчиком приложений в XML-схеме (схеме управляемых конфигураций), которая загружается в Google Play вместе с приложением. Подробную информацию для разработчиков приложений можно найти в статье Как настроить управляемые конфигурации.

Вы получаете эту схему из приложения, чтобы показать ее администраторам клиентов в консоли EMM, предоставляете интерфейс, в котором отображаются различные параметры, определенные в схеме, и позволяете администраторам предварительно настраивать параметры приложения. Полученная управляемая конфигурация, заданная администратором, обычно хранится на сервере EMM, который затем использует Play EMM API, чтобы задать Managedconfigurationsfordevice или Managedconfigurationsforuser. Подробную информацию можно найти в статье Управляемые конфигурации в Google Play.

Управляемые конфигурации можно применить к приложению с помощью Play EMM API (рекомендуемый способ) или непосредственно из контроллера политик устройств (описано в разделе Применение управляемых конфигураций непосредственно из контроллера политик устройств). У Play EMM API есть несколько преимуществ, в том числе простота реализации, поскольку вы можете использовать библиотеку поддержки DPC для упрощения задач DPC. Кроме того, Play EMM API:

  • При установке нового приложения конфигурация задается автоматически, поэтому оно готово к работе сразу после первого запуска.
  • Позволяет управлять конфигурациями на уровне пользователя, чтобы не отслеживать инициализацию на уровне устройства.

Как применять управляемые конфигурации с помощью Play EMM API

Чтобы использовать Play EMM API для управляемых конфигураций, DPC должен разрешить Google Play задавать конфигурации. Библиотека поддержки DPC берет на себя эту задачу, проксируя конфигурацию, отправленную Google Play.

Чтобы использовать Play EMM API, скачайте библиотеку поддержки контроллера политики устройств и включите поддержку управляемых конфигураций в контроллере.

Включите поддержку управляемых конфигураций в контроллере политик устройств

Импортируйте этот класс в DPC:

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

Инициализируйте библиотеку управляемых конфигураций. В этом примере admin – это ComponentName для DeviceAdminReceiver.

Kotlin

var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)

Java

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

Включите управляемые конфигурации:

Kotlin

managedConfigurationsSupport.enableManagedConfigurations()

Java

managedConfigurationsSupport.enableManagedConfigurations();

Инициализировав эту библиотеку в контроллере, вы сможете использовать Google Play EMM API в консоли и на сервере EMM, чтобы применять управляемые конфигурации к одобренным приложениям, вместо того чтобы программировать эти задачи непосредственно в контроллере. Подробнее об управляемых конфигурациях в Google Play…

Применение управляемых конфигураций непосредственно из DPC

Чтобы изменить настройки конфигурации приложения непосредственно из DPC, вызовите метод DevicePolicyManager.setApplicationRestrictions() и передайте параметры для DeviceAdminReceiver приложения DPC, название пакета целевого приложения и Bundle, содержащий управляемую конфигурацию приложения, заданную администратором. Подробнее о том, как взаимодействуют контроллер политик устройств и консоль EMM и как настроить управляемые конфигурации… Однако обратите внимание, что этот альтернативный подход к применению управляемых конфигураций не рекомендуется для развертываний корпоративных аккаунтов Google Play.

Поддержка подготовки аккаунтов корпоративного Google Play

Библиотека поддержки DPC включает поддержку для подготовки аккаунтов корпоративного Google Play. Чтобы использовать эту поддержку, сначала необходимо инициализировать библиотеку, а затем вы можете проверить рабочую среду и добавить корпоративный аккаунт Google Play.

Инициализируйте поддержку корпоративных аккаунтов Google Play в контроллере политик устройств

Импортируйте этот класс в DPC:

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

Инициализируйте библиотеку совместимости инициализации. В этом примере admin – это ComponentName DeviceAdminReceiver.

Kotlin

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Java

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

Обеспечьте рабочую среду для корпоративных аккаунтов Google Play

После того как контроллер политик настроит устройство в режиме владельца профиля (ACTION_PROVISION_MANAGED_PROFILE) или владельца устройства (ACTION_PROVISION_MANAGED_DEVICE), убедитесь, что устройство поддерживает корпоративные аккаунты Google Play, вызвав следующий метод:

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

Обратный вызов сообщает об успешном или неудачном завершении этого процесса. После успешного выполнения обратного вызова можно добавить корпоративный аккаунт Google Play. Если обратный вызов сообщает об ошибке, попросите пользователя убедиться, что устройство подключено к сети (например, если не удается выполнить скачивание). В остальных случаях сообщите о сбое в 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)
    }
}

Как добавить корпоративный аккаунт Google Play

AccountManager фреймворка Android может добавить на устройство корпоративный аккаунт Google Play. Чтобы упростить взаимодействие с AccountManager, используйте вспомогательную функцию (показана в примере ниже) из библиотеки поддержки DPC. Функция обрабатывает токен, возвращенный сервером Google Play, и упрощает подготовку аккаунта корпоративного Google Play. Функция возвращает значение, когда корпоративный аккаунт Google Play находится в допустимом состоянии:

Kotlin

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)

Java

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token – токен аутентификации пользователя, сгенерированный вызовом Users.generateAuthenticationToken() Google Play EMM API.
  • accountAddedCallback – возвращает корпоративный аккаунт Google Play, который был успешно добавлен на устройство. Этот обратный вызов должен включать методы onAccountReady() и 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).
        }
};
  • Подробнее об API Device Administration…
  • Информацию о способах инициализации Android Enterprise можно найти в разделе Инициализация устройств руководства для разработчиков Android Enterprise.
  • Пример создания базового рабочего профиля можно найти на сайте GitHub.
  • Пример кода, демонстрирующий, как задавать конфигурации для других приложений от имени владельца профиля, можно найти на GitHub.