يعمل الإصدار 7.0 من نظام التشغيل Android في وضع التشغيل المباشر الآمن عندما يكون الجهاز قيد التشغيل ولكن لم يفتح المستخدم قفل الجهاز. ولإتاحة ذلك، يوفّر النظام مكانَين لتخزين البيانات:
- مساحة التخزين المشفرة لبيانات الاعتماد، وهي موقع التخزين التلقائي ولا تتوفّر إلا بعد أن يفتح المستخدم قفل الجهاز.
- مساحة التخزين المشفرة على الجهاز، وهي مساحة تخزين متاحة أثناء وضع "التشغيل المباشر" وبعد أن يفتح المستخدم قفل الجهاز.
لا يتم تشغيل التطبيقات تلقائيًا أثناء وضع "التشغيل المباشر". إذا كان تطبيقك بحاجة إلى اتخاذ إجراء أثناء وضع "التشغيل المباشر"، يمكنك تسجيل مكونات التطبيق ليتم تشغيلها أثناء هذا الوضع. تشمل بعض حالات الاستخدام الشائعة للتطبيقات التي تحتاج إلى التشغيل أثناء وضع "التشغيل المباشر" ما يلي:
- التطبيقات التي جدولت إشعارات، مثل تطبيقات المنبّه
- التطبيقات التي تقدّم إشعارات مهمة للمستخدمين، مثل تطبيقات الرسائل القصيرة
- التطبيقات التي توفّر خدمات تسهيل الاستخدام، مثل Talkback
إذا كان تطبيقك بحاجة إلى الوصول إلى البيانات أثناء التشغيل في وضع "التمهيد المباشر"، استخدِم مساحة التخزين المشفرة على الجهاز. تحتوي مساحة التخزين المشفّرة على الجهاز على بيانات مشفّرة باستخدام مفتاح لا يتوفّر إلا بعد أن يجري الجهاز عملية التحقّق من صحة عملية التشغيل بنجاح.
بالنسبة إلى البيانات التي يجب تشفيرها باستخدام مفتاح مرتبط ببيانات اعتماد المستخدم، مثل رقم التعريف الشخصي أو كلمة المرور، استخدِم وحدة التخزين المشفّرة ببيانات الاعتماد. تتوفّر مساحة التخزين المشفرة لبيانات الاعتماد بعد أن يفتح المستخدم قفل الجهاز بنجاح وحتى يعيد تشغيله. إذا فعّل المستخدم شاشة القفل بعد فتح قفل الجهاز، سيظل التخزين المشفّر لبيانات الاعتماد متاحًا.
طلب إذن بالتشغيل أثناء وضع "التشغيل المباشر"
يجب أن تسجّل التطبيقات مكوّناتها في النظام قبل أن تتمكّن من التشغيل في وضع "التشغيل المباشر" أو الوصول إلى مساحة التخزين المشفرة على الجهاز. تسجّل التطبيقات نفسها في النظام من خلال وضع علامة متوافق مع التشفير على المكوّنات. لوضع علامة على المكوّن بأنّه متوافق مع التشفير، اضبط السمة android:directBootAware
على القيمة true في ملف البيان.
يمكن للمكوّنات التي تتوافق مع التشفير التسجيل لتلقّي رسالة بث ACTION_LOCKED_BOOT_COMPLETED
من النظام عند إعادة تشغيل الجهاز. في هذه المرحلة، يصبح التخزين المشفّر على الجهاز متاحًا، ويمكن للمكوّن تنفيذ المهام التي يجب تشغيلها أثناء وضع "التشغيل المباشر"، مثل تشغيل منبّه مُجدوَل.
مقتطف الرمز التالي هو مثال على كيفية تسجيل BroadcastReceiver
على أنّه متوافق مع التشفير، وإضافة فلتر أهداف لـ ACTION_LOCKED_BOOT_COMPLETED
في بيان التطبيق:
<receiver android:directBootAware="true" > ... <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver>
بعد أن يفتح المستخدم قفل الجهاز، يمكن لجميع المكوّنات الوصول إلى كل من مساحة التخزين المشفرة على الجهاز ومساحة التخزين المشفرة لبيانات الاعتماد.
الوصول إلى مساحة التخزين المشفرة على الجهاز
للوصول إلى مساحة التخزين المشفّرة على الجهاز، أنشئ مثيلاً ثانيًا من خلال استدعاء Context.createDeviceProtectedStorageContext()
.Context
تتيح جميع طلبات البيانات من واجهة برمجة التطبيقات الخاصة بمساحة التخزين التي يتم إجراؤها باستخدام سياق الوصول هذا الوصول إلى مساحة التخزين المشفّرة على الجهاز. يصل المثال التالي إلى مساحة التخزين المشفَّرة على الجهاز ويفتح ملف بيانات تطبيق حالي:
Kotlin
val directBootContext: Context = appContext.createDeviceProtectedStorageContext() // Access appDataFilename that lives in device encrypted storage val inStream: InputStream = directBootContext.openFileInput(appDataFilename) // Use inStream to read content...
Java
Context directBootContext = appContext.createDeviceProtectedStorageContext(); // Access appDataFilename that lives in device encrypted storage FileInputStream inStream = directBootContext.openFileInput(appDataFilename); // Use inStream to read content...
استخدِم مساحة التخزين المشفرة على الجهاز فقط للمعلومات التي يجب أن تكون متاحة أثناء "وضع التشغيل المباشر". لا تستخدِم وحدة التخزين المشفرة على الجهاز كمخزن مشفّر للأغراض العامة. بالنسبة إلى معلومات المستخدم الخاصة أو البيانات المشفّرة التي لا تكون مطلوبة أثناء وضع "التشغيل المباشر"، استخدِم مساحة التخزين المشفّرة باستخدام بيانات الاعتماد.
تلقّي إشعارات بشأن فتح المستخدم للقفل
عندما يفتح المستخدم قفل الجهاز بعد إعادة تشغيله، يمكن لتطبيقك التبديل إلى الوصول إلى مساحة التخزين المشفرة ببيانات الاعتماد واستخدام خدمات النظام العادية التي تعتمد على بيانات اعتماد المستخدم.
لتلقّي إشعار عندما يفتح المستخدم قفل الجهاز بعد إعادة التشغيل،
عليك تسجيل BroadcastReceiver
من أحد المكوّنات النشطة
للاستماع إلى رسائل الإشعارات بفتح القفل. عندما يفتح المستخدم قفل الجهاز
بعد إعادة التشغيل:
- إذا كان تطبيقك يتضمّن عمليات في المقدّمة تحتاج إلى إشعار فوري، استمع إلى الرسالة
ACTION_USER_UNLOCKED
. - إذا كان تطبيقك يستخدم فقط عمليات في الخلفية يمكنها الاستجابة لإشعار مؤجّل، استمع إلى الرسالة
ACTION_BOOT_COMPLETED
.
إذا فتح المستخدم قفل الجهاز، يمكنك معرفة ذلك من خلال الاتصال بالرقم UserManager.isUserUnlocked()
.
نقل البيانات الحالية
إذا حدّث المستخدم جهازه لاستخدام وضع "التشغيل المباشر"، قد يكون لديك بيانات حالية يجب نقلها إلى مساحة التخزين المشفّرة على الجهاز. استخدِم Context.moveSharedPreferencesFrom()
وContext.moveDatabaseFrom()
، مع سياق الوجهة كطريقة استدعاء وسياق المصدر كمعلَمة، لنقل بيانات الإعدادات المفضّلة وقاعدة البيانات بين وحدة التخزين المشفّرة باستخدام بيانات الاعتماد ووحدة التخزين المشفّرة على الجهاز.
لا تنقل معلومات المستخدمين الخاصة، مثل كلمات المرور أو رموز المصادقة المميزة، من مساحة التخزين المشفرة الخاصة ببيانات الاعتماد إلى مساحة التخزين المشفرة الخاصة بالجهاز. استخدِم تقديرك الخاص عند تحديد البيانات الأخرى التي تريد نقلها إلى مساحة التخزين المشفّرة على الجهاز. في بعض السيناريوهات، قد تحتاج إلى إدارة مجموعات منفصلة من البيانات في المخزنَين المشفّرَين.
اختبار تطبيقك المتوافق مع التشفير
اختبِر تطبيقك المتوافق مع التشفير مع تفعيل وضع "التشغيل المباشر".
تفعّل معظم الأجهزة التي تعمل بإصدارات حديثة من Android وضع "التشغيل المباشر" عند ضبط بيانات اعتماد لشاشة القفل (رقم تعريف شخصي أو نقش أو كلمة مرور). وينطبق ذلك تحديدًا على جميع الأجهزة التي تستخدم التشفير المستند إلى الملفات. للتحقّق مما إذا كان الجهاز يستخدم التشفير المستند إلى الملفات، شغِّل أمر shell التالي:
adb shell getprop ro.crypto.type
إذا كانت النتيجة file
، يعني ذلك أنّ التشفير على مستوى الملفات مفعَّل على الجهاز.
على الأجهزة التي لا تستخدم التشفير على مستوى الملفات تلقائيًا، قد تتوفّر خيارات أخرى لاختبار وضع "التشغيل المباشر":
-
يمكن تحويل بعض الأجهزة التي تستخدم التشفير الكامل للقرص (
ro.crypto.type=block
) وتعمل بالإصدارات من Android 7.0 إلى Android 12 إلى التشفير المستند إلى الملفات. وهناك طريقتان لذلك:- على الجهاز، فعِّل خيارات المطوّرين إذا لم يسبق لك ذلك من خلال الانتقال إلى الإعدادات > لمحة عن الهاتف والنقر على رقم الإصدار سبع مرات. بعد ذلك، انتقِل إلى الإعدادات > خيارات المطوّرين وانقر على التحويل إلى تشفير الملفات.
- بدلاً من ذلك، شغِّل أوامر shell التالية:
adb reboot-bootloader
fastboot --wipe-and-use-fbe
تحذير: يؤدي استخدام أي من طريقتَي التحويل إلى ترميز على مستوى الملف إلى محو جميع بيانات المستخدم على الجهاز.
-
تتيح الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android أو إصدار أقدم وضع "الميزة المباشرة" "المحاكي" الذي يستخدم أذونات الملفات لمحاكاة تأثيرات قفل الملفات المشفّرة وفتحها. لا تستخدِم الوضع المحاكى إلا أثناء التطوير، لأنّه قد يؤدي إلى فقدان البيانات. لتفعيل وضع "التشغيل المباشر" في المحاكي، اضبط نقش قفل على الجهاز، واختَر "لا شكرًا" إذا طُلب منك إعداد شاشة بدء تشغيل آمنة عند ضبط نقش قفل، ثم نفِّذ أمر shell التالي:
adb shell sm set-emulate-fbe true
لإيقاف وضع "التشغيل المباشر" في المحاكي، نفِّذ أمر shell التالي:
adb shell sm set-emulate-fbe false
يؤدي تنفيذ أيّ من هذين الأمرَين إلى إعادة تشغيل الجهاز.
التحقّق من حالة التشفير في سياسة الجهاز
يمكن لتطبيقات إدارة الأجهزة استخدام
DevicePolicyManager.getStorageEncryptionStatus()
للتحقّق من حالة التشفير الحالية للجهاز.
إذا كان تطبيقك يستهدف مستوى واجهة برمجة تطبيقات أقل من Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات)، سيعرض
getStorageEncryptionStatus()
القيمة
ENCRYPTION_STATUS_ACTIVE
إذا كان الجهاز يستخدم التشفير الكامل للقرص
أو التشفير المستند إلى الملفات مع ميزة "التشغيل المباشر". في كلتا الحالتين، يتم دائمًا تخزين البيانات مشفّرة في حال عدم النشاط.
إذا كان تطبيقك يستهدف الإصدار Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، ستعرض الدالة
getStorageEncryptionStatus()
القيمة
ENCRYPTION_STATUS_ACTIVE
إذا كان الجهاز يستخدم التشفير الكامل للقرص. تعرِض هذه الإشارة
ENCRYPTION_STATUS_ACTIVE_PER_USER
إذا كان الجهاز يستخدم التشفير المستند إلى الملفات
مع ميزة "التشغيل المباشر".
إذا كنت بصدد إنشاء تطبيق لإدارة الأجهزة يستهدف الإصدار 7.0 من نظام التشغيل Android، احرص على التحقّق من كل من ENCRYPTION_STATUS_ACTIVE
وENCRYPTION_STATUS_ACTIVE_PER_USER
لتحديد ما إذا كان الجهاز مشفّرًا.
عيّنات تعليمات برمجية إضافية
يوضّح نموذج DirectBoot أيضًا كيفية استخدام واجهات برمجة التطبيقات الموضّحة في هذه الصفحة.