مدیریت به روز رسانی سیستم

این راهنمای توسعه‌دهنده توضیح می‌دهد که چگونه کنترل‌کننده خط‌مشی دستگاه شما (DPC) می‌تواند به‌روزرسانی‌های سیستم Android را از طرف کاربر دستگاه مدیریت کند.

مقدمه

دستگاه‌های Android می‌توانند به‌روزرسانی‌های هوایی (OTA) را برای سیستم و نرم‌افزار برنامه دریافت و نصب کنند. اندروید به کاربر دستگاه اطلاع می‌دهد که به‌روزرسانی سیستم در دسترس است و کاربر دستگاه می‌تواند فوراً یا بعداً به‌روزرسانی را نصب کند.

با استفاده از DPC، یک سرپرست فناوری اطلاعات می‌تواند به‌روزرسانی‌های سیستم را برای کاربر دستگاه مدیریت کند. DPCها می توانند صاحب یک دستگاه کاملاً مدیریت شده (به نام مالک دستگاه) یا می توانند دارای یک نمایه کاری (به نام مالک نمایه) باشند. جدول 1 نشان می دهد که چگونه صاحبان دستگاه می توانند به روز رسانی های سیستم را مدیریت کنند، در حالی که مالکان نمایه فقط می توانند اطلاعات مربوط به به روز رسانی های سیستم را گزارش کنند.

جدول 1 : وظایف موجود برای DPCها به حالت مالک بستگی دارد

وظیفه صاحب دستگاه مالک نمایه
به روز رسانی های معلق سیستم را بررسی کنید
هنگامی که به‌روزرسانی‌های جدید سیستم در دسترس قرار می‌گیرد، تماس‌های برگشتی دریافت کنید
یک خط‌مشی به‌روزرسانی محلی تنظیم کنید تا زمانی که Android به‌روزرسانی‌های سیستم را نصب می‌کند، کنترل کنید
نسخه سیستم عامل را در دوره های بحرانی فریز کنید

به روز رسانی های معلق را بررسی کنید

به روز رسانی معلق یک به روز رسانی سیستم برای دستگاهی است که هنوز نصب نشده است. DPC شما می‌تواند به سرپرستان فناوری اطلاعات کمک کند تا بررسی کنند کدام دستگاه‌ها به‌روزرسانی‌های سیستم معلق دارند - و شاید از کاربران دستگاه بخواهند که به‌روزرسانی‌های مهم را فوراً نصب کنند.

دارندگان دستگاه و مالکان نمایه‌ای که با Android نسخه ۸.۰ (سطح API ۲۶) یا بالاتر اجرا می‌شوند، می‌توانند بررسی کنند که آیا دستگاهی به‌روزرسانی سیستم معلق دارد یا خیر. DevicePolicyManager.getPendingSystemUpdate() را فراخوانی کنید که اگر دستگاه به روز باشد، null برمی گرداند. اگر به‌روزرسانی سیستم در انتظار باشد، این روش اطلاعات مربوط به به‌روزرسانی را برمی‌گرداند.

درباره به‌روزرسانی معلق بیشتر بدانید

پس از فراخوانی getPendingSystemUpdate() می توانید مقدار SystemUpdateInfo برگشتی را بررسی کنید تا در مورد به روز رسانی معلق بیشتر بدانید. مثال زیر نشان می دهد که چگونه می توانید متوجه شوید که یک به روز رسانی معلق برای اولین بار در دستگاه در دسترس بوده است:

کاتلین

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

جاوا

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

تماس های سیستمی

هنگامی که یک به‌روزرسانی در دسترس قرار می‌گیرد، سیستم Android صاحبان دستگاه را از به‌روزرسانی جدید مطلع می‌کند. در اندروید 8.0 یا بالاتر، سیستم به صاحبان پروفایل نیز اطلاع می‌دهد.

در زیر کلاس DeviceAdminReceiver ، فراخوانی onSystemUpdatePending() لغو کنید. برای دریافت پاسخ تماس نیازی به ثبت نام یا تبلیغ برای DPC خود ندارید. ممکن است سیستم برای یک به‌روزرسانی، بیش از یک بار این روش را فراخوانی کند، بنابراین قبل از پاسخ دادن، وضعیت به‌روزرسانی را بررسی کنید. با getPendingSystemUpdate() تماس بگیرید تا در مورد به روز رسانی سیستم در callback اطلاعات بیشتری کسب کنید. مثال زیر نشان می دهد که چگونه می توانید این کار را انجام دهید:

کاتلین

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

جاوا

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

هنگامی که یک سیستم بیش از یک DPC دارد، برای مثال نمایه های کاری در دستگاه های کاملاً مدیریت شده، مالک دستگاه و مالک نمایه هر دو پاسخ تماس را دریافت می کنند.

به روز رسانی سیاست ها

صاحب دستگاه می تواند با تنظیم خط مشی به روز رسانی سیستم محلی برای دستگاه، زمان نصب به روز رسانی ها را کنترل کند. خط مشی به روز رسانی سیستم می تواند یکی از سه نوع باشد:

خودکار
به‌روزرسانی‌های سیستم را به محض در دسترس شدن (بدون تعامل کاربر) نصب می‌کند. تنظیم این نوع خط‌مشی فوراً هر به‌روزرسانی معلقی را که ممکن است به تعویق بیفتد یا منتظر یک پنجره تعمیر و نگهداری باشد، نصب می‌کند.
پنجره دار
به روز رسانی های سیستم را در طول یک پنجره تعمیر و نگهداری روزانه (بدون تعامل کاربر) نصب می کند. هنگام ایجاد یک خط مشی پنجره‌دار جدید، شروع و پایان پنجره نگهداری روزانه را به‌عنوان دقیقه‌های روز تنظیم کنید.
به تعویق افتاد
نصب به روز رسانی سیستم را به مدت 30 روز به تعویق می اندازد. پس از پایان دوره 30 روزه، سیستم از کاربر دستگاه می خواهد که به روز رسانی را نصب کند.

دوره های تعویق

سیستم هر به روز رسانی را به یک تعویق 30 روزه محدود می کند. این دوره زمانی شروع می‌شود که سیستم برای اولین بار به‌روزرسانی را به تعویق می‌اندازد و تنظیم سیاست‌های تعویق جدید باعث تمدید دوره نمی‌شود.

علاوه بر به تعویق انداختن، ممکن است اندروید به دلایل دیگری مانند عدم اتصال، فضای ناکافی دیسک یا باتری کم نتواند به‌روزرسانی را نصب کند.

سیستم تایمر تعویق 30 روزه را بازنشانی می‌کند، اگر به‌روزرسانی دیگری در طول دوره در دسترس باشد، به مدیران فناوری اطلاعات این فرصت را می‌دهد تا به‌روزرسانی‌های ترکیبی سیستم را امتحان کنند. هنگامی که 30 روز بدون به روز رسانی جدید می گذرد، سیستم از کاربر می خواهد که تمام به روز رسانی های معلق را نصب کند. بعداً، وقتی یک به‌روزرسانی جدید سیستم در دسترس قرار گرفت، دوره 30 روزه دوباره شروع می‌شود.

نحوه تنظیم یک خط مشی

می‌توانید خط‌مشی‌های به‌روزرسانی را در Android 8.0 (سطح API 26) یا بالاتر تنظیم کنید. برای تعیین زمانی که دستگاه باید به‌روزرسانی‌های سیستم را نصب کند، یک نمونه از SystemUpdatePolicy را با استفاده از یکی از سه نوع ذکر شده در بالا ایجاد کنید. برای تنظیم یک خط‌مشی، مالک دستگاه شما روش DevicePolicyManager setSystemUpdatePolicy() را فراخوانی می‌کند. نمونه کد زیر نشان می دهد که چگونه می توانید این کار را انجام دهید. برای دیدن مثالی از سیاست پنجره ای، به مستندات SystemUpdatePolicy نگاه کنید.

کاتلین

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

جاوا

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

نمونه‌های خط‌مشی پس از ایجاد آن‌ها قابل تغییر نیستند. برای تغییر زمانی که دستگاهی به‌روزرسانی‌ها را نصب می‌کند، می‌توانید خط‌مشی جدیدی ایجاد و تنظیم کنید. برای حذف یک خط مشی از دستگاه، setSystemUpdatePolicy() را به عنوان آرگومان policy null ارسال کنید. پس از اینکه DPC شما خط‌مشی را حذف کرد، کاربر دستگاه اعلان‌هایی را برای به‌روزرسانی‌های موجود سیستم می‌بیند.

برنامه‌ها می‌توانند برای دریافت خط‌مشی فعلی دستگاه، getSystemUpdatePolicy() را فراخوانی کنند. اگر این روش null را برگرداند، به این معنی است که یک خط مشی در حال حاضر تنظیم نشده است.

دوره های انجماد

