Mengelola update sistem

Panduan developer ini menjelaskan cara pengontrol kebijakan perangkat (DPC) dapat mengelola update sistem Android atas nama pengguna perangkat.

Pengantar

Perangkat Android dapat menerima dan menginstal update over the air (OTA) untuk software sistem dan aplikasi. Android memberi tahu pengguna perangkat bahwa update sistem tersedia dan pengguna perangkat dapat segera menginstal update tersebut atau nanti.

Dengan DPC, admin IT dapat mengelola update sistem untuk pengguna perangkat. DPC dapat memiliki perangkat terkelola sepenuhnya (disebut pemilik perangkat) atau dapat memiliki profil kerja (disebut pemilik profil). Tabel 1 menunjukkan cara pemilik perangkat mengelola update sistem, sedangkan pemilik profil hanya dapat melaporkan informasi tentang update sistem.

Tabel 1: Tugas yang tersedia untuk DPC bergantung pada mode pemilik

Tugas Pemilik perangkat Pemilik profil
Memeriksa update sistem yang tertunda
Menerima callback saat update sistem baru tersedia
Menetapkan kebijakan update lokal untuk mengontrol kapan Android menginstal update sistem
Membekukan versi OS selama periode kritis

Memeriksa update yang tertunda

Update tertunda adalah update sistem untuk perangkat yang belum diinstal. DPC Anda dapat membantu admin IT memeriksa perangkat mana yang memiliki update sistem yang tertunda—dan mungkin meminta pengguna perangkat untuk segera menginstal update penting.

Pemilik perangkat dan pemilik profil yang menjalankan Android 8.0 (API level 26) atau yang lebih tinggi dapat memeriksa apakah perangkat memiliki update sistem yang tertunda. Panggil DevicePolicyManager.getPendingSystemUpdate() yang menampilkan null jika perangkat sudah diupdate. Jika update sistem tertunda, metode akan menampilkan informasi tentang update tersebut.

Ketahui selengkapnya tentang update yang tertunda

Setelah memanggil getPendingSystemUpdate(), Anda dapat memeriksa nilai SystemUpdateInfo yang ditampilkan untuk mengetahui update yang tertunda lebih lanjut. Contoh berikut menunjukkan cara mengetahui kapan update yang tertunda pertama kali tersedia untuk perangkat:

Kotlin

val firstAvailable =
        dpm.getPendingSystemUpdate(adminName)?.receivedTime
firstAvailable?.let {
    Log.i(TAG, "Update first available: ${Date(firstAvailable)}")
}

Java

SystemUpdateInfo updateInfo = dpm.getPendingSystemUpdate(adminName);
if (updateInfo != null) {
  Long firstAvailable = updateInfo.getReceivedTime();
  Log.i(TAG, "Update first available: " + new Date(firstAvailable));
}

Callback sistem

Jika update tersedia, sistem Android akan memberi tahu pemilik perangkat tentang update baru tersebut. Di Android 8.0 atau yang lebih tinggi, sistem juga memberi tahu pemilik profil.

Di subclass DeviceAdminReceiver, ganti callback onSystemUpdatePending(). Anda tidak perlu mendaftarkan atau mengiklankan DPC untuk menerima callback. Sistem mungkin memanggil metode ini lebih dari sekali untuk satu update, jadi periksa status update sebelum merespons. Panggil getPendingSystemUpdate() untuk mengetahui lebih lanjut update sistem di callback. Contoh berikut menunjukkan cara Anda dapat melakukan ini:

Kotlin

/**
 * Called when a new update is available.
 */
override fun onSystemUpdatePending(context: Context?, intent: Intent?,
                                   receivedTime: Long) {

    // System update information is supported in API level 26 or higher.
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        return
    }

    val updateInfo = getManager(context)
            .getPendingSystemUpdate(getWho(context))
            ?: return
    if (updateInfo.securityPatchState ==
            SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
        // Perhaps install because this is a security patch.
        // ...
    }
}

Java

/**
 * Called when a new update is available.
 */
public void onSystemUpdatePending (Context context, Intent intent,
                                   long receivedTime) {

  // System update information is supported in API level 26 or higher.
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    return;
  }
  SystemUpdateInfo updateInfo = getManager(context)
      .getPendingSystemUpdate(getWho(context));
  if (updateInfo == null) {
    return;
  }
  if (updateInfo.getSecurityPatchState() ==
      SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
    // Perhaps install because this is a security patch.
    // ...
  }
}

Jika sistem memiliki lebih dari satu DPC, misalnya profil kerja di perangkat terkelola sepenuhnya, pemilik perangkat dan pemilik profil akan menerima callback.

Memperbarui kebijakan

Pemilik perangkat dapat mengontrol kapan update diinstal dengan menyetel kebijakan update sistem lokal untuk perangkat. Kebijakan update sistem dapat berupa salah satu dari tiga jenis berikut:

