يوضّح دليل المطوِّر هذا كيفية تنفيذ وحدة التحكّم بسياسة الجهاز (DPC) إدارة تحديثات نظام Android نيابةً عن مستخدم الجهاز.
مقدّمة
يمكن لأجهزة Android تلقّي تحديثات النظام وبرامج التطبيقات عبر شبكة غير سلكية (OTA) وتثبيتها. يُرسِل Android إشعارًا إلى مستخدم الجهاز بأنّه يتم تحديث النظام. ويمكن لمستخدم الجهاز تثبيت التحديث على الفور أو لاحقًا.
باستخدام وحدة التحكّم في سياسة الجهاز (DPC)، يمكن لمشرف تكنولوجيا المعلومات إدارة تحديثات النظام لمستخدم الجهاز. يمكن أن يمتلك مستخدمو حسابات العملاء المتعددين جهازًا مُدارًا بالكامل (يُشار إليه باسم "مالك الجهاز") أو يمكن أن يمتلكوا ملفًا شخصيًا للعمل (يُشار إليه باسم "مالك الملف الشخصي"). يوضح الجدول 1 كيفية إدارة مالكي الأجهزة للنظام التحديثات، بينما يمكن لمالكي الملفات الشخصية الإبلاغ عن المعلومات المتعلقة بتحديثات النظام فقط.
الجدول 1: تعتمد المهام المتاحة لوحدات التحكّم بسياسة الجهاز على وضع المالك.
التحقّق من توفّر تحديثات في انتظار المراجعة
التحديث في انتظار المراجعة هو تحديث نظام لجهاز لم يتم تثبيته بعد. يمكن أن يساعد مدير عمليات تكنولوجيا المعلومات (DPC) مشرفي تكنولوجيا المعلومات في التحقّق من الأجهزة التي تتضمّن تحديثات نظام معلّقة، وربما يطلب من مستخدمي الأجهزة تثبيت التحديثات المهمة على الفور.
مالكو الأجهزة ومالكي الملفات الشخصية التي تعمل بنظام التشغيل Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث
التحقّق مما إذا كان الجهاز يحتوي على تحديث نظام في انتظار المراجعة. اتصل بالرقم
DevicePolicyManager.getPendingSystemUpdate()
الذي يعرض الرمز null
إذا كان الجهاز محدَّثًا. في حال كان هناك تحديث للنظام في انتظار التثبيت
فإن الطريقة تُرجع معلومات حول التحديث.
مزيد من المعلومات عن التحديث في انتظار المراجعة
بعد طلب getPendingSystemUpdate()
، يمكنك فحص الأجهزة التي تم إرجاعها
يمكنك الاطّلاع على القيمة SystemUpdateInfo
لمعرفة المزيد من المعلومات عن التعديل الذي في انتظار المراجعة. يوضِّح المثال التالي كيفية معرفة متى كان تحديث معلّق متاحًا للجهاز لأول مرة:
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)); }
عمليات استدعاء النظام
عند توفُّر تحديث، يُرسِل نظام Android إشعارات إلى مالكي الجهاز بشأن التحديث الجديد. في الإصدار 8.0 من نظام التشغيل Android أو الإصدارات الأحدث، يرسل النظام إشعارًا إلى مالكي الملفات الشخصية أيضًا.
في الفئة الفرعية DeviceAdminReceiver
، يمكنك إلغاء الإجراء المُعاد الاتصال به
onSystemUpdatePending()
. لست بحاجة إلى تسجيل DPC أو الإعلان عنه لتلقّي المكالمة. قد يتعرض النظام
استدعاء هذه الطريقة أكثر من مرة لتحديث واحد، لذا تحقق من حالة التحديث
قبل الاستجابة. يمكنك الاتصال بالرقم getPendingSystemUpdate()
للاطّلاع على مزيد من المعلومات عن
تحديث النظام في عملية معاودة الاتصال. يوضّح المثال التالي كيفية إجراء ذلك:
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. // ... } }
عندما يتضمّن النظام أكثر من وحدة تحكّم بسياسة الجهاز (DPC) واحدة، مثل الملفات الشخصية للعمل في حسابات مُدارة بالكامل جهاز واحد، سيتم معاودة الاتصال بكل من مالك الجهاز ومالك الملف الشخصي.
تعديل السياسات
يمكن لمالك الجهاز التحكّم في وقت تثبيت التحديثات من خلال ضبط نظام محلي. تحديث سياسة أحد الأجهزة. هناك ثلاثة أنواع من سياسة تحديثات النظام:
- تلقائي
- يتم تثبيت تحديثات النظام فور توفُّرها متاحة (بدون تفاعل المستخدم). يؤدي ضبط نوع السياسة هذا إلى تثبيت أي تحديثات في انتظار المراجعة على الفور. التي يمكن تأجيلها أو انتظار نافذة صيانة.
- نافذة
- يتم تثبيت تحديثات النظام أثناء عملية الصيانة اليومية. (بدون تفاعل المستخدم). اضبط وقتَي بدء نافذة الصيانة اليومية وانتهائها، بدقيقتَي اليوم، عند إنشاء سياسة جديدة مستندة إلى نافذة زمنية.
- مؤجَّل
- تؤجل هذه السياسة تثبيت تحديثات النظام لمدة 30 يومًا. بعد 30 يومًا عند انتهاء فترة زمنية معينة، سيطلب النظام من مستخدم الجهاز تثبيت التحديث.
فترات التأجيل
يسمح النظام بتأجيل كل تحديث مرة واحدة لمدة 30 يومًا. تبدأ الفترة عندما يؤجل النظام التحديث لأول مرة، ولن يؤدي ضبط سياسات تأجيل جديدة إلى إطالة هذه الفترة.
بالإضافة إلى فترة التأجيل، قد لا يتمكن نظام Android من تثبيت تحديث لأسباب مثل عدم وجود اتصال، أو عدم وجود مساحة كافية على القرص، أو انخفاض طاقة البطارية.
يعيد النظام ضبط موقّت التأجيل الذي يبلغ 30 يومًا في حال حدوث تحديث مختلف. متاحة خلال تلك الفترة، ما يمنح مشرفي تكنولوجيا المعلومات فرصة لتجربة النظام المدمج التحديثات. وبعد مرور 30 يومًا بدون إجراء تحديث جديد، يطالب النظام تثبيت جميع التحديثات المعلّقة. وعندما يتوفر تحديث نظام جديد في وقت لاحق، تبدأ فترة 30 يومًا من جديد.
كيفية ضبط سياسة
يمكنك ضبط سياسات التحديث في الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث. لتحديد
الوقت الذي يجب أن يُثبِّت فيه الجهاز تحديثات النظام، أنشئ مثيلًا من
SystemUpdatePolicy
باستخدام أحد الأنواع الثلاثة الموضّحة
أعلاه. لضبط سياسة، يُطلِق مالك الجهاز طريقة DevicePolicyManager
setSystemUpdatePolicy()
. يوضّح رمز النموذج التالي كيفية إجراء ذلك. للاطّلاع على مثال على سياسة ذات إطار زمني، اطّلِع على مستندات SystemUpdatePolicy
.
Kotlin
// Create the system update policy to postpone installation for 30 days. val policy = SystemUpdatePolicy.createPostponeInstallPolicy() // Get a DevicePolicyManager instance to set the policy on the device. val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val adminName = getComponentName(context) // Set the policy. dpm.setSystemUpdatePolicy(adminName, policy)
Java
// Create the system update policy to postpone installation for 30 days. SystemUpdatePolicy policy = SystemUpdatePolicy.createPostponeInstallPolicy(); // Get a DevicePolicyManager instance to set the policy on the device. DevicePolicyManager dpm = (DevicePolicyManager) context .getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminName = getComponentName(context); // Set the policy. dpm.setSystemUpdatePolicy(adminName, policy);
لا يمكن تغيير مثيلات السياسة بعد إنشائها. لتغيير وقت تشغيل الجهاز
عمليات تثبيت التحديثات، يمكنك إنشاء سياسة جديدة وضبطها. لإزالة سياسة من
جهاز، طلب setSystemUpdatePolicy()
مع تمرير null
كوسيطة policy
.
بعد أن تزيل وحدة التحكّم بسياسة الجهاز إحدى السياسات، سيظهر لمستخدم الجهاز إشعارات لأي من هذه السياسات.
تحديثات النظام المتوفرة.
يمكن للتطبيقات الاتصال بـ getSystemUpdatePolicy()
للحصول على
السياسة الحالية للجهاز. وإذا أرجعت هذه الطريقة القيمة null
، يعني ذلك أنّ
لم يتم ضبط السياسة حاليًا.
فترات تجميد البيانات
تجميد إصدار نظام التشغيل خلال الفترات المهمة، مثل العطلات أو الأنشطة الأخرى المزدحمة يمكن لمالكي الأجهزة تعليق تحديثات النظام لمدة تصل إلى 90 يومًا. عندما يكون الجهاز في فترة تجميد، يتصرف على النحو التالي:
- لا يتلقّى الجهاز أي إشعارات بشأن تحديثات النظام المعلّقة.
- لم يتم تثبيت تحديثات النظام لنظام التشغيل.
- لا يمكن لمستخدمي الأجهزة البحث يدويًا عن تحديثات النظام من خلال "الإعدادات".
يفرض النظام فترة احتياطي إلزامي تبلغ 60 يومًا بعد أي تجميد بيانات محدَّد. فترات منع تجميد الجهاز إلى أجل غير مسمى. تذكر أن نظام التجميد يمكن أن تمنع التحديثات الأجهزة من تلقّي تحديثات مهمة.
يتم ضبط فترات إيقاف التحديثات على سياسة التحديث. لا يمكنك ضبط فترات تجميد بدون ضبط سياسة. عندما يكون الجهاز خارج أي فترات تجميد بيانات تحددها، ينطبق السلوك العادي للسياسة (تلقائي أو تم إدراجه في النافذة أو تم تأجيله).
كيفية ضبط فترة تجميد
يمكنك ضبط فترات التجميد في الإصدار 9 من نظام التشغيل Android (المستوى 28 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث. يضبط مالك الجهاز فترة تجميد على سياسة تحديث النظام قبل ضبط السياسة للجهاز. الخطوات هي:
- أنشئ سياسة جديدة (أو احصل على السياسة الحالية) لتحديثات النظام.
- يمكنك ضبط فترات تجميد الحساب في السياسة من خلال الاتصال بالرقم
setFreezePeriods()
. - يمكنك ضبط السياسة وفترات تجميد الجهاز من خلال الاتصال بالرقم
setSystemUpdatePolicy()
.
بما أنّ فترة إيقاف مشاركة البيانات تتكرّر سنويًا، فإنّ تاريخَي البدء والانتهاء يتم تمثيل الفترة بقيم الشهر واليوم. يجب أن يبدأ يوم البدء في بعد 60 يومًا على الأقل من نهاية أي فترة تعليق سابقة. يوضّح المثال التالي كيفية ضبط فترتين تجميد لسياسة حالية لتحديثات النظام:
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 ... }
يشمل كل من يوم البدء ويوم الانتهاء. إذا كان يوم البدء أكبر
مقارنةً بيوم الانتهاء (مثل winterSale
في المثال السابق)، يعني ذلك أنّ تجميد البيانات
فترة تمتد إلى العام التالي.
عند ضبط فترات التوقف عن التحديث في سياسة تحديثات النظام، يختبر Android المتطلبات التالية:
- لا يمكن أن تزيد فترة إيقاف التحديثات عن 90 يومًا.
- لا تقل الفاصل الزمني بين فترات إيقاف التحديثات عن 60 يومًا.
- لا تتداخل فترات التجميد.
- لا تتوفّر فترات تجميد مكرّرة.
عند ضبط سياسة تحديث النظام لأحد الأجهزة، يكرِّر Android هذه الاختبارات. ويشمل ذلك أي فترات تجميد بيانات حالية أو سابقة للجهاز.
يطرح Android الرمز SystemUpdatePolicy.ValidationFailedException
عند
فشل أي من هذه الاختبارات.
للحصول على قائمة بفترات التجميد التي تم ضبطها سابقًا على عنصر سياسة تحديث النظام، يمكن لجميع التطبيقات المثبّتة استدعاء SystemUpdatePolicy.getFreezePeriods()
. يستدعي المثال التالي
هذه الطريقة لتسجيل فترات تجميد الجهاز:
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()); } }
سنوات كبيسة
يستخدم Android تقويم ISO 8601 (المعروف أيضًا بالتقويم الميلادي) لتنفيذ ما يلي: وحساب فترات التجميد ويتجاهل السنوات الكبيسة. وهذا يعني أن يوم 29 فبراير لم يتم الاعتراف به كتاريخ صالح ويتم التعامل معه كما لو كان يوم 28 فبراير. وبالتالي، لا يتم احتساب يوم 29 شباط (فبراير) عند احتساب مدة التجميد. الفترة.
التطوير والاختبار
أثناء تطوير ميزة تحديث النظام في "مركز التحكّم في الطاقة" واختبارها، قد تحتاج إلى إنشاء العديد من فترات التجميد. بما أنّ نظام Android يتحقّق من وجود فاصل زمني مدته 60 يومًا بين فترات تجميد البيانات السابقة، قد لا تتمكّن من ضبط فترة تجميد جديدة بدون محو سجلّ الفترات السابقة أولاً. لمحو تجميد الجهاز سجل فترة محددة، شغِّل الأمر التالي في Android Debug Bridge (adb) Shell:
adb shell dpm clear-freeze-period-record
يمكنك التأكد من أنّ الجهاز في فترة توقُّف عن العمل من خلال التحقّق من أنّ المستخدم تم إيقاف الواجهة لتحديثات النظام.
تحديثات نظام Google Play (Mainline)
يتم تلقائيًا تنزيل تحديثات نظام Google Play (المعروفة أيضًا باسم تحديثات Mainline)، ولكن يجب إعادة تشغيل الجهاز لتثبيتها. هذه فلن تؤدي التحديثات إلى إعادة تشغيل الجهاز تلقائيًا وبدلاً من ذلك، يتم تثبيتها على إعادة التشغيل التي بدأها المستخدم أو المشرف أو السياسة التالية. ستؤدي عمليات إعادة التشغيل من خلال سياسة تحديث النظام إلى تثبيت تحديث نظام Google/المصنّع الأصلي للجهاز المرتبط وأي تحديثات لنظام 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.
- اختَر الجهاز المتصل في المتصفّح.
- يجب أن يتم تبديل نص الزر في الصفحة من لا تتوفّر إمكانية العودة إلى الحالة السابقة إلى استعادة التحديثات الأخيرة في حال توفُّر إمكانية العودة إلى الإصدارات السابقة على جهازك انقر على استرجاع التحديثات الأخيرة.
- اقرأ التحذيرات في نافذة تأكيد العودة إلى الحالة السابقة وانقر على تأكيد.
- يُرجى الانتظار إلى أن تكتمل عملية العودة إلى الحالة السابقة. بعد اكتمال العودة إلى الحالة السابقة بنجاح سيظهر الشكل وستتم إعادة تشغيل الجهاز. يمكنك الآن فصل قابس كهربائي الجهاز بأمان.
مصادر إضافية
لمزيد من المعلومات عن تحديثات النظام، يُرجى الاطّلاع على مستندات تحديثات عبر شبكة غير سلكية (OTA) في مشروع Android Open Source Project.