برای مسدود کردن نسخه سیستم عامل در دوره‌های بحرانی، مانند تعطیلات یا دیگر زمان‌های شلوغ، صاحبان دستگاه‌ها می‌توانند به‌روزرسانی‌های سیستم را تا 90 روز به حالت تعلیق درآورند. هنگامی که یک دستگاه در دوره انجماد قرار دارد به صورت زیر عمل می کند:

  • دستگاه هیچ اعلانی درباره به‌روزرسانی‌های معلق سیستم دریافت نمی‌کند.
  • به روز رسانی سیستم عامل نصب نشده است.
  • کاربران دستگاه نمی توانند به صورت دستی به روز رسانی های سیستم را در تنظیمات بررسی کنند.

این سیستم یک دوره بافر اجباری 60 روزه را پس از هر دوره انجماد تعریف شده اعمال می کند تا از یخ زدن دستگاه به طور نامحدود جلوگیری کند. به یاد داشته باشید، ثابت کردن به‌روزرسانی‌های سیستم می‌تواند از دریافت به‌روزرسانی‌های حیاتی دستگاه‌ها جلوگیری کند.

شکل 1. دو دوره انجماد تنظیم شده برای یک دستگاه
تقویمی که دو دوره انجماد را در یک سال با بافرهای 60 روزه نشان می دهد.

شما دوره های توقف را در یک خط مشی به روز رسانی تنظیم می کنید. شما نمی توانید دوره های توقف را بدون تنظیم خط مشی تنظیم کنید. وقتی دستگاه خارج از دوره‌های توقفی است که تنظیم کرده‌اید، رفتار خط‌مشی عادی (خودکار، پنجره‌دار یا به تعویق افتاده) اعمال می‌شود.

نحوه تنظیم دوره انجماد

می‌توانید دوره‌های توقف را در Android 9 (سطح API 28) یا بالاتر تنظیم کنید. مالک دستگاه قبل از تنظیم خط‌مشی برای دستگاه، یک دوره توقف را برای خط‌مشی به‌روزرسانی سیستم تعیین می‌کند. مراحل عبارتند از:

  1. یک خط مشی به روز رسانی سیستم جدید (یا دریافت کنید) ایجاد کنید.
  2. با فراخوانی setFreezePeriods() دوره‌های انجماد را روی خط‌مشی تنظیم کنید.
  3. با فراخوانی setSystemUpdatePolicy() ، خط مشی و دوره های ثابت را برای دستگاه تنظیم کنید.

از آنجا که دوره انجماد سالانه تکرار می شود، تاریخ شروع و پایان دوره با مقادیر ماه و روز نمایش داده می شود. روز شروع باید حداقل 60 روز پس از پایان هر دوره انجماد قبلی شروع شود. مثال زیر نشان می دهد که چگونه می توانید دو دوره توقف را برای یک خط مشی به روز رسانی سیستم موجود تنظیم کنید:

کاتلین

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

جاوا

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

هم روز شروع و هم روز پایان شامل می شود. اگر روز شروع بزرگتر از روز پایان باشد (مانند winterSale در مثال قبلی)، دوره انجماد تا سال بعد ادامه می یابد.

هنگام تنظیم دوره‌های توقف در خط‌مشی به‌روزرسانی سیستم، Android این موارد را آزمایش می‌کند:

  • هیچ دوره انجمادی بیش از 90 روز نیست.
  • فاصله بین دوره های انجماد حداقل 60 روز است.
  • دوره های انجماد با هم همپوشانی ندارند.
  • هیچ دوره انجماد تکراری وجود ندارد.

هنگام تنظیم خط‌مشی به‌روزرسانی سیستم برای دستگاه، Android این آزمایش‌ها را تکرار می‌کند و دوره‌های ثابت فعلی یا گذشته دستگاه را شامل می‌شود.

Android یک SystemUpdatePolicy.ValidationFailedException را زمانی که هر یک از این تست ها با شکست مواجه می شود، پرتاب می کند.

برای دریافت لیستی از دوره‌های انجماد که قبلاً روی یک شی سیاست به‌روزرسانی سیستم تنظیم شده‌اند، همه برنامه‌های نصب شده می‌توانند SystemUpdatePolicy.getFreezePeriods() را فراخوانی کنند. مثال زیر این روش را برای ثبت دوره های انجماد دستگاه فراخوانی می کند:

کاتلین

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

جاوا

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

سالهای کبیسه

اندروید از تقویم ISO 8601 (که تقویم میلادی نیز نامیده می شود) برای محاسبه دوره های انجماد استفاده می کند و سال های کبیسه را نادیده می گیرد. این بدان معنی است که 29 فوریه به عنوان یک تاریخ معتبر شناخته نمی شود و به گونه ای رفتار می شود که گویی 28 فوریه است. بنابراین، 29 فوریه هنگام محاسبه مدت یک دوره انجماد محاسبه نمی شود.

توسعه و آزمایش

در حالی که در حال توسعه و آزمایش ویژگی به‌روزرسانی سیستم DPC خود هستید، ممکن است لازم باشد دوره‌های توقف زیادی ایجاد کنید. از آنجایی که Android فاصله 60 روزه بین دوره‌های انجماد گذشته را بررسی می‌کند، ممکن است نتوانید بدون پاک کردن رکورد دوره‌های گذشته، دوره ثابت جدیدی را تنظیم کنید. برای پاک کردن رکورد دوره انجماد دستگاه، دستور زیر را در پوسته Android Debug Bridge (adb) اجرا کنید:

adb shell dpm clear-freeze-period-record

با بررسی غیرفعال بودن رابط کاربری برای به‌روزرسانی‌های سیستم، می‌توانید تأیید کنید که دستگاهی در دوره توقف قرار دارد.

به‌روزرسانی‌های سیستم Google Play (خط اصلی)

به‌روزرسانی‌های سیستم Google Play (که به‌روزرسانی‌های خط اصلی نیز گفته می‌شود) به‌طور خودکار دانلود می‌شوند، اما برای نصب نیاز به راه‌اندازی مجدد دستگاه دارند. این به‌روزرسانی‌ها راه‌اندازی مجدد خودکار را راه‌اندازی نمی‌کنند و در عوض روی راه‌اندازی مجدد کاربر، سرپرست یا سیاست‌گذاری بعدی نصب می‌شوند. راه‌اندازی مجدد توسط خط‌مشی به‌روزرسانی سیستم، به‌روزرسانی سیستم Google/OEM مرتبط و هر به‌روزرسانی سیستم Google Play را که قبلاً دانلود شده است، نصب می‌کند.

به‌روزرسانی‌های سیستم Google Play را می‌توان با پیمایش به تنظیمات > درباره > نسخه اندروید > به‌روزرسانی سیستم Google Play به صورت دستی نصب کرد.

یک به‌روزرسانی را برگردانید

در برخی موارد، ابزار Google Play System Update Rollbacks (GPSUR) می تواند برای بازیابی وضعیت دستگاه به دلیل نصب مشکل ساز به روز رسانی سیستم Google Play استفاده شود. این ابزار باید توسط کاربران پیشرفته یا در صورت دستور کارکنان پشتیبانی استفاده شود زیرا ممکن است منجر به از دست رفتن اطلاعات شود. در اینجا نحوه استفاده از ابزار GPSUR آورده شده است:

  1. اگر Android Debug Bridge (adb) را روی دستگاهتان اجرا می‌کنید، قبل از ادامه، سرویس adb را متوقف کنید تا در روند بازگشت اختلال ایجاد نکند. برای توقف adb، adb kill-server را اجرا کنید.
  2. ابزار GPSUR را باز کنید .
  3. روی Allow ADB access کلیک کنید تا ابزار از طریق adb با دستگاه آزمایشی شما ارتباط برقرار کند.
  4. روی افزودن دستگاه جدید کلیک کنید.
  5. دستگاه خود را از لیست انتخاب کنید و روی اتصال کلیک کنید. این لیست ممکن است حاوی نام کامل دستگاه نباشد.
  6. در صفحه دستگاه، گزینه Always allow from this computer را انتخاب کنید و روی OK کلیک کنید تا اتصال اشکال زدایی USB را بپذیرید.
  7. دستگاه متصل را در مرورگر خود انتخاب کنید.
  8. متن دکمه در صفحه باید از حالت No Rollbacks Available به Rollback Recent Updates در صورت وجود موارد بازگشتی در دستگاه شما تغییر کند. روی Rollback Recent Updates کلیک کنید.
  9. هشدارها را در Confirm Rollback Modal بخوانید و روی Confirm کلیک کنید.
  10. صبر کنید تا بازگشت کامل شود. پس از تکمیل، یک مودال بازگشت موفقیت آمیز ظاهر می شود و دستگاه راه اندازی مجدد می شود. اکنون می توانید دستگاه خود را از برق جدا کنید.

منابع اضافی

برای کسب اطلاعات بیشتر درباره به‌روزرسانی‌های سیستم، اسناد به‌روزرسانی OTA پروژه منبع باز Android را بخوانید.

