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 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 Enterprise. Ứng dụng DPC, trước đây được gọi là trình kiểm soát chính sách công 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 Enterprise, doanh nghiệp duy trì quyền kiểm soát nhiều khía cạnh trên thiết bị của 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 đã phê duyệt cho môi trường hoặc tắt các tính năng của thiết bị (ví dụ: máy ảnh).

Là nhà cung cấp dịch vụ EMM, bạn sẽ phát triển một ứng dụng DPC để khách hàng có thể sử dụng kết hợp 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ị của 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 (và máy chủ) EMM của bạn và thiết bị. Quản trị viên sử dụng bảng điều khiển EMM để thực hiện nhiều thao tác, trong đó có việc định cấu hình các chế độ cài đặt và ứng dụng của thiết bị.

DPC tạo và quản lý hồ sơ công việc trên thiết bị cài đặt DPC. 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ể cấp phép cho một Tài khoản Google Play được quản lý để sử dụng trên thiết bị.

Hướng dẫn này chỉ cho bạn cách phát triển 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 dành cho EMM bao gồm các lớp tiện ích và trình trợ giúp tạo điều kiện cho việc cấp phép và quản lý các 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 các ứng dụng DPC của mình:

  • Hỗ trợ cấp phép cho Tài khoản Google Play được quản lý: Để cấp phép Tài khoản Google Play được quản lý trong ứng dụng DPC, các ứng dụng trên Google Play và Dịch vụ Google Play phải đá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 đảm nhiệm việc cập nhật những ứ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 đối với quy trình cấp phép của Tài khoản Google Play được quản lý. Xem bài viết hỗ trợ cấp phép cho Tài khoản Google Play được quản lý để biết thông tin chi tiết.
  • Hỗ trợ cấu hình được quản lý: Sử dụng API EMM của Play để xử lý cấu hình được quản lý cho các ứng dụng đã được phê duyệt là cách dễ dàng nhất để triển khai các cấu hình được quản lý trên DPC của bạn. 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à các hạn chế đối với ứng dụng) do quản trị viên đặt bằng cách sử dụng bảng điều khiển EMM của bạn. Việc sử dụng API Play EMM để xử lý các cấu hình được quản lý cho phép áp dụng toàn bộ cấu hình ứng dụng trong quá trình cài đặt. Xem phần Á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 bên dưới để tải thư viện xuống. Các tác vụ được nêu chi tiết trong hướng dẫn này giả định rằng bạn 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 xuống từ Cộng đồng nhà cung cấp dịch vụ EMM (quản lý thiết bị di động doanh nghiệp) Android. 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 phiên bản 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 thư viện ứng dụng xác thực Dịch vụ Google Play 11.4.0 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 yêu cầu một số quyền để chạy. Vì vậy, bạn phải thêm những 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 sơ bộ này, bạn cũng phải khởi động chức năng cụ thể của thư viện trong mã DPC, tuỳ thuộc vào khả năng mà bạn muốn triển khai. Chúng tôi đã trình bày chi tiết trong các phần có liên quan bên dưới.

Tạo DPC

Xây dựng DPC trên mô hình hiện 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 phân lớp con DeviceAdminReceiver (một lớp trong gói android.app.admin) như mô tả trong bài viết 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 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 với thao tác ACTION_PROVISION_MANAGE_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 giống như hồ sơ công việc khi nói đến Android trong doanh nghiệp.) Thêm tên gói quản trị viên thiết bị dưới dạng 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 các bướ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 cần thiết 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 DPC làm chủ sở hữu hồ sơ.

Ghi đè onActivityResult() để xem 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 cấp phép, hệ thống sẽ gọi phương thức DeviceAdminReceiver.onProfileProvisioningComplete() của ứng dụng DPC. Hãy 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.

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

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