Otomatis
Menginstal update sistem segera setelah tersedia (tanpa interaksi pengguna). Menyetel jenis kebijakan ini akan segera menginstal update tertunda yang mungkin ditunda atau menunggu masa pemeliharaan.
Berjendela
Menginstal update sistem selama masa pemeliharaan harian (tanpa interaksi pengguna). Tetapkan awal dan akhir masa pemeliharaan harian, sebagai menit dalam sehari, saat membuat kebijakan dengan periode baru.
Ditunda
Menunda penginstalan update sistem selama 30 hari. Setelah periode 30 hari berakhir, sistem akan meminta pengguna perangkat untuk menginstal update.

Periode penundaan

Sistem membatasi setiap update untuk satu penundaan 30 hari. Periode dimulai saat sistem pertama kali menunda update dan penetapan kebijakan penundaan baru tidak akan memperpanjang periode.

Selain penundaan, Android mungkin tidak dapat menginstal update karena alasan lain seperti tidak ada konektivitas, kapasitas disk tidak cukup, atau daya baterai lemah.

Sistem akan mereset timer penundaan 30 hari jika update yang berbeda tersedia selama periode tersebut, sehingga admin IT memiliki kesempatan untuk mencoba update sistem gabungan. Setelah 30 hari berlalu tanpa update baru, sistem akan meminta pengguna menginstal semua update yang tertunda. Kemudian, saat update sistem baru tersedia, periode 30 hari akan dimulai lagi.

Cara menetapkan kebijakan

Anda dapat menetapkan kebijakan update di Android 8.0 (API level 26) atau yang lebih baru. Untuk menentukan kapan perangkat harus menginstal update sistem, buat instance SystemUpdatePolicy menggunakan salah satu dari tiga jenis yang diuraikan di atas. Untuk menetapkan kebijakan, pemilik perangkat memanggil metode DevicePolicyManager setSystemUpdatePolicy(). Contoh kode berikut menunjukkan cara melakukannya. Untuk melihat contoh kebijakan berjendela, lihat dokumentasi SystemUpdatePolicy.

Kotlin

// Create the system update policy to postpone installation for 30 days.
val policy = SystemUpdatePolicy.createPostponeInstallPolicy()

// Get a DevicePolicyManager instance to set the policy on the device.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy)

Java

// Create the system update policy to postpone installation for 30 days.
SystemUpdatePolicy policy = SystemUpdatePolicy.createPostponeInstallPolicy();

// Get a DevicePolicyManager instance to set the policy on the device.
DevicePolicyManager dpm = (DevicePolicyManager) context
    .getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy);

Instance kebijakan tidak dapat diubah setelah dibuat. Untuk mengubah waktu penginstalan update di perangkat, Anda dapat membuat dan menetapkan kebijakan baru. Untuk menghapus kebijakan dari perangkat, panggil setSystemUpdatePolicy() yang meneruskan null sebagai argumen policy. Setelah DPC menghapus kebijakan, pengguna perangkat akan melihat notifikasi untuk update sistem yang tersedia.

Aplikasi dapat memanggil getSystemUpdatePolicy() untuk mendapatkan kebijakan saat ini untuk perangkat. Jika metode ini menampilkan null, artinya kebijakan saat ini tidak ditetapkan.

Periode pembekuan

Untuk membekukan versi OS selama periode penting, seperti hari libur atau waktu sibuk lainnya, pemilik perangkat dapat menangguhkan update sistem hingga 90 hari. Saat berada dalam periode pembekuan, perangkat akan berperilaku seperti berikut:

  • Perangkat tidak menerima notifikasi apa pun tentang update sistem yang tertunda.
  • Update sistem ke OS tidak diinstal.
  • Pengguna perangkat tidak dapat memeriksa update sistem secara manual di Setelan.

Sistem akan menerapkan periode buffering wajib 60 hari setelah periode pembekuan yang ditentukan untuk mencegah pembekuan perangkat tanpa batas waktu. Ingat, membekukan update sistem dapat mencegah perangkat menerima update penting.

Gambar 1. Dua periode pembekuan ditetapkan untuk perangkat
Kalender yang menampilkan dua periode pembekuan dalam setahun dengan buffering 60 hari.

Anda menetapkan periode pembekuan pada kebijakan update. Anda tidak dapat menetapkan periode pembekuan tanpa menetapkan kebijakan. Jika perangkat berada di luar periode pembekuan yang Anda tetapkan, perilaku kebijakan normal (otomatis, terjadwal, atau ditunda) akan berlaku.

Cara menetapkan periode pembekuan

Anda dapat menetapkan periode pembekuan di Android 9 (API level 28) atau yang lebih baru. Pemilik perangkat menetapkan periode pembekuan pada kebijakan update sistem sebelum menetapkan kebijakan untuk perangkat. Langkah-langkahnya adalah:

  1. Buat kebijakan update sistem baru (atau dapatkan kebijakan update sistem saat ini).
  2. Tetapkan periode pembekuan pada kebijakan dengan memanggil setFreezePeriods().
  3. Tetapkan kebijakan dan periode pembekuan untuk perangkat dengan memanggil setSystemUpdatePolicy().

Karena periode pembekuan berulang setiap tahun, tanggal mulai dan akhir periode tersebut direpresentasikan oleh nilai bulan dan hari. Hari mulai harus dimulai setidaknya 60 hari setelah akhir periode pembekuan sebelumnya. Contoh berikut menunjukkan cara menyetel dua periode pembekuan untuk kebijakan update sistem yang ada:

Kotlin

// Get the existing policy from the DevicePolicyController instance.
val policy = dpm.systemUpdatePolicy ?: return

try {
    // Set the two annual freeze periods on the policy for our retail
    // point-of-sale devices.
    val summerSale = FreezePeriod(
            MonthDay.of(6, 1),
            MonthDay.of(7, 31)) // Jun 1 - Jul 31 inclusive
    val winterSale = FreezePeriod(
            MonthDay.of(11, 20),
            MonthDay.of(1, 12)) // Nov 20 - Jan 12 inclusive
    policy.freezePeriods = Arrays.asList(summerSale, winterSale)

    // Set the policy again to activate the freeze periods.
    dpm.setSystemUpdatePolicy(adminName, policy)

} catch (e: SystemUpdatePolicy.ValidationFailedException) {
    // There must be previous periods recorded on the device because
    // summerSale and winterSale don’t overlap and are separated by more
    // than 60 days. Report the overlap ...
}

Java

// Get the existing policy from the DevicePolicyController instance.
SystemUpdatePolicy policy = dpm.getSystemUpdatePolicy();

try {
  // Set the two annual freeze periods on the policy for our
  // retail point-of-sale devices.
  FreezePeriod summerSale = new FreezePeriod(
      MonthDay.of(6, 1),
      MonthDay.of(7, 31)); // Jun 1 - Jul 31 inclusive
  FreezePeriod winterSale = new FreezePeriod(
      MonthDay.of(11, 20),
      MonthDay.of(1, 12)); // Nov 20 - Jan 12 inclusive
  policy.setFreezePeriods(Arrays.asList(summerSale, winterSale));

  // Don’t forget to set the policy again to activate the freeze periods.
  dpm.setSystemUpdatePolicy(adminName, policy);

} catch (SystemUpdatePolicy.ValidationFailedException e) {
  // There must be previous periods recorded on the device because summerSale
  // and winterSale don’t overlap and are separated by more than 60 days.
  // Report the overlap ...
}

Hari mulai dan hari akhir bersifat inklusif. Jika hari mulai lebih besar dari hari akhir (seperti winterSale dalam contoh sebelumnya), periode pembekuan akan berlanjut ke tahun berikutnya.

Saat menetapkan periode pembekuan pada kebijakan update sistem, Android akan menguji persyaratan berikut:

  • Tidak ada periode pembekuan yang berlangsung lebih dari 90 hari.
  • Interval di antara periode pembekuan minimal 60 hari.
  • Periode pembekuan tidak tumpang tindih.
  • Tidak ada periode pembekuan duplikat.

Saat menetapkan kebijakan update sistem untuk perangkat, Android akan mengulangi pengujian ini dan menyertakan periode pembekuan saat ini atau sebelumnya untuk perangkat.

Android akan menampilkan SystemUpdatePolicy.ValidationFailedException saat salah satu pengujian ini gagal.

Untuk mendapatkan daftar periode pembekuan yang sebelumnya ditetapkan pada objek kebijakan update sistem, semua aplikasi terinstal dapat memanggil SystemUpdatePolicy.getFreezePeriods(). Contoh berikut memanggil metode ini untuk mencatat periode pembekuan perangkat:

Kotlin

// Log any freeze periods that might be set on a system update policy.
dpm.systemUpdatePolicy?.freezePeriods?.forEach {
    Log.i(TAG, "Freeze period: $it")
}

Java

// Log any freeze periods that might be set on a system update policy.
SystemUpdatePolicy currentPolicy = dpm.getSystemUpdatePolicy();
if (currentPolicy != null) { // A policy might not be set.
  for (FreezePeriod freezePeriod : currentPolicy.getFreezePeriods()) {
    Log.i(TAG, "Freeze period: " + freezePeriod.toString());
  }
}

Tahun kabisat

Android menggunakan kalender ISO 8601 (juga disebut kalender Gregorian) untuk menghitung periode pembekuan dan mengabaikan tahun kabisat. Artinya, tanggal 29 Februari tidak diakui sebagai tanggal yang valid dan dianggap sebagai tanggal 28 Februari. Oleh karena itu, 29 Februari tidak dihitung saat menghitung durasi periode pembekuan.

Pengembangan dan pengujian

Saat mengembangkan dan menguji fitur update sistem DPC, Anda mungkin perlu membuat banyak periode pembekuan. Karena Android memeriksa interval 60 hari antara periode pembekuan terakhir, Anda mungkin tidak dapat menetapkan periode pembekuan baru tanpa terlebih dahulu menghapus data periode sebelumnya. Untuk menghapus data periode pembekuan perangkat, jalankan perintah berikut di shell Android Debug Bridge (adb):

adb shell dpm clear-freeze-period-record

Anda dapat mengonfirmasi bahwa perangkat berada dalam periode pembekuan dengan memeriksa apakah antarmuka pengguna untuk update sistem dinonaktifkan.

Referensi lainnya

Untuk mempelajari update sistem lebih lanjut, baca dokumentasi Update OTA Project Open Source Android.