،

این راهنمای توسعه‌دهنده توضیح می‌دهد که چگونه کنترل‌کننده خط‌مشی دستگاه شما (DPC) می‌تواند به‌روزرسانی‌های سیستم Android را از طرف کاربر دستگاه مدیریت کند.

مقدمه

دستگاه‌های Android می‌توانند به‌روزرسانی‌های هوایی (OTA) را برای سیستم و نرم‌افزار برنامه دریافت و نصب کنند. اندروید به کاربر دستگاه اطلاع می‌دهد که به‌روزرسانی سیستم در دسترس است و کاربر دستگاه می‌تواند فوراً یا بعداً به‌روزرسانی را نصب کند.

با استفاده از DPC، یک سرپرست فناوری اطلاعات می‌تواند به‌روزرسانی‌های سیستم را برای کاربر دستگاه مدیریت کند. DPCها می توانند صاحب یک دستگاه کاملاً مدیریت شده (به نام مالک دستگاه) یا می توانند دارای یک نمایه کاری (به نام مالک نمایه) باشند. جدول 1 نشان می دهد که چگونه صاحبان دستگاه می توانند به روز رسانی های سیستم را مدیریت کنند، در حالی که مالکان نمایه فقط می توانند اطلاعات مربوط به به روز رسانی های سیستم را گزارش کنند.

جدول 1 : وظایف موجود برای DPCها به حالت مالک بستگی دارد

وظیفه صاحب دستگاه مالک نمایه
به روز رسانی های معلق سیستم را بررسی کنید
هنگامی که به‌روزرسانی‌های جدید سیستم در دسترس قرار می‌گیرد، تماس‌های برگشتی دریافت کنید
یک خط‌مشی به‌روزرسانی محلی تنظیم کنید تا زمانی که Android به‌روزرسانی‌های سیستم را نصب می‌کند، کنترل کنید
نسخه سیستم عامل را در دوره های بحرانی فریز کنید

به روز رسانی های معلق را بررسی کنید

به روز رسانی معلق یک به روز رسانی سیستم برای دستگاهی است که هنوز نصب نشده است. DPC شما می‌تواند به سرپرستان فناوری اطلاعات کمک کند تا بررسی کنند کدام دستگاه‌ها به‌روزرسانی‌های سیستم معلق دارند - و شاید از کاربران دستگاه بخواهند که به‌روزرسانی‌های مهم را فوراً نصب کنند.

دارندگان دستگاه و مالکان نمایه‌ای که با Android نسخه ۸.۰ (سطح API ۲۶) یا بالاتر اجرا می‌شوند، می‌توانند بررسی کنند که آیا دستگاهی به‌روزرسانی سیستم معلق دارد یا خیر. DevicePolicyManager.getPendingSystemUpdate() را فراخوانی کنید که اگر دستگاه به روز باشد، null برمی گرداند. اگر به‌روزرسانی سیستم در انتظار باشد، این روش اطلاعات مربوط به به‌روزرسانی را برمی‌گرداند.

درباره به‌روزرسانی معلق بیشتر بدانید

پس از فراخوانی getPendingSystemUpdate() می توانید مقدار SystemUpdateInfo برگشتی را بررسی کنید تا در مورد به روز رسانی معلق بیشتر بدانید. مثال زیر نشان می دهد که چگونه می توانید متوجه شوید که یک به روز رسانی معلق برای اولین بار در دستگاه در دسترس بوده است:

کاتلین

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

جاوا

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

تماس های سیستمی

هنگامی که یک به‌روزرسانی در دسترس قرار می‌گیرد، سیستم Android صاحبان دستگاه را از به‌روزرسانی جدید مطلع می‌کند. در اندروید 8.0 یا بالاتر، سیستم به صاحبان پروفایل نیز اطلاع می‌دهد.

در زیر کلاس DeviceAdminReceiver ، فراخوانی onSystemUpdatePending() لغو کنید. برای دریافت پاسخ تماس نیازی به ثبت نام یا تبلیغ برای DPC خود ندارید. ممکن است سیستم برای یک به‌روزرسانی، بیش از یک بار این روش را فراخوانی کند، بنابراین قبل از پاسخ دادن، وضعیت به‌روزرسانی را بررسی کنید. با getPendingSystemUpdate() تماس بگیرید تا در مورد به روز رسانی سیستم در callback اطلاعات بیشتری کسب کنید. مثال زیر نشان می دهد که چگونه می توانید این کار را انجام دهید:

کاتلین

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

جاوا

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

هنگامی که یک سیستم بیش از یک DPC دارد، برای مثال نمایه های کاری در دستگاه های کاملاً مدیریت شده، مالک دستگاه و مالک نمایه هر دو پاسخ تماس را دریافت می کنند.

به روز رسانی سیاست ها

صاحب دستگاه می تواند با تنظیم خط مشی به روز رسانی سیستم محلی برای دستگاه، زمان نصب به روز رسانی ها را کنترل کند. خط مشی به روز رسانی سیستم می تواند یکی از سه نوع باشد:

خودکار
به‌روزرسانی‌های سیستم را به محض در دسترس شدن (بدون تعامل کاربر) نصب می‌کند. تنظیم این نوع خط‌مشی فوراً هر به‌روزرسانی معلقی را که ممکن است به تعویق بیفتد یا منتظر یک پنجره تعمیر و نگهداری باشد، نصب می‌کند.
پنجره دار
به روز رسانی های سیستم را در طول یک پنجره تعمیر و نگهداری روزانه (بدون تعامل کاربر) نصب می کند. هنگام ایجاد یک خط مشی پنجره‌دار جدید، شروع و پایان پنجره نگهداری روزانه را به‌عنوان دقیقه‌های روز تنظیم کنید.
به تعویق افتاد
نصب به روز رسانی سیستم را به مدت 30 روز به تعویق می اندازد. پس از پایان دوره 30 روزه، سیستم از کاربر دستگاه می خواهد که به روز رسانی را نصب کند.

دوره های تعویق

سیستم هر به روز رسانی را به یک تعویق 30 روزه محدود می کند. این دوره زمانی شروع می‌شود که سیستم برای اولین بار به‌روزرسانی را به تعویق می‌اندازد و تنظیم سیاست‌های تعویق جدید باعث تمدید دوره نمی‌شود.

علاوه بر به تعویق انداختن، ممکن است اندروید به دلایل دیگری مانند عدم اتصال، فضای ناکافی دیسک یا باتری کم نتواند به‌روزرسانی را نصب کند.

سیستم تایمر تعویق 30 روزه را بازنشانی می‌کند، اگر به‌روزرسانی دیگری در طول دوره در دسترس باشد، به مدیران فناوری اطلاعات این فرصت را می‌دهد تا به‌روزرسانی‌های ترکیبی سیستم را امتحان کنند. هنگامی که 30 روز بدون به روز رسانی جدید می گذرد، سیستم از کاربر می خواهد که تمام به روز رسانی های معلق را نصب کند. بعداً، وقتی یک به‌روزرسانی جدید سیستم در دسترس قرار گرفت، دوره 30 روزه دوباره شروع می‌شود.

نحوه تنظیم یک خط مشی

می‌توانید خط‌مشی‌های به‌روزرسانی را در Android 8.0 (سطح API 26) یا بالاتر تنظیم کنید. برای تعیین زمانی که دستگاه باید به‌روزرسانی‌های سیستم را نصب کند، یک نمونه از SystemUpdatePolicy را با استفاده از یکی از سه نوع ذکر شده در بالا ایجاد کنید. برای تنظیم یک خط‌مشی، مالک دستگاه شما روش DevicePolicyManager setSystemUpdatePolicy() را فراخوانی می‌کند. نمونه کد زیر نشان می دهد که چگونه می توانید این کار را انجام دهید. برای دیدن مثالی از سیاست پنجره ای، به مستندات SystemUpdatePolicy نگاه کنید.

کاتلین

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

جاوا

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

نمونه‌های خط‌مشی پس از ایجاد آن‌ها قابل تغییر نیستند. برای تغییر زمانی که دستگاهی به‌روزرسانی‌ها را نصب می‌کند، می‌توانید خط‌مشی جدیدی ایجاد و تنظیم کنید. برای حذف یک خط مشی از دستگاه، setSystemUpdatePolicy() را به عنوان آرگومان policy null ارسال کنید. پس از اینکه DPC شما خط‌مشی را حذف کرد، کاربر دستگاه اعلان‌هایی را برای به‌روزرسانی‌های موجود سیستم می‌بیند.

برنامه‌ها می‌توانند برای دریافت خط‌مشی فعلی دستگاه، getSystemUpdatePolicy() را فراخوانی کنند. اگر این روش null را برگرداند، به این معنی است که یک خط مشی در حال حاضر تنظیم نشده است.

دوره های انجماد