Sau khi hoàn tất những 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 ra để đá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 khoá thiết bị 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 để xem 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 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ý cho phép bạn cung cấp cho khách hàng khả năng định cấu hình trước các ứng dụng mà họ đã phê duyệt để triển khai và dễ dàng cập nhật các ứng dụng đó khi cấu hình cần thay đổi. Việc định cấu hình ứng dụng trước khi triển khai giúp đảm bảo rằng tổ chức đáp ứng được các chính sách bảo mật và các chính sách khác khi cài đặt ứng dụng trên thiết bị mục tiêu.

Các chức năng của ứng dụng được nhà phát triển ứng dụng xác định 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 giao diện người dùng trong đó có nhiều tuỳ chọn được xác định trong giản đồ và cho phép quản trị viên thiết lập trước các chế độ cài đặt của ứng dụng. Cấu hình được quản lý do quản trị viên đặt thường được lưu trữ trên máy chủ EMM. Sau đó, máy chủ EMM (quản lý thiết bị di động doanh nghiệp) sẽ sử dụng API Play EMM để đặt Managedconfiguresfordevice hoặc Managedconfiguresforuser. 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 API Play EMM (phương pháp đề xuất) hoặc trực tiếp từ DPC (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 API Play EMM có một số ưu điểm, bao gồm cả việc triển khai dễ dàng 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, API Play EMM (quản lý thiết bị di động doanh nghiệp) của Play:

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

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

Để sử dụng API EMM của Play cho 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ý công việc này cho bạn bằng cách ủy 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 rồi bật tính năng hỗ trợ cấu hình được quản lý trong DPC của bạn.

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

Với thư viện này được khởi chạy trong DPC, bạn có thể sử dụng API EMM của Google Play 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á những tác vụ này trực tiếp trong DPC. 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ý trực tiếp từ DPC

Để thay đổi chế độ cài đặt cấu hình của một ứng dụng ngay từ DPC, hãy gọi phương thức DevicePolicyManager.setApplicationRestrict() 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à Gói bao gồm cấu hình được quản lý của ứng dụng do quản trị viên thiết lập. Hãy xem phần Cách tương tác của bảng điều khiển DPC và EMM cũng như Thiế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 sử dụng phương pháp thay thế này để áp dụng các cấu hình được quản lý trong quá trình triển khai Tài khoản Google Play được quản lý.

Hỗ trợ cấp phép cho Tài khoản Google Play được quản lý

Thư viện hỗ trợ DPC có tính năng hỗ trợ cấp phép cho Tài khoản Google Play được quản lý. Để sử dụng tính năng hỗ trợ này, trước tiên bạn phải khởi chạy thư viện, sau đó bạn có thể Đảm bảo môi trường làm việcThêm Tài khoản Google Play được quản lý.

Khởi động tính năng hỗ trợ Tài khoản Google Play đượ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.AndroidForWorkAccountSupport

Khởi chạy thư viện tương thích cấp phép. Trong ví dụ này, "quản trị viên" 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 Google Play được quản lý

Sau khi DPC cấp phép cho 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ợ Tài khoản Google Play được quản lý bằng cách gọi:

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

Lệnh gọi lại sẽ báo cáo sự thành công hoặc không thành công của quá trình này. Khi lệnh gọi lại trả về thành công, bạn có thể thêm Tài khoản Google Play được quản lý. 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ụ: khi 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 thiết bị. Để đơn giản hoá tương tác với AccountManager, hãy sử dụng hàm trợ giúp (như trong ví dụ bên dưới) từ 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 cấp phép cho Tài khoản Google Play được quản lý. Hàm này sẽ trả về khi Tài khoản Google Play được quản lý ở 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 API EMM của Google Play tạo.
  • accountAddedCallback – Trả về Tài khoản Google Play được quản lý đã đượ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ề API Quản trị thiết bị, hãy xem phần Quản trị thiết bị.
  • Để tìm hiểu về các phương thức cấp phép Android Enterprise, hãy xem phần Cấp phép thiết bị trong hướng dẫn dành cho nhà phát triển Android Enterprise.
  • Để xem mẫu GitHub minh hoạ cách tạo hồ sơ công việc cơ bản, hãy xem phần BasicManagedProfile.
  • Để xem mẫu 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 phần AppRestrictionEnforcer.