Sistem güncellemelerini yönetme

Bu geliştirici kılavuzunda, cihaz politikası denetleyicinizin (DPC) Android sistem güncellemelerini cihaz kullanıcısı adına nasıl yönetebileceği açıklanmaktadır.

Giriş

Android cihazlar, sistem ve uygulama yazılımının kablosuz (OTA) güncellemelerini alıp yükleyebilir. Android, cihaz kullanıcısına bir sistem güncellemesinin olduğunu bildirir ve cihaz kullanıcısının güncellemeyi hemen veya daha sonra yükleyebileceğini belirtir.

BT yöneticisi, DPC'nizi kullanarak cihaz kullanıcısı için sistem güncellemelerini yönetebilir. DPC'ler tam olarak yönetilen bir cihaza (cihaz sahibi denir) veya bir iş profiline (profil sahibi denir) sahip olabilir. Tablo 1'de cihaz sahiplerinin sistem güncellemelerini nasıl yönetebileceği gösterilmektedir. Profil sahipleri yalnızca sistem güncellemeleriyle ilgili bilgileri bildirebilir.

Tablo 1: DPC'lerin kullanabileceği görevler sahip moduna bağlıdır

Görev Cihaz sahibi Profil sahibi
Bekleyen sistem güncellemelerini kontrol etme
Yeni sistem güncellemeleri kullanıma sunulduğunda geri aramalar alın
Android'in sistem güncellemelerini ne zaman yüklediğini kontrol etmek için yerel güncelleme politikası belirleme
Kritik dönemlerde işletim sistemi sürümünü dondurma

Bekleyen güncellemeleri kontrol et

Bekleyen güncelleme, henüz yüklenmemiş bir cihaza ait sistem güncellemesidir. DPC'niz, BT yöneticilerinin beklemede olan sistem güncellemeleri olan cihazları kontrol etmesine yardımcı olabilir ve belki de cihaz kullanıcılarından kritik güncellemeleri hemen yüklemelerini isteyebilir.

Android 8.0 (API düzeyi 26) veya sonraki sürümleri çalıştıran cihaz sahipleri ve profil sahipleri, cihazda bekleyen bir sistem güncellemesi olup olmadığını kontrol edebilir. Cihaz güncelse null değerini döndüren DevicePolicyManager.getPendingSystemUpdate() numaralı telefonu arayın. Bekleyen bir sistem güncellemesi varsa yöntem, güncellemeyle ilgili bilgileri döndürür.

Bekleyen güncelleme hakkında daha fazla bilgi

getPendingSystemUpdate() çağırdıktan sonra, bekleyen güncelleme hakkında daha fazla bilgi edinmek için döndürülen SystemUpdateInfo değerini inceleyebilirsiniz. Aşağıdaki örnekte, beklemedeki bir güncellemenin cihazda ilk kez ne zaman kullanılabilir olduğunu nasıl öğrenebileceğiniz gösterilmektedir:

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

Sistem geri aramaları

Bir güncelleme olduğunda Android sistemi, cihaz sahiplerine bu yeni güncelleme hakkında bilgi verir. Android 8.0 veya sonraki sürümlerde bu sistem, profil sahiplerini de bilgilendirir.

DeviceAdminReceiver alt sınıfınızda onSystemUpdatePending() geri çağırmasını geçersiz kılın. Geri aranmak için DPC'nize kaydolmanız veya reklam yayınlamanız gerekmez. Sistem, tek bir güncelleme için bu yöntemi birden çok kez çağırabilir. Bu nedenle, yanıt vermeden önce güncellemenin durumunu kontrol edin. Geri aramadaki sistem güncellemesi hakkında daha fazla bilgi edinmek için getPendingSystemUpdate() numaralı telefonu arayın. Aşağıdaki örnekte bunu nasıl yapabileceğiniz gösterilmektedir:

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.
    // ...
  }
}

Bir sistem birden fazla DPC'ye sahip olduğunda (ör. tümüyle yönetilen cihazlardaki iş profilleri) geri çağırma hem cihaz sahibi hem de profil sahibi tarafından yapılır.

Politikaları güncelle

Cihaz sahibi, cihaz için yerel sistem güncelleme politikası belirleyerek güncellemelerin ne zaman yükleneceğini kontrol edebilir. Sistem güncelleme politikası üç türden biri olabilir:

Otomatik
Sistem güncellemelerini kullanılabilir hale gelir gelmez yükler (kullanıcı etkileşimi olmadan). Bu politika türü ayarlandığında hemen ertelenmiş veya bakım dönemi bekleyen beklemedeki güncellemeler yüklenir.
Aralıklı
Sistem güncellemelerini, günlük bakım dönemi sırasında (kullanıcı etkileşimi olmadan) yükler. Yeni bir aralıklı politika oluştururken günlük bakım döneminin başlangıç ve bitişini, günün dakikaları olarak ayarlayın.
Ertelendi
Sistem güncellemelerinin yüklenmesini 30 gün erteler. 30 günlük süre sona erdikten sonra, sistem cihaz kullanıcısından güncellemeyi yüklemesini ister.

Erteleme dönemleri

Sistem her güncellemeyi 30 günlük bir ertelemeyle sınırlandırır. Sistem, güncellemeyi ilk kez ertelediğinde bu dönem başlar. Yeni erteleme politikaları belirlemek bu süreyi uzatmaz.

Android, ertelemenin yanı sıra bağlantı olmaması, yetersiz disk alanı veya düşük pil gibi nedenlerle güncellemeyi yükleyemeyebilir.

İlgili süre içinde farklı bir güncelleme kullanıma sunulursa sistem 30 günlük erteleme zamanlayıcısını sıfırlayarak BT yöneticilerine birleştirilmiş sistem güncellemelerini deneme şansı verir. Yeni güncelleme olmadan 30 gün geçtikten sonra sistem, kullanıcıdan bekleyen tüm güncellemeleri yüklemesini ister. Daha sonra, yeni bir sistem güncellemesi kullanıma sunulduğunda 30 günlük süre tekrar başlar.

Politika ayarlama

Güncelleme politikalarını Android 8.0 (API düzeyi 26) veya sonraki sürümlerde ayarlayabilirsiniz. Cihazın sistem güncellemelerini ne zaman yüklemesi gerektiğini belirtmek için yukarıda açıklanan üç türden birini kullanarak SystemUpdatePolicy örneği oluşturun. Bir politika belirlemek için cihaz sahibiniz DevicePolicyManager yöntemini setSystemUpdatePolicy() çağırır. Aşağıdaki kod örneğinde bunu nasıl yapabileceğiniz gösterilmektedir. Pencereli politika örneği için SystemUpdatePolicy dokümanlarına bakın.

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

Politika örneklerini oluşturduktan sonra değiştiremezsiniz. Bir cihazın güncelleme yükleme zamanını değiştirmek için yeni bir politika oluşturup ayarlayabilirsiniz. Politikayı bir cihazdan kaldırmak için policy bağımsız değişkeni olarak null ileten setSystemUpdatePolicy() yöntemini çağırın. DPC'niz bir politikayı kaldırdıktan sonra, cihaz kullanıcısı mevcut sistem güncellemeleriyle ilgili bildirimleri görür.

Uygulamalar, cihazla ilgili geçerli politikayı öğrenmek için getSystemUpdatePolicy()'i çağırabilir. Bu yöntem null değerini döndürürse şu anda bir politika ayarlanmamış demektir.

Dondurma dönemleri

Cihaz sahipleri, işletim sistemi sürümünü tatiller veya diğer yoğun zamanlar gibi kritik dönemlerde dondurmak için sistem güncellemelerini 90 güne kadar askıya alabilir. Bir cihaz, dondurma süresi içindeyken aşağıdaki gibi davranır:

  • Cihaz, bekleyen sistem güncellemeleriyle ilgili bildirim almaz.
  • İşletim sistemi için sistem güncellemeleri yüklenmedi.
  • Cihaz kullanıcıları, sistem güncellemelerini Ayarlar'dan manuel olarak kontrol edemez.

Sistem, cihazın süresiz olarak donmasını önlemek için tanımlanan dondurma dönemlerinin ardından 60 günlük zorunlu bir arabellek süresi uygular. Sistem güncellemelerini dondurmanın, cihazların kritik güncellemeleri almasını engelleyebileceğini unutmayın.