برای مسدود کردن نسخه سیستم عامل در دوره‌های بحرانی، مانند تعطیلات یا دیگر زمان‌های شلوغ، صاحبان دستگاه‌ها می‌توانند به‌روزرسانی‌های سیستم را تا 90 روز به حالت تعلیق درآورند. هنگامی که یک دستگاه در دوره انجماد قرار دارد به صورت زیر عمل می کند:

  • دستگاه هیچ اعلانی درباره به‌روزرسانی‌های معلق سیستم دریافت نمی‌کند.
  • به روز رسانی سیستم عامل نصب نشده است.
  • کاربران دستگاه نمی توانند به صورت دستی به روز رسانی های سیستم را در تنظیمات بررسی کنند.

این سیستم یک دوره بافر اجباری 60 روزه را پس از هر دوره انجماد تعریف شده اعمال می کند تا از یخ زدن دستگاه به طور نامحدود جلوگیری کند. به یاد داشته باشید، ثابت کردن به‌روزرسانی‌های سیستم می‌تواند از دریافت به‌روزرسانی‌های حیاتی دستگاه‌ها جلوگیری کند.

شکل 1. دو دوره انجماد تنظیم شده برای یک دستگاه
تقویمی که دو دوره انجماد را در یک سال با بافرهای 60 روزه نشان می دهد.

شما دوره های توقف را در یک خط مشی به روز رسانی تنظیم می کنید. شما نمی توانید دوره های توقف را بدون تنظیم خط مشی تنظیم کنید. وقتی دستگاه خارج از دوره‌های توقفی است که تنظیم کرده‌اید، رفتار خط‌مشی عادی (خودکار، پنجره‌دار یا به تعویق افتاده) اعمال می‌شود.

نحوه تنظیم دوره انجماد

می‌توانید دوره‌های توقف را در Android 9 (سطح API 28) یا بالاتر تنظیم کنید. مالک دستگاه قبل از تنظیم خط‌مشی برای دستگاه، یک دوره توقف را برای خط‌مشی به‌روزرسانی سیستم تعیین می‌کند. مراحل عبارتند از:

  1. یک خط مشی به روز رسانی سیستم جدید (یا دریافت کنید) ایجاد کنید.
  2. با فراخوانی setFreezePeriods() دوره‌های انجماد را روی خط‌مشی تنظیم کنید.
  3. با فراخوانی setSystemUpdatePolicy() ، خط مشی و دوره های ثابت را برای دستگاه تنظیم کنید.

از آنجا که دوره انجماد سالانه تکرار می شود، تاریخ شروع و پایان دوره با مقادیر ماه و روز نمایش داده می شود. روز شروع باید حداقل 60 روز پس از پایان هر دوره انجماد قبلی شروع شود. مثال زیر نشان می دهد که چگونه می توانید دو دوره توقف را برای یک خط مشی به روز رسانی سیستم موجود تنظیم کنید:

کاتلین

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

جاوا

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

هم روز شروع و هم روز پایان شامل می شود. اگر روز شروع بزرگتر از روز پایان باشد (مانند winterSale در مثال قبلی)، دوره انجماد تا سال بعد ادامه می یابد.

هنگام تنظیم دوره‌های توقف در خط‌مشی به‌روزرسانی سیستم، Android این موارد را آزمایش می‌کند:

  • هیچ دوره انجمادی بیش از 90 روز نیست.
  • فاصله بین دوره های انجماد حداقل 60 روز است.
  • دوره های انجماد با هم همپوشانی ندارند.
  • هیچ دوره انجماد تکراری وجود ندارد.

هنگام تنظیم خط‌مشی به‌روزرسانی سیستم برای دستگاه، Android این آزمایش‌ها را تکرار می‌کند و دوره‌های ثابت فعلی یا گذشته دستگاه را شامل می‌شود.

Android یک SystemUpdatePolicy.ValidationFailedException را زمانی که هر یک از این تست ها با شکست مواجه می شود، پرتاب می کند.

برای دریافت لیستی از دوره‌های انجماد که قبلاً روی یک شی سیاست به‌روزرسانی سیستم تنظیم شده‌اند، همه برنامه‌های نصب شده می‌توانند SystemUpdatePolicy.getFreezePeriods() را فراخوانی کنند. مثال زیر این روش را برای ثبت دوره های انجماد دستگاه فراخوانی می کند:

کاتلین

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

جاوا

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

سالهای کبیسه

اندروید از تقویم ISO 8601 (که تقویم میلادی نیز نامیده می شود) برای محاسبه دوره های انجماد استفاده می کند و سال های کبیسه را نادیده می گیرد. این بدان معنی است که 29 فوریه به عنوان یک تاریخ معتبر شناخته نمی شود و به گونه ای رفتار می شود که گویی 28 فوریه است. بنابراین، 29 فوریه هنگام محاسبه مدت یک دوره انجماد محاسبه نمی شود.

توسعه و آزمایش

در حالی که در حال توسعه و آزمایش ویژگی به‌روزرسانی سیستم DPC خود هستید، ممکن است لازم باشد دوره‌های توقف زیادی ایجاد کنید. از آنجایی که Android فاصله 60 روزه بین دوره‌های انجماد گذشته را بررسی می‌کند، ممکن است نتوانید بدون پاک کردن رکورد دوره‌های گذشته، دوره ثابت جدیدی را تنظیم کنید. برای پاک کردن رکورد دوره انجماد دستگاه، دستور زیر را در پوسته Android Debug Bridge (adb) اجرا کنید:

adb shell dpm clear-freeze-period-record

با بررسی غیرفعال بودن رابط کاربری برای به‌روزرسانی‌های سیستم، می‌توانید تأیید کنید که دستگاهی در دوره توقف قرار دارد.

به‌روزرسانی‌های سیستم Google Play (خط اصلی)

به‌روزرسانی‌های سیستم Google Play (که به‌روزرسانی‌های خط اصلی نیز گفته می‌شود) به‌طور خودکار دانلود می‌شوند، اما برای نصب نیاز به راه‌اندازی مجدد دستگاه دارند. این به‌روزرسانی‌ها راه‌اندازی مجدد خودکار را راه‌اندازی نمی‌کنند و در عوض روی راه‌اندازی مجدد کاربر، سرپرست یا سیاست‌گذاری بعدی نصب می‌شوند. راه‌اندازی مجدد توسط خط‌مشی به‌روزرسانی سیستم، به‌روزرسانی سیستم Google/OEM مرتبط و هر به‌روزرسانی سیستم Google Play را که قبلاً دانلود شده است، نصب می‌کند.

به‌روزرسانی‌های سیستم Google Play را می‌توان با پیمایش به تنظیمات > درباره > نسخه اندروید > به‌روزرسانی سیستم Google Play به صورت دستی نصب کرد.

یک به‌روزرسانی را برگردانید

در برخی موارد، ابزار Google Play System Update Rollbacks (GPSUR) می تواند برای بازیابی وضعیت دستگاه به دلیل نصب مشکل ساز به روز رسانی سیستم Google Play استفاده شود. این ابزار باید توسط کاربران پیشرفته یا در صورت دستور کارکنان پشتیبانی استفاده شود زیرا ممکن است منجر به از دست رفتن اطلاعات شود. در اینجا نحوه استفاده از ابزار GPSUR آورده شده است:

  1. اگر Android Debug Bridge (adb) را روی دستگاهتان اجرا می‌کنید، قبل از ادامه، سرویس adb را متوقف کنید تا در روند بازگشت اختلال ایجاد نکند. برای توقف adb، adb kill-server را اجرا کنید.
  2. ابزار GPSUR را باز کنید .
  3. روی Allow ADB access کلیک کنید تا ابزار از طریق adb با دستگاه آزمایشی شما ارتباط برقرار کند.
  4. روی افزودن دستگاه جدید کلیک کنید.
  5. دستگاه خود را از لیست انتخاب کنید و روی اتصال کلیک کنید. این لیست ممکن است حاوی نام کامل دستگاه نباشد.
  6. در صفحه دستگاه، گزینه Always allow from this computer را انتخاب کنید و روی OK کلیک کنید تا اتصال اشکال زدایی USB را بپذیرید.
  7. دستگاه متصل را در مرورگر خود انتخاب کنید.
  8. متن دکمه در صفحه باید از حالت No Rollbacks Available به Rollback Recent Updates در صورت وجود موارد بازگشتی در دستگاه شما تغییر کند. روی Rollback Recent Updates کلیک کنید.
  9. هشدارها را در Confirm Rollback Modal بخوانید و روی Confirm کلیک کنید.
  10. صبر کنید تا بازگشت کامل شود. پس از تکمیل، یک مودال بازگشت موفقیت آمیز ظاهر می شود و دستگاه راه اندازی مجدد می شود. اکنون می توانید دستگاه خود را از برق جدا کنید.

منابع اضافی

برای کسب اطلاعات بیشتر درباره به‌روزرسانی‌های سیستم، اسناد به‌روزرسانی OTA پروژه منبع باز Android را بخوانید.

