Xây dựng trình kiểm soát chính sách thiết bị

Hướng dẫn này mô tả cách phát triển một trình kiểm soát chính sách thiết bị (DPC) cho các thiết bị trong quá trình triển khai Android dành cho doanh nghiệp. Ứng dụng DPC (trước đây gọi là trình kiểm soát chính sách của nơi làm việc) kiểm soát các chính sách thiết bị cục bộ và ứng dụng hệ thống trên thiết bị.

Giới thiệu về DPC

Trong quá trình triển khai Android cho doanh nghiệp, doanh nghiệp duy trì quyền kiểm soát đối với nhiều khía cạnh của thiết bị người dùng, chẳng hạn như tách biệt thông tin liên quan đến công việc với dữ liệu cá nhân của người dùng, định cấu hình trước các ứng dụng được phê duyệt cho môi trường hoặc vô hiệu hoá các chức năng của thiết bị (ví dụ: camera).

Là một EMM, bạn phát triển một ứng dụng DPC mà khách hàng có thể sử dụng cùng với bảng điều khiển EMM và máy chủ của bạn. Khách hàng của bạn triển khai DPC cho các thiết bị người dùng mà họ quản lý. DPC đóng vai trò là cầu nối giữa bảng điều khiển EMM (và máy chủ) với thiết bị. Quản trị viên sử dụng bảng điều khiển EMM để thực hiện nhiều việc, bao gồm cả việc định cấu hình chế độ cài đặt thiết bị và ứng dụng.

DPC tạo và quản lý hồ sơ công việc trên thiết bị mà DPC được cài đặt. Hồ sơ công việc mã hoá thông tin liên quan đến công việc và tách biệt thông tin đó với các ứng dụng và dữ liệu cá nhân của người dùng. Trước khi tạo hồ sơ công việc, DPC cũng có thể cung cấp một Tài khoản Managed Google Play để sử dụng trên thiết bị.

Hướng dẫn này cho bạn biết cách phát triển một DPC có thể tạo và quản lý hồ sơ công việc.

Thư viện hỗ trợ DPC cho EMM

Thư viện hỗ trợ DPC cho EMM bao gồm các lớp tiện ích và trợ giúp giúp tạo điều kiện cung cấp và quản lý thiết bị Android trong môi trường doanh nghiệp. Thư viện này cho phép bạn tận dụng các tính năng quan trọng trong ứng dụng DPC:

  • Hỗ trợ cung cấp Tài khoản Google Play được quản lý: Để cung cấp Tài khoản Google Play được quản lý từ ứng dụng DPC, bạn cần đảm bảo rằng các ứng dụng Google Play và Dịch vụ Google Play đáp ứng các yêu cầu tối thiểu về phiên bản. Tuy nhiên, việc cập nhật các ứng dụng này có thể phức tạp. Thư viện hỗ trợ DPC sẽ đảm nhiệm việc cập nhật các ứng dụng này, đồng thời đảm bảo khả năng tương thích với các bản cập nhật trong tương lai cho quy trình cung cấp Tài khoản Google Play được quản lý. Hãy xem bài viết hỗ trợ cấp tài khoản Managed Google Play để biết thông tin chi tiết.
  • Hỗ trợ Cấu hình được quản lý: Sử dụng Play EMM API để xử lý cấu hình được quản lý cho các ứng dụng đã được phê duyệt là cách dễ nhất để triển khai cấu hình được quản lý trên DPC. Thư viện hỗ trợ DPC cho phép bạn uỷ quyền cho Google Play nhiệm vụ áp dụng cấu hình được quản lý (trước đây là quy tắc hạn chế của ứng dụng) do quản trị viên đặt bằng bảng điều khiển EMM. Việc sử dụng Play EMM API để xử lý cấu hình được quản lý cho phép áp dụng cấu hình ứng dụng một cách riêng lẻ trong quá trình cài đặt. Hãy xem bài viết Áp dụng cấu hình được quản lý cho các ứng dụng công việc để biết thêm thông tin về cách bật tính năng này trong DPC của bạn.

Hãy làm theo các bước dưới đây để tải thư viện xuống. Các tác vụ được trình bày chi tiết trong hướng dẫn này giả định việc sử dụng Thư viện hỗ trợ DPC.

