构建设备政策控制器

本指南介绍了如何开发适用于 Android 设备的设备政策控制器 (DPC)。 在 Android Enterprise 部署中部署。DPC 应用(之前已知) 作为工作政策控制器,控制本地设备政策和系统 应用。

<ph type="x-smartling-placeholder">

关于设备政策控制器 (DPC)

在 Android 企业部署中,企业会维护对 用户设备的各个方面,例如隔离工作相关 从用户的个人数据、预先配置已获批准的应用 环境或停用设备功能(例如相机)。

作为 EMM,您开发了可供客户使用的 DPC 应用 与您的 EMM 控制台关联,并 服务器。您的客户将 DPC 部署到他们管理的用户设备。 DPC 充当您的 EMM 控制台(与服务器)与设备之间的桥梁。 管理员可使用 EMM 控制台执行一系列任务,包括 配置设备设置和应用。

DPC 会在安装它的设备上创建和管理工作资料。 工作资料会加密与工作相关的信息,并将其与工作相关的信息 用户的个人应用和数据在创建工作资料之前,设备政策控制器 (DPC) 还可以 配置要在设备上使用的 Google Play 企业版账号。

本指南介绍了如何开发可以创建和管理工作资料的 DPC。

适用于 EMM 的 DPC 支持库

适用于 EMM 的 DPC 支持库包含实用程序和帮助程序类, 协助配置和管理企业中的 Android 设备 环境该库可让您在自己的 DPC 应用:

  • Google Play 企业版账号配置支持: 受管配置 若要通过 DPC 应用获取 Google Play 账号,Google Play 和 Google Play 服务应用满足最低版本要求。然而,更新这些 可能很复杂。DPC 支持库负责更新这些 应用,同时还可确保与托管式 Google 服务的未来更新兼容 Play 账号配置过程。 查看 Google Play 企业版账号 预配支持了解详情。
  • 托管配置支持: 使用 Play EMM API 处理获批应用的托管配置是 在 DPC 上实现托管配置的最简单方法。DPC 支持 您可以利用库,委托 Google Play 执行将应用托管 管理员使用您的 EMM 设置的配置(以前称为应用限制) 控制台。使用 Play EMM API 处理受管配置可让 要在安装过程中以原子方式应用的应用配置。请参阅 应用受管配置 工作应用。详细了解如何在 设备政策控制器 (DPC)。

请按照以下步骤下载该库。本指南中详细介绍的任务 且假设使用 DPC 支持库。

下载 DPC 支持库

如需使用 DPC 支持库,请从 Android Enterprise EMM 提供商社区下载该库。 您必须将该库添加到 build.gradle 文件中,并完成其他 依赖项。例如,该库需要版本 11.4.0 <ph type="x-smartling-placeholder"></ph> Google Play 服务身份验证客户端库

  1. 将库添加到 build.gradle 文件中:

    Groovy

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

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
    
  2. 添加 11.4.0 Google Play 服务身份验证客户端库添加到 build.gradle 文件中:

    Groovy

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

    Kotlin

    implementation("com.google.android.gms:play-services-auth:11.4.0")
    
。 <ph type="x-smartling-placeholder">

该库需要特定权限才能运行,因此您必须将这些权限 设备政策控制器 (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 代码中的特定库功能,具体取决于 您想要实现的功能详细信息包含在 部分。

创建设备政策控制器 (DPC)

在用于设备管理应用的现有型号上构建 DPC。 具体而言,您的应用必须创建 DeviceAdminReceiverandroid.app.admin 中的类)的子类。 软件包),如 <ph type="x-smartling-placeholder"></ph> 设备管理

创建工作资料

有关演示如何创建基本工作资料的示例,请参阅 <ph type="x-smartling-placeholder"></ph> BasicManagedProfile

要在已设置个人资料的设备上创建工作资料,请执行以下操作: 请先查看该设备是否支持工作资料, 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!
}

如果设备支持工作资料,请通过发送 intent 创建工作资料 使用 ACTION_PROVISION_MANAGED_PROFILE 操作。(在某些文档中,受管理资料是 与工作资料含义相同的通用术语 。)添加设备管理软件包名称 作为额外参数:

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

系统会通过执行以下操作来响应此 intent:

  • 验证设备是否已加密。否则,系统会提示 让用户加密设备,然后再继续执行操作。
  • 创建工作资料。
  • 从工作资料中移除非必需的应用。
  • 将 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);
    }
}

完成工作资料的启用

配置配置文件后,系统会调用 DPC 应用的 DeviceAdminReceiver.onProfileProvisioningComplete() 方法。替换 此回调方法即可完成工作资料的启用。