،

این راهنمای توسعه‌دهنده توضیح می‌دهد که چگونه کنترل‌کننده خط‌مشی دستگاه شما (DPC) می‌تواند به‌روزرسانی‌های سیستم Android را از طرف کاربر دستگاه مدیریت کند.

مقدمه

دستگاه‌های Android می‌توانند به‌روزرسانی‌های هوایی (OTA) را برای سیستم و نرم‌افزار برنامه دریافت و نصب کنند. اندروید به کاربر دستگاه اطلاع می‌دهد که به‌روزرسانی سیستم در دسترس است و کاربر دستگاه می‌تواند فوراً یا بعداً به‌روزرسانی را نصب کند.

با استفاده از DPC، یک سرپرست فناوری اطلاعات می‌تواند به‌روزرسانی‌های سیستم را برای کاربر دستگاه مدیریت کند. DPCها می توانند صاحب یک دستگاه کاملاً مدیریت شده (به نام مالک دستگاه) یا می توانند دارای یک نمایه کاری (به نام مالک نمایه) باشند. جدول 1 نشان می دهد که چگونه صاحبان دستگاه می توانند به روز رسانی های سیستم را مدیریت کنند، در حالی که مالکان نمایه فقط می توانند اطلاعات مربوط به به روز رسانی های سیستم را گزارش کنند.

جدول 1 : وظایف موجود برای DPCها به حالت مالک بستگی دارد

وظیفه صاحب دستگاه مالک نمایه
به روز رسانی های معلق سیستم را بررسی کنید
هنگامی که به‌روزرسانی‌های جدید سیستم در دسترس قرار می‌گیرد، تماس‌های برگشتی دریافت کنید
یک خط‌مشی به‌روزرسانی محلی تنظیم کنید تا زمانی که Android به‌روزرسانی‌های سیستم را نصب می‌کند، کنترل کنید
نسخه سیستم عامل را در دوره های بحرانی فریز کنید

به روز رسانی های معلق را بررسی کنید

به روز رسانی معلق یک به روز رسانی سیستم برای دستگاهی است که هنوز نصب نشده است. DPC شما می‌تواند به سرپرستان فناوری اطلاعات کمک کند تا بررسی کنند کدام دستگاه‌ها به‌روزرسانی‌های سیستم معلق دارند - و شاید از کاربران دستگاه بخواهند که به‌روزرسانی‌های مهم را فوراً نصب کنند.

دارندگان دستگاه و مالکان نمایه‌ای که با Android نسخه ۸.۰ (سطح API ۲۶) یا بالاتر اجرا می‌شوند، می‌توانند بررسی کنند که آیا دستگاهی به‌روزرسانی سیستم معلق دارد یا خیر. DevicePolicyManager.getPendingSystemUpdate() را فراخوانی کنید که اگر دستگاه به روز باشد، null برمی گرداند. اگر به‌روزرسانی سیستم در انتظار باشد، این روش اطلاعات مربوط به به‌روزرسانی را برمی‌گرداند.

درباره به‌روزرسانی معلق بیشتر بدانید

پس از فراخوانی getPendingSystemUpdate() می توانید مقدار SystemUpdateInfo برگشتی را بررسی کنید تا در مورد به روز رسانی معلق بیشتر بدانید. مثال زیر نشان می دهد که چگونه می توانید متوجه شوید که یک به روز رسانی معلق برای اولین بار در دستگاه در دسترس بوده است:

کاتلین

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

جاوا

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

تماس های سیستمی

هنگامی که یک به‌روزرسانی در دسترس قرار می‌گیرد، سیستم Android صاحبان دستگاه را از به‌روزرسانی جدید مطلع می‌کند. در اندروید 8.0 یا بالاتر، سیستم به صاحبان پروفایل نیز اطلاع می‌دهد.

در زیر کلاس DeviceAdminReceiver ، فراخوانی onSystemUpdatePending() لغو کنید. برای دریافت پاسخ تماس نیازی به ثبت نام یا تبلیغ برای DPC خود ندارید. ممکن است سیستم برای یک به‌روزرسانی، بیش از یک بار این روش را فراخوانی کند، بنابراین قبل از پاسخ دادن، وضعیت به‌روزرسانی را بررسی کنید. با getPendingSystemUpdate() تماس بگیرید تا در مورد به روز رسانی سیستم در callback اطلاعات بیشتری کسب کنید. مثال زیر نشان می دهد که چگونه می توانید این کار را انجام دهید:

کاتلین

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

جاوا

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

هنگامی که یک سیستم بیش از یک DPC دارد، برای مثال نمایه های کاری در دستگاه های کاملاً مدیریت شده، مالک دستگاه و مالک نمایه هر دو پاسخ تماس را دریافت می کنند.

به روز رسانی سیاست ها

صاحب دستگاه می تواند با تنظیم خط مشی به روز رسانی سیستم محلی برای دستگاه، زمان نصب به روز رسانی ها را کنترل کند. خط مشی به روز رسانی سیستم می تواند یکی از سه نوع باشد:

خودکار
به‌روزرسانی‌های سیستم را به محض در دسترس شدن (بدون تعامل کاربر) نصب می‌کند. تنظیم این نوع خط‌مشی فوراً هر به‌روزرسانی معلقی را که ممکن است به تعویق بیفتد یا منتظر یک پنجره تعمیر و نگهداری باشد، نصب می‌کند.
پنجره دار
به روز رسانی های سیستم را در طول یک پنجره تعمیر و نگهداری روزانه (بدون تعامل کاربر) نصب می کند. هنگام ایجاد یک خط مشی پنجره‌دار جدید، شروع و پایان پنجره نگهداری روزانه را به‌عنوان دقیقه‌های روز تنظیم کنید.
به تعویق افتاد
نصب به روز رسانی سیستم را به مدت 30 روز به تعویق می اندازد. پس از پایان دوره 30 روزه، سیستم از کاربر دستگاه می خواهد که به روز رسانی را نصب کند.

دوره های تعویق

سیستم هر به روز رسانی را به یک تعویق 30 روزه محدود می کند. این دوره زمانی شروع می‌شود که سیستم برای اولین بار به‌روزرسانی را به تعویق می‌اندازد و تنظیم سیاست‌های تعویق جدید باعث تمدید دوره نمی‌شود.

علاوه بر به تعویق انداختن، ممکن است اندروید به دلایل دیگری مانند عدم اتصال، فضای ناکافی دیسک یا باتری کم نتواند به‌روزرسانی را نصب کند.

سیستم تایمر تعویق 30 روزه را بازنشانی می‌کند، اگر به‌روزرسانی دیگری در طول دوره در دسترس باشد، به مدیران فناوری اطلاعات این فرصت را می‌دهد تا به‌روزرسانی‌های ترکیبی سیستم را امتحان کنند. هنگامی که 30 روز بدون به روز رسانی جدید می گذرد، سیستم از کاربر می خواهد که تمام به روز رسانی های معلق را نصب کند. بعداً، وقتی یک به‌روزرسانی جدید سیستم در دسترس قرار گرفت، دوره 30 روزه دوباره شروع می‌شود.

نحوه تنظیم یک خط مشی

می‌توانید خط‌مشی‌های به‌روزرسانی را در Android 8.0 (سطح API 26) یا بالاتر تنظیم کنید. برای تعیین زمانی که دستگاه باید به‌روزرسانی‌های سیستم را نصب کند، یک نمونه از SystemUpdatePolicy را با استفاده از یکی از سه نوع ذکر شده در بالا ایجاد کنید. برای تنظیم یک خط‌مشی، مالک دستگاه شما روش DevicePolicyManager setSystemUpdatePolicy() را فراخوانی می‌کند. نمونه کد زیر نشان می دهد که چگونه می توانید این کار را انجام دهید. برای دیدن مثالی از سیاست پنجره ای، به مستندات SystemUpdatePolicy نگاه کنید.

کاتلین

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

جاوا

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

نمونه‌های خط‌مشی پس از ایجاد آن‌ها قابل تغییر نیستند. برای تغییر زمانی که دستگاهی به‌روزرسانی‌ها را نصب می‌کند، می‌توانید خط‌مشی جدیدی ایجاد و تنظیم کنید. برای حذف یک خط مشی از دستگاه، setSystemUpdatePolicy() را به عنوان آرگومان policy null ارسال کنید. پس از اینکه DPC شما خط‌مشی را حذف کرد، کاربر دستگاه اعلان‌هایی را برای به‌روزرسانی‌های موجود سیستم می‌بیند.

برنامه‌ها می‌توانند برای دریافت خط‌مشی فعلی دستگاه، getSystemUpdatePolicy() را فراخوانی کنند. اگر این روش null را برگرداند، به این معنی است که یک خط مشی در حال حاضر تنظیم نشده است.

دوره های انجماد