Tải Thư viện hỗ trợ DPC xuống

Để sử dụng Thư viện hỗ trợ DPC, hãy tải thư viện này xuống từ cộng đồng Nhà cung cấp EMM của Android Enterprise. Bạn phải thêm thư viện vào tệp build.gradle và xử lý các phần phụ thuộc khác khi tạo ứng dụng DPC. Ví dụ: thư viện này yêu cầu thư viện ứng dụng xác thực Dịch vụ Google Play 11.4.0.

  1. Thêm thư viện vào tệp build.gradle:

    Groovy

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

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
  2. Thêm 11.4.0 thư viện ứng dụng xác thực Dịch vụ Google Play vào tệp 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")

Thư viện này cần có một số quyền để chạy, vì vậy, bạn phải thêm các quyền này vào tệp kê khai của ứng dụng DPC khi tải lên 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"/>

Ngoài các bước thiết lập và triển khai ban đầu này, bạn cũng phải khởi động chức năng thư viện cụ thể trong mã DPC, tuỳ thuộc vào chức năng mà bạn muốn triển khai. Thông tin chi tiết có trong các phần liên quan bên dưới.

Tạo DPC

Tạo DPC trên mô hình hiện có được dùng cho các ứng dụng quản trị thiết bị. Cụ thể, ứng dụng của bạn phải tạo lớp con DeviceAdminReceiver (một lớp trong gói android.app.admin) như mô tả trong phần Quản trị thiết bị.

Tạo hồ sơ công việc

Để xem mẫu minh hoạ cách tạo hồ sơ công việc cơ bản, hãy xem BasicManagedProfile trên GitHub.

Để tạo hồ sơ công việc trên một thiết bị đã có hồ sơ cá nhân, trước tiên, hãy tìm hiểu xem thiết bị đó có thể hỗ trợ hồ sơ công việc hay không bằng cách kiểm tra sự tồn tại của tính năng hệ thống 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!
}

Nếu thiết bị hỗ trợ hồ sơ công việc, hãy tạo hồ sơ công việc bằng cách gửi một ý định có thao tác ACTION_PROVISION_MANAGED_PROFILE. (Trong một số tài liệu, hồ sơ được quản lý là một thuật ngữ chung có nghĩa tương tự như hồ sơ công việc trong bối cảnh Android trong doanh nghiệp.) Thêm tên gói quản trị viên thiết bị dưới dạng một phần bổ sung:

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

Hệ thống sẽ phản hồi ý định này bằng cách thực hiện những việc sau:

  • Xác minh rằng thiết bị đã được mã hoá. Nếu không, hệ thống sẽ nhắc người dùng mã hoá thiết bị trước khi tiếp tục.
  • Tạo hồ sơ công việc.
  • Xoá các ứng dụng không bắt buộc khỏi hồ sơ công việc.
  • Sao chép ứng dụng DPC vào hồ sơ công việc và đặt chính DPC làm chủ sở hữu hồ sơ.

Ghi đè onActivityResult() để xem quá trình cấp phép có thành công hay không:

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

Hoàn tất việc bật hồ sơ công việc

Khi hồ sơ đã được cung cấp, hệ thống sẽ gọi phương thức DeviceAdminReceiver.onProfileProvisioningComplete() của ứng dụng DPC. Ghi đè phương thức gọi lại này để hoàn tất việc bật hồ sơ công việc.

Việc triển khai lệnh gọi lại DeviceAdminReceiver.onProfileProvisioningComplete() thông thường sẽ thực hiện những việc sau:

Kích hoạt hồ sơ công việc

Sau khi bạn hoàn tất các tác vụ này, hãy gọi phương thức setProfileEnabled() của trình quản lý chính sách thiết bị để kích hoạt hồ sơ công việc:

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

Thiết lập chính sách thiết bị

Ứng dụng DPC áp dụng các chính sách thiết bị do quản trị viên đặt để đáp ứng các yêu cầu và hạn chế của tổ chức. Ví dụ: chính sách bảo mật có thể yêu cầu thiết bị khoá sau một số lần nhập sai mật khẩu nhất định. DPC truy vấn bảng điều khiển EMM để biết các chính sách hiện tại, sau đó áp dụng các chính sách bằng API Quản trị thiết bị.