一般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 控制台以获取当前政策,然后应用这些政策 使用设备 管理 API。

如需了解如何应用设备政策,请参阅 <ph type="x-smartling-placeholder"></ph> 政策

应用受管配置 到工作应用

通过受管配置,您可以为客户提供能够 预先配置他们批准部署的应用, 在需要更改配置时轻松管理应用。先配置应用 可确保组织的安全性和其他政策得到满足 在目标设备上安装应用时。

应用功能由应用开发者在 XML 架构(即 托管配置架构)。 Play(对于应用开发者,请参阅设置托管配置了解详情)。

您可以从应用中检索此架构,以向客户管理员显示 在 EMM 控制台中,提供一个界面来展示 架构显示,并让管理员预先配置应用的设置。 管理员设置的托管配置通常是 存储在 EMM 服务器上,该服务器随后使用 通过 Play EMM API 进行设置 设备的受管理配置Managedconfigurationsforuser。请参阅 托管配置 通过 Play 了解详情。

您可以使用 Play EMM API 将受管配置应用于该应用 (推荐方法)或直接通过 DPC(如应用托管配置中所述) 设备政策控制器 (DPC) 提供相应信息。使用 Play EMM API 具有多项优势,包括易于实施,因为您可以使用 DPC 支持库,用于简化 DPC 任务。 此外,Play EMM API 还具有以下功能:

  • 在安装新应用时以原子方式设置配置,以确保在用户首次启动应用时应用已准备就绪。
  • 允许您针对单个用户管理配置,从而避免针对单个设备监控配置。

使用 Play EMM API

如需将 Play EMM API 用于受管配置,DPC 必须允许 Google Play 来设置配置。DPC 支持库会负责解决这一问题 来为您执行任务。

使用 Play EMM API,请下载 DPC 支持库 然后在 DPC 中启用托管配置支持。

在以下位置启用受管配置支持: 设备政策控制器 (DPC)

在您的 DPC 中导入此类:

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

初始化受管配置库。在此示例中,即为“admin”为 DeviceAdminReceiver 的 ComponentName。

Kotlin

var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)

Java

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

启用受管配置:

Kotlin

managedConfigurationsSupport.enableManagedConfigurations()

Java

managedConfigurationsSupport.enableManagedConfigurations();

在 DPC 中初始化此库后,您可以使用 在 EMM 中使用 Google Play EMM API 将托管配置应用于已批准的应用,而不是将其应用于 直接在 DPC 中编码这些任务。请参阅 <ph type="x-smartling-placeholder"></ph> 通过 Play 托管配置

应用受管配置 设备政策控制器 (DPC) 提供

要直接从 DPC 更改应用的配置设置,请调用 DevicePolicyManager.setApplicationRestrictions() 方法 并传递 设备政策控制器 DeviceAdminReceiver:目标应用的软件包名称 和包含以下内容的Bundle: 应用的受管配置(由管理员设置)。请参阅 您的 如需了解详情,DPC 和 EMM 控制台会交互设置受管配置。不过, 请注意,通过另一种方法 不推荐在 Google Play 企业版账号部署中使用。

Google Play 企业版账号配置 支持

DPC 支持库支持 用于预配 Google Play 企业版账号。要使用此支持,您必须先初始化 库,然后您可以确保 工作区添加 Google Play 企业版账号

初始化 Google Play 企业版账号 设备政策控制器 (DPC) 中的支持

在您的 DPC 中导入此类:

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

初始化配置兼容性库。在此示例中,“管理员” DeviceAdminReceiverComponentName

Kotlin

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 企业版账号:

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 企业版账号

Android 框架的 AccountManager 可以在设备上添加 Google Play 企业版账号。为了简化与 AccountManager,请使用辅助函数(如以下示例所示) (位于 DPC 支持库中)。函数 处理 Google Play 服务器返回的令牌,并方便配置 Google Play 企业版账号。当 Google Play 企业版 账号处于有效状态:

Kotlin

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)

Java

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token - Google 生成的用户身份验证令牌, 播放 EMM API Users.generateAuthenticationToken() 调用。
  • 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).
        }
};
  • 如需详细了解 Device 管理 API,请参阅 设备 管理
  • 要了解 Android Enterprise 配置方法,请参阅 在以下位置配置设备: Android Enterprise 开发者指南。
  • 如需查看演示如何创建基本工作资料的 GitHub 示例, 请参阅 BasicManagedProfile
  • 如需演示如何将其他应用上的配置作为 个人资料所有者, 请参阅 AppRestrictionEnforcer 实现。