برای مسدود کردن نسخه سیستم عامل در دوره‌های بحرانی، مانند تعطیلات یا دیگر زمان‌های شلوغ، صاحبان دستگاه‌ها می‌توانند به‌روزرسانی‌های سیستم را تا 90 روز به حالت تعلیق درآورند. هنگامی که یک دستگاه در دوره انجماد قرار دارد به صورت زیر عمل می کند:

  • دستگاه هیچ اعلانی درباره به‌روزرسانی‌های معلق سیستم دریافت نمی‌کند.
  • به روز رسانی سیستم عامل نصب نشده است.
  • کاربران دستگاه نمی توانند به صورت دستی به روز رسانی های سیستم را در تنظیمات بررسی کنند.

این سیستم یک دوره بافر اجباری 60 روزه را پس از هر دوره انجماد تعریف شده اعمال می کند تا از یخ زدن دستگاه به طور نامحدود جلوگیری کند. به یاد داشته باشید، ثابت کردن به‌روزرسانی‌های سیستم می‌تواند از دریافت به‌روزرسانی‌های حیاتی دستگاه‌ها جلوگیری کند.

شکل 1. دو دوره انجماد تنظیم شده برای یک دستگاه
تقویمی که دو دوره انجماد را در یک سال با بافرهای 60 روزه نشان می دهد.

شما دوره های توقف را در یک خط مشی به روز رسانی تنظیم می کنید. شما نمی توانید دوره های توقف را بدون تنظیم خط مشی تنظیم کنید. وقتی دستگاه خارج از دوره‌های توقفی است که تنظیم کرده‌اید، رفتار خط‌مشی عادی (خودکار، پنجره‌دار یا به تعویق افتاده) اعمال می‌شود.

نحوه تنظیم دوره انجماد

می‌توانید دوره‌های توقف را در Android 9 (سطح API 28) یا بالاتر تنظیم کنید. مالک دستگاه قبل از تنظیم خط‌مشی برای دستگاه، یک دوره توقف را برای خط‌مشی به‌روزرسانی سیستم تعیین می‌کند. مراحل عبارتند از:

  1. یک خط مشی به روز رسانی سیستم جدید (یا دریافت کنید) ایجاد کنید.
  2. با فراخوانی setFreezePeriods() دوره‌های انجماد را روی خط‌مشی تنظیم کنید.
  3. با فراخوانی setSystemUpdatePolicy() ، خط مشی و دوره های ثابت را برای دستگاه تنظیم کنید.

از آنجا که دوره انجماد سالانه تکرار می شود، تاریخ شروع و پایان دوره با مقادیر ماه و روز نمایش داده می شود. روز شروع باید حداقل 60 روز پس از پایان هر دوره انجماد قبلی شروع شود. مثال زیر نشان می دهد که چگونه می توانید دو دوره توقف را برای یک خط مشی به روز رسانی سیستم موجود تنظیم کنید:

کاتلین

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

جاوا

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

هم روز شروع و هم روز پایان شامل می شود. اگر روز شروع بزرگتر از روز پایان باشد (مانند winterSale در مثال قبلی)، دوره انجماد تا سال بعد ادامه می یابد.

هنگام تنظیم دوره‌های توقف در خط‌مشی به‌روزرسانی سیستم، Android این موارد را آزمایش می‌کند:

  • هیچ دوره انجمادی بیش از 90 روز نیست.
  • فاصله بین دوره های انجماد حداقل 60 روز است.
  • دوره های انجماد با هم همپوشانی ندارند.
  • هیچ دوره انجماد تکراری وجود ندارد.

هنگام تنظیم خط‌مشی به‌روزرسانی سیستم برای دستگاه، Android این آزمایش‌ها را تکرار می‌کند و دوره‌های ثابت فعلی یا گذشته دستگاه را شامل می‌شود.

Android یک SystemUpdatePolicy.ValidationFailedException را زمانی که هر یک از این تست ها با شکست مواجه می شود، پرتاب می کند.

برای دریافت لیستی از دوره‌های انجماد که قبلاً روی یک شی سیاست به‌روزرسانی سیستم تنظیم شده‌اند، همه برنامه‌های نصب شده می‌توانند SystemUpdatePolicy.getFreezePeriods() را فراخوانی کنند. مثال زیر این روش را برای ثبت دوره های انجماد دستگاه فراخوانی می کند:

کاتلین

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

جاوا

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

سالهای کبیسه

اندروید از تقویم ISO 8601 (که تقویم میلادی نیز نامیده می شود) برای محاسبه دوره های انجماد استفاده می کند و سال های کبیسه را نادیده می گیرد. این بدان معنی است که 29 فوریه به عنوان یک تاریخ معتبر شناخته نمی شود و به گونه ای رفتار می شود که گویی 28 فوریه است. بنابراین، 29 فوریه هنگام محاسبه مدت یک دوره انجماد محاسبه نمی شود.

توسعه و آزمایش

در حالی که در حال توسعه و آزمایش ویژگی به‌روزرسانی سیستم DPC خود هستید، ممکن است لازم باشد دوره‌های توقف زیادی ایجاد کنید. از آنجایی که Android فاصله 60 روزه بین دوره‌های انجماد گذشته را بررسی می‌کند، ممکن است نتوانید بدون پاک کردن رکورد دوره‌های گذشته، دوره ثابت جدیدی را تنظیم کنید. برای پاک کردن رکورد دوره انجماد دستگاه، دستور زیر را در پوسته Android Debug Bridge (adb) اجرا کنید:

adb shell dpm clear-freeze-period-record

با بررسی غیرفعال بودن رابط کاربری برای به‌روزرسانی‌های سیستم، می‌توانید تأیید کنید که دستگاهی در دوره توقف قرار دارد.

به‌روزرسانی‌های سیستم Google Play (خط اصلی)

به‌روزرسانی‌های سیستم Google Play (که به‌روزرسانی‌های خط اصلی نیز گفته می‌شود) به‌طور خودکار دانلود می‌شوند، اما برای نصب نیاز به راه‌اندازی مجدد دستگاه دارند. این به‌روزرسانی‌ها راه‌اندازی مجدد خودکار را راه‌اندازی نمی‌کنند و در عوض روی راه‌اندازی مجدد کاربر، سرپرست یا سیاست‌گذاری بعدی نصب می‌شوند. راه‌اندازی مجدد توسط خط‌مشی به‌روزرسانی سیستم، به‌روزرسانی سیستم Google/OEM مرتبط و هر به‌روزرسانی سیستم Google Play را که قبلاً دانلود شده است، نصب می‌کند.

به‌روزرسانی‌های سیستم Google Play را می‌توان با پیمایش به تنظیمات > درباره > نسخه اندروید > به‌روزرسانی سیستم Google Play به صورت دستی نصب کرد.

یک به‌روزرسانی را برگردانید

در برخی موارد، ابزار Google Play System Update Rollbacks (GPSUR) می تواند برای بازیابی وضعیت دستگاه به دلیل نصب مشکل ساز به روز رسانی سیستم Google Play استفاده شود. این ابزار باید توسط کاربران پیشرفته یا در صورت دستور کارکنان پشتیبانی استفاده شود زیرا ممکن است منجر به از دست رفتن اطلاعات شود. در اینجا نحوه استفاده از ابزار GPSUR آورده شده است:

  1. اگر Android Debug Bridge (adb) را روی دستگاهتان اجرا می‌کنید، قبل از ادامه، سرویس adb را متوقف کنید تا در روند بازگشت اختلال ایجاد نکند. برای توقف adb، adb kill-server را اجرا کنید.
  2. ابزار GPSUR را باز کنید .
  3. روی Allow ADB access کلیک کنید تا ابزار از طریق adb با دستگاه آزمایشی شما ارتباط برقرار کند.
  4. روی افزودن دستگاه جدید کلیک کنید.
  5. دستگاه خود را از لیست انتخاب کنید و روی اتصال کلیک کنید. این لیست ممکن است حاوی نام کامل دستگاه نباشد.
  6. در صفحه دستگاه، گزینه Always allow from this computer را انتخاب کنید و روی OK کلیک کنید تا اتصال اشکال زدایی USB را بپذیرید.
  7. دستگاه متصل را در مرورگر خود انتخاب کنید.
  8. متن دکمه در صفحه باید از حالت No Rollbacks Available به Rollback Recent Updates در صورت وجود موارد بازگشتی در دستگاه شما تغییر کند. روی Rollback Recent Updates کلیک کنید.
  9. هشدارها را در Confirm Rollback Modal بخوانید و روی Confirm کلیک کنید.
  10. صبر کنید تا بازگشت کامل شود. پس از تکمیل، یک مودال بازگشت موفقیت آمیز ظاهر می شود و دستگاه راه اندازی مجدد می شود. اکنون می توانید دستگاه خود را از برق جدا کنید.

منابع اضافی

برای کسب اطلاعات بیشتر درباره به‌روزرسانی‌های سیستم، اسناد به‌روزرسانی OTA پروژه منبع باز Android را بخوانید.

