این راهنمای توسعهدهنده توضیح میدهد که چگونه کنترلکننده خطمشی دستگاه (DPC) شما میتواند بهروزرسانیهای سیستم Android را ازطرف کاربر دستگاه مدیریت کند.
مقدمه
دستگاههای Android میتوانند بهروزرسانیهای بیسیم (OTA) را برای نرمافزار سیستم و برنامه دریافت و نصب کنند. Android به کاربر دستگاه اطلاع میدهد که بهروزرسانی سیستم دردسترس است و کاربر دستگاه میتواند بهروزرسانی را فوراً یا بعداً نصب کند.
بااستفاده از DPC، سرپرست فناوری اطلاعات میتواند بهروزرسانیهای سیستم را برای کاربر دستگاه مدیریت کند. DPC میتواند مالک دستگاه کاملاً مدیریتشده باشد (مالک دستگاه نامیده میشود) یا میتواند مالک نمایه کاری باشد (مالک نمایه نامیده میشود). جدول ۱ نشان میدهد که مالکان دستگاه چگونه میتوانند بهروزرسانیهای سیستم را مدیریت کنند، درحالیکه مالکان نمایه فقط میتوانند اطلاعات مربوط به بهروزرسانیهای سیستم را گزارش کنند.
جدول ۱: تکالیف دردسترس برای DPC به حالت مالک بستگی دارد
بررسی بهروزرسانیهای معلق
بهروزرسانی معلقه بهروزرسانی سیستمی برای دستگاهی است که هنوز نصب نشده است. 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 به مالکان دستگاه درباره بهروزرسانی جدید اطلاع میدهد. در Android نسخه ۸.۰ یا بالاتر، سیستم به مالکان نمایه نیز اطلاع میدهد.
در زیرکلاس DeviceAdminReceiver،
فراخوانی برگشتی onSystemUpdatePending() را لغو کنید. برای دریافت تماس برگشتی، لازم نیست
DPC خود را ثبت کنید یا برای آن تبلیغ کنید. ممکن است سیستم
این روش را بیشاز یک بار برای یک بهروزرسانی فراخوانی کند، بنابراین قبلاز پاسخ دادن، وضعیت بهروزرسانی را بررسی کنید. با getPendingSystemUpdate() تماس بگیرید تا درباره بهروزرسانی سیستم در تماس برگشتی بیشتر بدانید. مثال زیر نشان میدهد که چگونه میتوانید این کار را انجام دهید:
کاتلین
/** * 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 دارد، برای مثال نمایههای کاری در دستگاههای کاملاً مدیریتشده، هم مالک دستگاه و هم مالک نمایه فراخوان برگشتی را دریافت میکنند.
بهروزرسانی خطمشیها
مالک دستگاه میتواند با تنظیم خطمشی بهروزرسانی سیستم محلی برای دستگاه، زمان نصب بهروزرسانیها را کنترل کند. خطمشی بهروزرسانی سیستم میتواند یکی از این سه نوع باشد:
- خودکار
- بهروزرسانیهای سیستم را بهمحض دردسترس قرار گرفتن (بدون تعامل کاربر) نصب میکند. تنظیم این نوع خطمشی فوراً هرگونه بهروزرسانی معلق را که ممکن است بهتعویق افتاده باشد یا منتظر پنجره تعمیرونگهداری باشد نصب میکند.
- پنجرهای
- بهروزرسانیهای سیستم را درطول پنجره نگهداری روزانه (بدون تعامل کاربر) نصب میکند. هنگام ایجاد خطمشی پنجرهای جدید، شروع و پایان پنجره نگهداری روزانه را براساس دقیقه در روز تنظیم کنید.
- بهتعویق افتاد
- نصب بهروزرسانیهای سیستم را بهمدت ۳۰ روز بهتعویق میاندازد. پساز پایان دوره ۳۰ روزه، سیستم از کاربر دستگاه میخواهد بهروزرسانی را نصب کند.
دورههای تعویق
سیستم هر بهروزرسانی را به یک تعویق ۳۰ روزه محدود میکند. این دوره زمانی شروع میشود که سیستم برای اولینبار بهروزرسانی را بهتعویق میاندازد و تنظیم خطمشیهای جدید برای بهتعویق انداختن، دوره را تمدید نخواهد کرد.
علاوهبر بهتعویق افتادن، Android ممکن است بهدلایل دیگری مثل عدم اتصال، فضای دیسک ناکافی، یا شارژ کم باتری نتواند بهروزرسانی را نصب کند.
اگر بهروزرسانی دیگری درطول این دوره دردسترس قرار گیرد، سیستم زمانسنج تعویق ۳۰ روزه را بازنشانی میکند—این کار به سرپرستان فناوری اطلاعات فرصت میدهد بهروزرسانیهای ترکیبی سیستم را امتحان کنند. وقتی ۳۰ روز بدون بهروزرسانی جدید گذشت، سیستم از کاربر میخواهد همه بهروزرسانیهای معلقه را نصب کند. بعداً، وقتی بهروزرسانی سیستم جدیدی دردسترس قرار میگیرد، دوره ۳۰ روزه دوباره شروع میشود.
نحوه تنظیم خطمشی
میتوانید خطمشیهای بهروزرسانی را در Android نسخه ۸.۰ (سطح میانای برنامهسازی کاربردی ۲۶) یا بالاتر تنظیم کنید. برای مشخص کردن
زمان نصب بهروزرسانیهای سیستم توسط دستگاه، نمونهای از
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() را فراخوانی کنید و null را بهعنوان آرگومان policy ارسال کنید.
پساز اینکه «کنترلکننده خطمشی دستگاه» خطمشیای را برمیدارد، کاربر دستگاه اعلانهایی برای هرگونه
بهروزرسانی سیستم دردسترس میبیند.
برنامهها میتوانند getSystemUpdatePolicy() را فراخوانی کنند تا
خطمشی فعلی دستگاه را دریافت کنند. اگر این روش null را برگرداند، یعنی درحالحاضر خطمشیای تنظیم نشده است.
دورههای ثابت کردن
برای ثابت نگه داشتن نسخه سیستمعامل در دورههای بحرانی، مثل تعطیلات یا دیگر زمانهای شلوغ، مالکان دستگاه میتوانند بهروزرسانیهای سیستم را تا ۹۰ روز تعلیق کنند. وقتی دستگاهی در دوره توقف باشد، بهصورت زیر عمل میکند:
- دستگاه هیچ اعلانی درباره بهروزرسانیهای سیستم درانتظار دریافت نمیکند.
- بهروزرسانیهای سیستم برای سیستمعامل نصب نشده است.
- کاربران دستگاه نمیتوانند بهروزرسانیهای سیستم را بهطور دستی در «تنظیمات» بررسی کنند.
سیستم یک دوره میانگیر اجباری ۶۰ روزه را پساز هر دوره توقف تعریفشده اعمال میکند تا از توقف نامحدود دستگاه جلوگیری کند. بهیاد داشته باشید که متوقف کردن بهروزرسانیهای سیستم میتواند مانع از دریافت بهروزرسانیهای مهم توسط دستگاهها شود.
دورههای توقف را در خطمشی بهروزرسانی تنظیم میکنید. بدون تنظیم خطمشی نمیتوانید دوره توقف تنظیم کنید. وقتی دستگاه خارج از هرگونه دوره توقف بهروزرسانی تنظیمشده توسط شما باشد، رفتار خطمشی عادی (خودکار، پنجرهای، یا بهتعویقافتاده) اعمال میشود.
نحوه تنظیم دوره توقف
میتوانید دورههای توقف را در Android نسخه ۹ (سطح میانای برنامهسازی کاربردی ۲۸) یا بالاتر تنظیم کنید. مالک دستگاه قبلاز تنظیم خطمشی برای دستگاه، دوره توقف را در خطمشی بهروزرسانی سیستم تنظیم میکند. مراحل عبارتاند از:
- خطمشی بهروزرسانی سیستم جدیدی ایجاد کنید (یا خطمشی فعلی را دریافت کنید).
- با فراخوانی
setFreezePeriods()، دورههای توقف را در خطمشی تنظیم کنید. - با فراخوانی
setSystemUpdatePolicy()، خطمشی و دورههای توقف را برای دستگاه تنظیم کنید.
چون دوره توقف هرسال تکرار میشود، تاریخ شروع و پایان دوره با مقادیر ماه و روز نشان داده میشود. روز شروع باید حداقل ۶۰ روز پساز پایان هر دوره توقف قبلی باشد. مثال زیر نشان میدهد که چگونه میتوانید دو دوره توقف برای خطمشی بهروزرسانی سیستم موجود تنظیم کنید:
کاتلین
// 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 این الزامات را آزمایش میکند:
- هیچ دوره توقفی طولانیتر از ۹۰ روز نیست.
- فاصله بین دورههای توقف حداقل ۶۰ روز است.
- دورههای توقف همپوشانی ندارند.
- هیچ دوره توقف تکراری وجود ندارد.
هنگام تنظیم خطمشی بهروزرسانی سیستم برای دستگاه، 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()); } }
سالهای کبیسه
Android از تقویم ISO 8601 (که تقویم میلادی نیز نامیده میشود) برای محاسبه دورههای توقف استفاده میکند و سالهای کبیسه را نادیده میگیرد. این یعنی ۲۹ فوریه بهعنوان تاریخ معتبر شناخته نمیشود و با آن مثل ۲۸ فوریه رفتار میشود. بنابراین، ۲۹ فوریه هنگام محاسبه مدت دوره توقف محاسبه نمیشود.
توسعه و آزمایش
هنگام توسعه و آزمایش ویژگی بهروزرسانی سیستم DPC، ممکن است لازم باشد دورههای توقف زیادی ایجاد کنید. چون Android فاصله ۶۰ روزه بین دورههای توقف قبلی را بررسی میکند، ممکن است نتوانید دوره توقف جدیدی را بدون پاک کردن سابقه دورههای قبلی تنظیم کنید. برای پاک کردن سابقه دوره توقف دستگاه، فرمان زیر را در پوسته پل اشکالزدایی Android (adb) اجرا کنید:
adb shell dpm clear-freeze-period-record
با بررسی اینکه میانای کاربر برای بهروزرسانیهای سیستم غیرفعال است، میتوانید تأیید کنید که دستگاه در دوره توقف است.
بهروزرسانیهای سیستم Google Play (خط اصلی)
بهروزرسانیهای سیستم Google Play (که بهروزرسانیهای Mainline نیز نامیده میشوند) بهطور خودکار بارگیری میشوند اما برای نصب شدن نیاز به بازراهاندازی دستگاه دارند. این بهروزرسانیها باعث راهاندازی مجدد خودکار نمیشوند و درعوض در راهاندازی مجدد بعدی که توسط کاربر، سرپرست، یا خطمشی آغاز میشود نصب میشوند. بازراهاندازیهای راهاندازیشده توسط خطمشی بهروزرسانی سیستم، بهروزرسانی سیستم Google/OEM مربوطه و هرگونه بهروزرسانی سیستم Google Play را که قبلاً بارگیری شده است نصب خواهد کرد.
بهروزرسانیهای سیستم Google Play را میتوانید با رفتن به تنظیمات > درباره > نسخه Android > بهروزرسانی سیستم Google Play بهصورت دستی نیز نصب کنید.
برگرداندن بهروزرسانی
در برخی موارد، میتوان از ابزار «بازگرداندن بهروزرسانی سیستم Google Play» (GPSUR) برای بازیابی وضعیت دستگاه بهدلیل نصب مشکلدار «بهروزرسانی سیستم Google Play» استفاده کرد. این ابزار باید توسط کاربران پیشرفته یا زمانی که کارکنان پشتیبانی راهنمایی میکنند استفاده شود، زیرا ممکن است منجر به ازدست رفتن دادهها شود. نحوه استفاده از ابزار GPSUR:
- اگر Android Debug Bridge (adb) در دستگاهتان درحال اجرا است،
قبلاز ادامه دادن، سرویس adb را متوقف کنید تا با فرایند بازگرداندن تداخل نداشته باشد. برای متوقف کردن adb،
adb kill-serverرا اجرا کنید. - ابزار GPSUR را باز کنید.
- روی اجازه دادن به دسترسی ADB کلیک کنید تا به ابزار اجازه دهید ازطریق adb با دستگاه آزمایشی شما ارتباط برقرار کند.
- روی افزودن دستگاه جدید کلیک کنید.
- دستگاهتان را از فهرست انتخاب کنید و روی اتصال کلیک کنید. ممکن است این فهرست نام کامل دستگاه را نداشته باشد.
- در صفحه دستگاه، همیشه از این رایانه اجازه داده شود را انتخاب کنید و برای پذیرفتن اتصال اشکالزدایی USB، روی تأیید کلیک کنید.
- دستگاه متصلشده را در مرورگرتان انتخاب کنید.
- اگر بازگرداندن به نسخه قبلی در دستگاهتان دردسترس باشد، نوشتار دکمه در صفحه باید از بازگرداندن به نسخه قبلی دردسترس نیست به بازگرداندن بهروزرسانیهای اخیر به نسخه قبلی تغییر کند. روی Rollback Recent Updates (بازگرداندن بهروزرسانیهای اخیر) کلیک کنید.
- هشدارهای موجود در پنجره تأیید بازگشت را بخوانید و روی تأیید کلیک کنید.
- منتظر بمانید تا بازگشت به نسخه قبلی تکمیل شود. پساز تکمیل، پنجره بازگشت موفقیتآمیز بود نمایش داده میشود و دستگاه بازراهاندازی میشود. اکنون میتوانید با خیال راحت کابل دستگاه را جدا کنید.
منابع بیشتر
برای کسب اطلاعات بیشتر درباره بهروزرسانیهای سیستم، سند بهروزرسانیهای OTA «پروژه منبع باز Android» را بخوانید.