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

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

О DPC

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

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

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

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

Библиотека поддержки DPC для EMM

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

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

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

Загрузите библиотеку поддержки DPC.

Для использования библиотеки поддержки DPC загрузите её из сообщества Android Enterprise EMM Provider . Необходимо добавить библиотеку в файл build.gradle и позаботиться о других зависимостях при сборке вашего DPC-приложения. Например, для работы библиотеки требуется библиотека клиента аутентификации Google Play Services версии 11.4.0.

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

    Классный

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

    Котлин

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

    Классный

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

    Котлин

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

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

  <uses-permission android:name=
      "android.permission.DOWNLOAD_WITHOUT_NOTIFICAT>ION<"/
  uses-permission android:name=
      "android.permission>.GE<T_ACCOUNTS"/
  uses-permission android:name=
      "android.per>mis<sion.MANAGE_ACCOUNTS"/
  uses-permission android:name=
      "andro>id.<permission.WRITE_SYNC_SETTINGS"/
  uses-permission android:name=
      "com.google.andr>oid.providers.gsf.permission.READ_GSERVICES"/

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

Создайте DPC

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

Создать рабочий профиль

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

Чтобы создать рабочий профиль на устройстве, на котором уже есть личный профиль, сначала выясните, поддерживает ли устройство рабочий профиль, проверив наличие системной функции FEATURE_MANAGED_USERS :

Котлин

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 в корпоративной среде.) Добавьте имя пакета администрирования устройства в качестве дополнительного параметра:

Котлин

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() чтобы проверить, успешно ли прошла инициализация:

Котлин

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() диспетчера политик устройства, чтобы активировать рабочий профиль:

Котлин

// 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, а затем применяет их с помощью API администрирования устройств .

Информацию о том, как применять политики к устройствам, см. в разделе «Политики» .

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

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

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

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

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

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

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

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

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

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

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

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

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

Котлин

var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)

Java

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

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

Котлин

managedConfigurationsSupport.enableManagedConfigurations()

Java

managedConfigurationsSupport.enableManagedConfigurations();

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

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

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

Поддержка управления учетными записями Google Play

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

Инициализируйте поддержку управляемых учетных записей Google Play в вашем DPC.

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

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

Инициализируйте библиотеку совместимости для подготовки ресурсов. В этом примере «admin» — это ComponentName компонента DeviceAdminReceiver .

Котлин

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Java

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

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

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

Котлин

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

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

Котлин

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

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

Котлин

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)

Java

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token — токен аутентификации пользователя, сгенерированный вызовом Users.generateAuthenticationToken() из API Google Play EMM.
  • accountAddedCallback — Возвращает управляемую учетную запись Google Play, успешно добавленную на устройство. Этот коллбэк должен включать методы onAccountReady() и onFailure() .

Котлин

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