،

این راهنمای توسعه‌دهنده توضیح می‌دهد که چگونه کنترل‌کننده خط‌مشی دستگاه شما (DPC) می‌تواند به‌روزرسانی‌های سیستم Android را از طرف کاربر دستگاه مدیریت کند.

مقدمه

دستگاه‌های Android می‌توانند به‌روزرسانی‌های هوایی (OTA) را برای سیستم و نرم‌افزار برنامه دریافت و نصب کنند. اندروید به کاربر دستگاه اطلاع می‌دهد که به‌روزرسانی سیستم در دسترس است و کاربر دستگاه می‌تواند فوراً یا بعداً به‌روزرسانی را نصب کند.

با استفاده از DPC، یک سرپرست فناوری اطلاعات می‌تواند به‌روزرسانی‌های سیستم را برای کاربر دستگاه مدیریت کند. DPCها می توانند صاحب یک دستگاه کاملاً مدیریت شده (به نام مالک دستگاه) یا می توانند دارای یک نمایه کاری (به نام مالک نمایه) باشند. جدول 1 نشان می دهد که چگونه صاحبان دستگاه می توانند به روز رسانی های سیستم را مدیریت کنند، در حالی که مالکان نمایه فقط می توانند اطلاعات مربوط به به روز رسانی های سیستم را گزارش کنند.

جدول 1 : وظایف موجود برای DPCها به حالت مالک بستگی دارد

وظیفه صاحب دستگاه مالک نمایه
به روز رسانی های معلق سیستم را بررسی کنید
هنگامی که به‌روزرسانی‌های جدید سیستم در دسترس قرار می‌گیرد، تماس‌های برگشتی دریافت کنید
یک خط‌مشی به‌روزرسانی محلی تنظیم کنید تا زمانی که Android به‌روزرسانی‌های سیستم را نصب می‌کند، کنترل کنید
نسخه سیستم عامل را در دوره های بحرانی فریز کنید

به روز رسانی های معلق را بررسی کنید

به روز رسانی معلق یک به روز رسانی سیستم برای دستگاهی است که هنوز نصب نشده است. DPC شما می‌تواند به سرپرستان فناوری اطلاعات کمک کند تا بررسی کنند کدام دستگاه‌ها به‌روزرسانی‌های سیستم معلق دارند - و شاید از کاربران دستگاه بخواهند که به‌روزرسانی‌های مهم را فوراً نصب کنند.

دارندگان دستگاه و مالکان نمایه‌ای که با Android نسخه ۸.۰ (سطح API ۲۶) یا بالاتر اجرا می‌شوند، می‌توانند بررسی کنند که آیا دستگاهی به‌روزرسانی سیستم معلق دارد یا خیر. DevicePolicyManager.getPendingSystemUpdate() را فراخوانی کنید که اگر دستگاه به روز باشد، null برمی گرداند. اگر به‌روزرسانی سیستم در انتظار باشد، این روش اطلاعات مربوط به به‌روزرسانی را برمی‌گرداند.

درباره به‌روزرسانی معلق بیشتر بدانید

پس از فراخوانی getPendingSystemUpdate() می توانید مقدار SystemUpdateInfo برگشتی را بررسی کنید تا در مورد به روز رسانی معلق بیشتر بدانید. مثال زیر نشان می دهد که چگونه می توانید متوجه شوید که یک به روز رسانی معلق برای اولین بار در دستگاه در دسترس بوده است:

کاتلین

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

جاوا

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

تماس های سیستمی

هنگامی که یک به‌روزرسانی در دسترس قرار می‌گیرد، سیستم Android صاحبان دستگاه را از به‌روزرسانی جدید مطلع می‌کند. در اندروید 8.0 یا بالاتر، سیستم به صاحبان پروفایل نیز اطلاع می‌دهد.

در زیر کلاس DeviceAdminReceiver ، فراخوانی onSystemUpdatePending() لغو کنید. برای دریافت پاسخ تماس نیازی به ثبت نام یا تبلیغ برای DPC خود ندارید. ممکن است سیستم برای یک به‌روزرسانی، بیش از یک بار این روش را فراخوانی کند، بنابراین قبل از پاسخ دادن، وضعیت به‌روزرسانی را بررسی کنید. با getPendingSystemUpdate() تماس بگیرید تا در مورد به روز رسانی سیستم در callback اطلاعات بیشتری کسب کنید. مثال زیر نشان می دهد که چگونه می توانید این کار را انجام دهید:

کاتلین

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

جاوا

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

هنگامی که یک سیستم بیش از یک DPC دارد، برای مثال نمایه های کاری در دستگاه های کاملاً مدیریت شده، مالک دستگاه و مالک نمایه هر دو پاسخ تماس را دریافت می کنند.

به روز رسانی سیاست ها

صاحب دستگاه می تواند با تنظیم خط مشی به روز رسانی سیستم محلی برای دستگاه، زمان نصب به روز رسانی ها را کنترل کند. خط مشی به روز رسانی سیستم می تواند یکی از سه نوع باشد:

خودکار
به‌روزرسانی‌های سیستم را به محض در دسترس شدن (بدون تعامل کاربر) نصب می‌کند. تنظیم این نوع خط‌مشی فوراً هر به‌روزرسانی معلقی را که ممکن است به تعویق بیفتد یا منتظر یک پنجره تعمیر و نگهداری باشد، نصب می‌کند.
پنجره دار
به روز رسانی های سیستم را در طول یک پنجره تعمیر و نگهداری روزانه (بدون تعامل کاربر) نصب می کند. هنگام ایجاد یک خط مشی پنجره‌دار جدید، شروع و پایان پنجره نگهداری روزانه را به‌عنوان دقیقه‌های روز تنظیم کنید.
به تعویق افتاد
نصب به روز رسانی سیستم را به مدت 30 روز به تعویق می اندازد. پس از پایان دوره 30 روزه، سیستم از کاربر دستگاه می خواهد که به روز رسانی را نصب کند.

دوره های تعویق

سیستم هر به روز رسانی را به یک تعویق 30 روزه محدود می کند. این دوره زمانی شروع می‌شود که سیستم برای اولین بار به‌روزرسانی را به تعویق می‌اندازد و تنظیم سیاست‌های تعویق جدید باعث تمدید دوره نمی‌شود.

علاوه بر به تعویق انداختن، ممکن است اندروید به دلایل دیگری مانند عدم اتصال، فضای ناکافی دیسک یا باتری کم نتواند به‌روزرسانی را نصب کند.

سیستم تایمر تعویق 30 روزه را بازنشانی می‌کند، اگر به‌روزرسانی دیگری در طول دوره در دسترس باشد، به مدیران فناوری اطلاعات این فرصت را می‌دهد تا به‌روزرسانی‌های ترکیبی سیستم را امتحان کنند. هنگامی که 30 روز بدون به روز رسانی جدید می گذرد، سیستم از کاربر می خواهد که تمام به روز رسانی های معلق را نصب کند. بعداً، وقتی یک به‌روزرسانی جدید سیستم در دسترس قرار گرفت، دوره 30 روزه دوباره شروع می‌شود.

نحوه تنظیم یک خط مشی

می‌توانید خط‌مشی‌های به‌روزرسانی را در Android 8.0 (سطح API 26) یا بالاتر تنظیم کنید. برای تعیین زمانی که دستگاه باید به‌روزرسانی‌های سیستم را نصب کند، یک نمونه از SystemUpdatePolicy را با استفاده از یکی از سه نوع ذکر شده در بالا ایجاد کنید. برای تنظیم یک خط‌مشی، مالک دستگاه شما روش DevicePolicyManager setSystemUpdatePolicy() را فراخوانی می‌کند. نمونه کد زیر نشان می دهد که چگونه می توانید این کار را انجام دهید. برای دیدن مثالی از سیاست پنجره ای، به مستندات SystemUpdatePolicy نگاه کنید.

کاتلین

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

جاوا

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

نمونه‌های خط‌مشی پس از ایجاد آن‌ها قابل تغییر نیستند. برای تغییر زمانی که دستگاهی به‌روزرسانی‌ها را نصب می‌کند، می‌توانید خط‌مشی جدیدی ایجاد و تنظیم کنید. برای حذف یک خط مشی از دستگاه، setSystemUpdatePolicy() را به عنوان آرگومان policy null ارسال کنید. پس از اینکه DPC شما خط‌مشی را حذف کرد، کاربر دستگاه اعلان‌هایی را برای به‌روزرسانی‌های موجود سیستم می‌بیند.

برنامه‌ها می‌توانند برای دریافت خط‌مشی فعلی دستگاه، getSystemUpdatePolicy() را فراخوانی کنند. اگر این روش null را برگرداند، به این معنی است که یک خط مشی در حال حاضر تنظیم نشده است.

دوره های انجماد