Để biết thông tin về cách áp dụng chính sách thiết bị, hãy xem phần Chính sách.

Áp dụng cấu hình được quản lý cho các ứng dụng công việc

Cấu hình được quản lý giúp khách hàng có thể định cấu hình trước những ứng dụng mà họ đã phê duyệt để triển khai và dễ dàng cập nhật những ứng dụng đó khi cần thay đổi cấu hình. Việc định cấu hình ứng dụng trước khi triển khai đảm bảo rằng các chính sách bảo mật và chính sách khác của tổ chức được đáp ứng khi cài đặt ứng dụng trên thiết bị mục tiêu.

Nhà phát triển ứng dụng xác định các chức năng của ứng dụng trong một giản đồ XML (giản đồ cấu hình được quản lý) đi kèm với ứng dụng khi tải lên Google Play (nhà phát triển ứng dụng, hãy xem phần Thiết lập cấu hình được quản lý để biết thông tin chi tiết).

Bạn truy xuất giản đồ này từ ứng dụng để hiển thị cho quản trị viên khách hàng trong bảng điều khiển EMM, cung cấp một giao diện người dùng trong đó hiển thị các lựa chọn được xác định trong giản đồ và cho phép quản trị viên định cấu hình trước các chế độ cài đặt của ứng dụng. Bộ cấu hình được quản lý mà quản trị viên thiết lập thường được lưu trữ trên máy chủ EMM. Sau đó, máy chủ này sẽ dùng Play EMM API để thiết lập Managedconfigurationsfordevice hoặc Managedconfigurationsforuser. Hãy xem phần Cấu hình được quản lý thông qua Play để biết thông tin chi tiết.

Bạn có thể áp dụng cấu hình được quản lý cho ứng dụng bằng cách sử dụng Play EMM API (phương pháp nên dùng) hoặc trực tiếp từ DPC (được mô tả trong phần Áp dụng cấu hình được quản lý trực tiếp từ DPC). Việc sử dụng Play EMM API có một số lợi thế, bao gồm cả việc dễ dàng triển khai vì bạn có thể sử dụng Thư viện hỗ trợ DPC để đơn giản hoá các tác vụ DPC. Ngoài ra, Play EMM API:

  • Đặt cấu hình một cách tự động khi một ứng dụng mới được cài đặt, nhờ đó đảm bảo ứng dụng sẵn sàng vào lần đầu tiên người dùng chạy ứng dụng.
  • Cho phép bạn quản lý cấu hình cho từng người dùng, nhờ đó bạn có thể tránh giám sát việc cung cấp cho từng thiết bị.

Áp dụng cấu hình được quản lý bằng Play EMM API

Để sử dụng Play EMM API cho các cấu hình được quản lý, DPC phải cho phép Google Play đặt cấu hình. Thư viện hỗ trợ DPC sẽ xử lý tác vụ này cho bạn bằng cách uỷ quyền cấu hình do Google Play gửi.

Để sử dụng Play EMM API, hãy tải Thư viện hỗ trợ DPC xuống, sau đó bật tính năng hỗ trợ cấu hình được quản lý trong DPC.

Bật tính năng hỗ trợ Cấu hình được quản lý trong DPC

Nhập lớp này vào DPC của bạn:

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

Khởi chạy thư viện cấu hình được quản lý. Trong ví dụ này, "admin" là ComponentName của DeviceAdminReceiver.

Kotlin

var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)

Java

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

Bật cấu hình được quản lý:

Kotlin

managedConfigurationsSupport.enableManagedConfigurations()

Java

managedConfigurationsSupport.enableManagedConfigurations();

Khi đã khởi chạy thư viện này trong DPC, bạn có thể sử dụng Google Play EMM API trong bảng điều khiển và máy chủ EMM để áp dụng cấu hình được quản lý cho các ứng dụng đã được phê duyệt, thay vì mã hoá trực tiếp các tác vụ này trong DPC. Hãy xem phần Cấu hình được quản lý thông qua Play để biết thông tin chi tiết.