Şekil 1. Bir cihaz için iki dondurma dönemi ayarlandı
60 günlük arabelleklerle bir yıl içinde iki dondurma dönemini gösteren takvim.

Güncelleme politikasında dondurma dönemleri ayarlarsınız. Bir politika ayarlamadan dondurma dönemleri ayarlayamazsınız. Cihaz, ayarladığınız dondurma dönemlerinin dışında olduğunda normal politika davranışı (otomatik, aralıklı veya ertelenmiş) geçerli olur.

Dondurma dönemi nasıl ayarlanır?

Android 9 (API düzeyi 28) veya sonraki sürümlerde dondurma dönemleri ayarlayabilirsiniz. Cihaz sahibi, cihaz için politikayı ayarlamadan önce sistem güncelleme politikasında dondurma dönemi ayarlar. Adımlar şunlardır:

  1. Yeni bir sistem güncelleme politikası oluşturun (veya mevcut politikayı alın).
  2. setFreezePeriods() yöntemini çağırarak politikadaki dondurma dönemlerini ayarlayın.
  3. setSystemUpdatePolicy() yöntemini çağırarak cihaz için politikayı ayarlayın ve dönemleri dondurma.

Dondurma dönemi yıllık olarak tekrarlandığından, dönemin başlangıç ve bitiş tarihleri ay ve gün değerleriyle temsil edilir. Başlangıç günü, önceki dondurma dönemlerinin bitişinden en az 60 gün sonra başlamalıdır. Aşağıdaki örnekte, mevcut bir sistem güncelleme politikası için iki dondurma dönemini nasıl ayarlayabileceğiniz gösterilmektedir:

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

Hem başlangıç günü hem de bitiş günü dahildir. Başlangıç günü bitiş gününden büyükse (bir önceki örnekteki winterSale gibi) dondurma dönemi bir sonraki yıla kadar uzatılır.

Bir sistem güncelleme politikasında dondurma dönemleri ayarlarken Android aşağıdaki gereksinimleri test eder:

  • Dondurulma süresi 90 günden uzun olamaz.
  • Dondurma dönemleri arasındaki aralık en az 60 gündür.
  • Dondurma dönemleri çakışmaz.
  • Yinelenen dondurma dönemi yok.

Bir cihaz için sistem güncelleme politikası belirlenirken Android, bu testleri tekrarlar ve cihazın mevcut veya geçmiş dondurma dönemlerini dahil eder.

Bu testlerden herhangi biri başarısız olduğunda Android bir SystemUpdatePolicy.ValidationFailedException gönderir.

Bir sistem güncelleme politikası nesnesinde daha önce ayarlanmış olan dondurma dönemlerinin listesini almak için yüklü tüm uygulamalar SystemUpdatePolicy.getFreezePeriods() yöntemini çağırabilir. Aşağıdaki örnekte, bir cihazın dondurma dönemlerini günlüğe kaydetmek için bu yöntem çağrılır:

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

Artık yıllar

Android, donma dönemlerini hesaplamak için ISO 8601 takvimini (Gregoryen takvim de denir) kullanır ve artık yılları dikkate almaz. Yani 29 Şubat geçerli bir tarih olarak kabul edilmez ve 28 Şubat olarak değerlendirilir. Bu nedenle, dondurma döneminin süresi hesaplanırken 29 Şubat hesaba katılmaz.

Geliştirme ve test

DPC'nizin sistem güncelleme özelliğini geliştirip test ederken birçok dondurma dönemi oluşturmanız gerekebilir. Android, geçmiş dondurma dönemleri arasında 60 günlük bir aralık kontrolü yaptığından önce geçmiş dönemlerin kaydını temizlemeden yeni bir dondurma dönemi ayarlayamayabilirsiniz. Cihazın dondurulma dönemi kaydını temizlemek için Android Debug Bridge (adb) kabuğunda aşağıdaki komutu çalıştırın:

adb shell dpm clear-freeze-period-record

Sistem güncellemeleri için kullanıcı arayüzünün devre dışı olup olmadığını kontrol ederek cihazın dondurma döneminde olduğunu onaylayabilirsiniz.

Ek kaynaklar

Sistem güncellemeleri hakkında daha fazla bilgi için Android Açık Kaynak Projesi'nin OTA Güncellemeleri belgelerini okuyun.