برای مسدود کردن نسخه سیستم عامل در دوره‌های بحرانی، مانند تعطیلات یا دیگر زمان‌های شلوغ، صاحبان دستگاه‌ها می‌توانند به‌روزرسانی‌های سیستم را تا 90 روز به حالت تعلیق درآورند. هنگامی که یک دستگاه در دوره انجماد قرار دارد به صورت زیر عمل می کند:

  • دستگاه هیچ اعلانی درباره به‌روزرسانی‌های معلق سیستم دریافت نمی‌کند.
  • به روز رسانی سیستم عامل نصب نشده است.
  • کاربران دستگاه نمی توانند به صورت دستی به روز رسانی های سیستم را در تنظیمات بررسی کنند.

این سیستم یک دوره بافر اجباری 60 روزه را پس از هر دوره انجماد تعریف شده اعمال می کند تا از یخ زدن دستگاه به طور نامحدود جلوگیری کند. به یاد داشته باشید، ثابت کردن به‌روزرسانی‌های سیستم می‌تواند از دریافت به‌روزرسانی‌های حیاتی دستگاه‌ها جلوگیری کند.

شکل 1. دو دوره انجماد تنظیم شده برای یک دستگاه
تقویمی که دو دوره انجماد را در یک سال با بافرهای 60 روزه نشان می دهد.

شما دوره های توقف را در یک خط مشی به روز رسانی تنظیم می کنید. شما نمی توانید دوره های توقف را بدون تنظیم خط مشی تنظیم کنید. وقتی دستگاه خارج از دوره‌های توقفی است که تنظیم کرده‌اید، رفتار خط‌مشی عادی (خودکار، پنجره‌دار یا به تعویق افتاده) اعمال می‌شود.

نحوه تنظیم دوره انجماد

می‌توانید دوره‌های توقف را در Android 9 (سطح API 28) یا بالاتر تنظیم کنید. مالک دستگاه قبل از تنظیم خط‌مشی برای دستگاه، یک دوره توقف را برای خط‌مشی به‌روزرسانی سیستم تعیین می‌کند. مراحل عبارتند از:

  1. یک خط مشی به روز رسانی سیستم جدید (یا دریافت کنید) ایجاد کنید.
  2. با فراخوانی setFreezePeriods() دوره‌های انجماد را روی خط‌مشی تنظیم کنید.
  3. با فراخوانی setSystemUpdatePolicy() ، خط مشی و دوره های ثابت را برای دستگاه تنظیم کنید.

از آنجا که دوره انجماد سالانه تکرار می شود، تاریخ شروع و پایان دوره با مقادیر ماه و روز نمایش داده می شود. روز شروع باید حداقل 60 روز پس از پایان هر دوره انجماد قبلی شروع شود. مثال زیر نشان می دهد که چگونه می توانید دو دوره توقف را برای یک خط مشی به روز رسانی سیستم موجود تنظیم کنید:

کاتلین

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

جاوا

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

هم روز شروع و هم روز پایان شامل می شود. اگر روز شروع بزرگتر از روز پایان باشد (مانند winterSale در مثال قبلی)، دوره انجماد تا سال بعد ادامه می یابد.

هنگام تنظیم دوره‌های توقف در خط‌مشی به‌روزرسانی سیستم، Android این موارد را آزمایش می‌کند:

  • هیچ دوره انجمادی بیش از 90 روز نیست.
  • فاصله بین دوره های انجماد حداقل 60 روز است.
  • دوره های انجماد با هم همپوشانی ندارند.
  • هیچ دوره انجماد تکراری وجود ندارد.

هنگام تنظیم خط‌مشی به‌روزرسانی سیستم برای دستگاه، Android این آزمایش‌ها را تکرار می‌کند و دوره‌های ثابت فعلی یا گذشته دستگاه را شامل می‌شود.

Android یک SystemUpdatePolicy.ValidationFailedException را زمانی که هر یک از این تست ها با شکست مواجه می شود، پرتاب می کند.

برای دریافت لیستی از دوره‌های انجماد که قبلاً روی یک شی سیاست به‌روزرسانی سیستم تنظیم شده‌اند، همه برنامه‌های نصب شده می‌توانند SystemUpdatePolicy.getFreezePeriods() را فراخوانی کنند. مثال زیر این روش را برای ثبت دوره های انجماد دستگاه فراخوانی می کند:

کاتلین

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

جاوا

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

سالهای کبیسه

اندروید از تقویم ISO 8601 (که تقویم میلادی نیز نامیده می شود) برای محاسبه دوره های انجماد استفاده می کند و سال های کبیسه را نادیده می گیرد. این بدان معنی است که 29 فوریه به عنوان یک تاریخ معتبر شناخته نمی شود و به گونه ای رفتار می شود که گویی 28 فوریه است. بنابراین، 29 فوریه هنگام محاسبه مدت یک دوره انجماد محاسبه نمی شود.

توسعه و آزمایش

در حالی که در حال توسعه و آزمایش ویژگی به‌روزرسانی سیستم DPC خود هستید، ممکن است لازم باشد دوره‌های توقف زیادی ایجاد کنید. از آنجایی که Android فاصله 60 روزه بین دوره‌های انجماد گذشته را بررسی می‌کند، ممکن است نتوانید بدون پاک کردن رکورد دوره‌های گذشته، دوره ثابت جدیدی را تنظیم کنید. برای پاک کردن رکورد دوره انجماد دستگاه، دستور زیر را در پوسته Android Debug Bridge (adb) اجرا کنید:

adb shell dpm clear-freeze-period-record

با بررسی غیرفعال بودن رابط کاربری برای به‌روزرسانی‌های سیستم، می‌توانید تأیید کنید که دستگاهی در دوره توقف قرار دارد.

به‌روزرسانی‌های سیستم Google Play (خط اصلی)

به‌روزرسانی‌های سیستم Google Play (که به‌روزرسانی‌های خط اصلی نیز گفته می‌شود) به‌طور خودکار دانلود می‌شوند، اما برای نصب نیاز به راه‌اندازی مجدد دستگاه دارند. این به‌روزرسانی‌ها راه‌اندازی مجدد خودکار را راه‌اندازی نمی‌کنند و در عوض روی راه‌اندازی مجدد کاربر، سرپرست یا سیاست‌گذاری بعدی نصب می‌شوند. راه‌اندازی مجدد توسط خط‌مشی به‌روزرسانی سیستم، به‌روزرسانی سیستم Google/OEM مرتبط و هر به‌روزرسانی سیستم Google Play را که قبلاً دانلود شده است، نصب می‌کند.

به‌روزرسانی‌های سیستم Google Play را می‌توان با پیمایش به تنظیمات > درباره > نسخه اندروید > به‌روزرسانی سیستم Google Play به صورت دستی نصب کرد.

یک به‌روزرسانی را برگردانید

در برخی موارد، ابزار Google Play System Update Rollbacks (GPSUR) می تواند برای بازیابی وضعیت دستگاه به دلیل نصب مشکل ساز به روز رسانی سیستم Google Play استفاده شود. این ابزار باید توسط کاربران پیشرفته یا در صورت دستور کارکنان پشتیبانی استفاده شود زیرا ممکن است منجر به از دست رفتن اطلاعات شود. در اینجا نحوه استفاده از ابزار GPSUR آورده شده است:

  1. اگر Android Debug Bridge (adb) را روی دستگاهتان اجرا می‌کنید، قبل از ادامه، سرویس adb را متوقف کنید تا در روند بازگشت اختلال ایجاد نکند. برای توقف adb، adb kill-server را اجرا کنید.
  2. ابزار GPSUR را باز کنید .
  3. روی Allow ADB access کلیک کنید تا ابزار از طریق adb با دستگاه آزمایشی شما ارتباط برقرار کند.
  4. روی افزودن دستگاه جدید کلیک کنید.
  5. دستگاه خود را از لیست انتخاب کنید و روی اتصال کلیک کنید. این لیست ممکن است حاوی نام کامل دستگاه نباشد.
  6. در صفحه دستگاه، گزینه Always allow from this computer را انتخاب کنید و روی OK کلیک کنید تا اتصال اشکال زدایی USB را بپذیرید.
  7. دستگاه متصل را در مرورگر خود انتخاب کنید.
  8. متن دکمه در صفحه باید از حالت No Rollbacks Available به Rollback Recent Updates در صورت وجود موارد بازگشتی در دستگاه شما تغییر کند. روی Rollback Recent Updates کلیک کنید.
  9. هشدارها را در Confirm Rollback Modal بخوانید و روی Confirm کلیک کنید.
  10. صبر کنید تا بازگشت کامل شود. پس از تکمیل، یک مودال بازگشت موفقیت آمیز ظاهر می شود و دستگاه راه اندازی مجدد می شود. اکنون می توانید دستگاه خود را از برق جدا کنید.

منابع اضافی

برای کسب اطلاعات بیشتر درباره به‌روزرسانی‌های سیستم، اسناد به‌روزرسانی OTA پروژه منبع باز Android را بخوانید.