Áp dụng cấu hình được quản lý ngay từ DPC

Để thay đổi chế độ cài đặt cấu hình của ứng dụng ngay từ DPC, hãy gọi phương thức DevicePolicyManager.setApplicationRestrictions() và truyền các tham số cho DeviceAdminReceiver của ứng dụng DPC, tên gói của ứng dụng mục tiêu và Bundle bao gồm cấu hình được quản lý của ứng dụng do quản trị viên đặt. Hãy xem phần Cách DPC và bảng điều khiển EMM tương tácThiết lập cấu hình được quản lý để biết thông tin chi tiết. Tuy nhiên, xin lưu ý rằng bạn không nên dùng phương pháp thay thế này để áp dụng cấu hình được quản lý trong các hoạt động triển khai Managed Google Play.

Hỗ trợ cung cấp tài khoản Managed Google Play

Thư viện hỗ trợ DPC có hỗ trợ việc cung cấp Tài khoản Managed Google Play. Để sử dụng dịch vụ hỗ trợ này, trước tiên, bạn phải khởi động thư viện, sau đó bạn có thể Đảm bảo môi trường làm việcThêm Tài khoản Managed Google Play.

Khởi chạy tính năng hỗ trợ Tài khoản Google do Play quản lý trong DPC

Nhập lớp này vào DPC của bạn:

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

Khởi chạy thư viện khả năng tương thích khi cung cấp. Trong ví dụ này, "admin" là ComponentName của DeviceAdminReceiver.

Kotlin

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Java

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

Đảm bảo môi trường làm việc cho Tài khoản Managed Google Play

Sau khi trình kiểm soát chính sách thiết bị (DPC) cung cấp một thiết bị ở chế độ chủ sở hữu hồ sơ (ACTION_PROVISION_MANAGED_PROFILE) hoặc chế độ chủ sở hữu thiết bị (ACTION_PROVISION_MANAGED_DEVICE), hãy đảm bảo rằng thiết bị có thể hỗ trợ Managed Google Play Accounts bằng cách gọi:

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

Lệnh gọi lại báo cáo trạng thái thành công hoặc không thành công của quy trình này. Khi lệnh gọi lại trả về thành công, bạn có thể thêm một Tài khoản Managed Google Play. Nếu lệnh gọi lại báo cáo lỗi, hãy nhắc người dùng đảm bảo thiết bị có kết nối mạng (ví dụ: nếu quá trình tải xuống không thành công). Trong các trường hợp khác, hãy báo cáo lỗi này cho 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)
    }
}

Thêm Tài khoản Managed Google Play

AccountManager của khung Android có thể thêm Tài khoản Google Play được quản lý vào một thiết bị. Để đơn giản hoá hoạt động tương tác với AccountManager, hãy dùng hàm trợ giúp (xuất hiện trong ví dụ bên dưới) trong Thư viện hỗ trợ DPC. Hàm này xử lý mã thông báo do máy chủ Google Play trả về và hỗ trợ việc cung cấp Tài khoản Managed Google Play. Hàm này sẽ trả về khi Tài khoản Managed Google Play ở trạng thái hợp lệ:

Kotlin

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)

Java

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token – Mã thông báo xác thực người dùng do lệnh gọi Users.generateAuthenticationToken() của Google Play EMM API tạo.
  • accountAddedCallback – Trả về Tài khoản Managed Google Play đã được thêm thành công vào thiết bị. Lệnh gọi lại này phải bao gồm các phương thức 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).
        }
};
  • Để tìm hiểu thêm về Device Administration API, hãy xem phần Quản trị thiết bị.
  • Để tìm hiểu về các phương thức cung cấp của Android Enterprise, hãy xem phần Cung cấp thiết bị trong hướng dẫn dành cho nhà phát triển Android Enterprise.
  • Để xem một mẫu trên GitHub minh hoạ cách tạo hồ sơ công việc cơ bản, hãy xem BasicManagedProfile.
  • Để xem mẫu trên GitHub minh hoạ cách thiết lập cấu hình trên các ứng dụng khác với tư cách là chủ sở hữu hồ sơ, hãy xem AppRestrictionEnforcer.