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

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

О ЦОДах

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

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

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

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

Библиотека поддержки ЦОД для EMM

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

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

Следуйте инструкциям ниже, чтобы загрузить библиотеку. Задачи, подробно описанные в этом руководстве, предполагают использование библиотеки поддержки 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_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 :

Котлин

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

Ява

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

Ява

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

Ява

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

Ява

// 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 применяет политики устройства, установленные администратором, в соответствии с требованиями и ограничениями организации. Например, политика безопасности может требовать, чтобы устройства блокировались после определенного количества неудачных попыток ввода пароля. ЦОД запрашивает у консоли EMM текущие политики, а затем применяет политики с помощью API администрирования устройств .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Котлин

var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)

Ява

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

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

Котлин

managedConfigurationsSupport.enableManagedConfigurations()

Ява

managedConfigurationsSupport.enableManagedConfigurations();

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

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

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

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

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

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

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

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

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

Котлин

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Ява

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

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

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

Котлин

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Ява

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

Ява

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 находится в допустимом состоянии:

Котлин

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)

Ява

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token — токен аутентификации пользователя, созданный вызовом Users.generateAuthenticationToken() Google Play EMM API.
  • 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).
    }
}

Ява

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