دعم وضع التشغيل المباشر

يعمل نظام التشغيل Android 7.0 في وضع التشغيل المباشر الآمن عندما يكون الجهاز قيد التشغيل ولكن لم يفتح المستخدم قفل الجهاز. ولإتاحة ذلك، يوفّر النظام موقعَين لتخزين البيانات:

  • مساحة التخزين المشفَّرة لبيانات الاعتماد، وهي موقع التخزين التلقائي ولا تتوفّر إلا بعد أن يفتح المستخدم قفل الجهاز.
  • مساحة التخزين المشفَّرة على الجهاز، وهي مساحة تخزين متاحة في وضع "التشغيل المباشر" وبعد فتح المستخدم قفل الجهاز.

لا تعمل التطبيقات تلقائيًا أثناء وضع "التشغيل المباشر". إذا كان تطبيقك بحاجة إلى اتخاذ إجراء أثناء وضع "التشغيل المباشر"، يمكنك تسجيل مكوّنات التطبيق ليتم تشغيلها أثناء هذا الوضع. تشمل بعض حالات الاستخدام الشائعة للتطبيقات التي تحتاج إلى العمل أثناء وضع "التشغيل المباشر" ما يلي:

  • التطبيقات التي تتضمّن إشعارات مجدوَلة، مثل تطبيقات المنبّه
  • التطبيقات التي تقدّم إشعارات مهمة للمستخدمين، مثل تطبيقات SMS
  • التطبيقات التي توفّر خدمات تسهيل الاستخدام، مثل Talkback

إذا كان تطبيقك يحتاج إلى الوصول إلى البيانات أثناء تشغيله في وضع "التشغيل المباشر"، استخدِم مساحة التخزين المشفَّرة على الجهاز. تحتوي وحدة التخزين المشفّرة على الجهاز على بيانات مشفّرة بمفتاح لا يتوفّر إلا بعد إجراء عملية تشغيل متحقّق منه بنجاح على الجهاز.

بالنسبة إلى البيانات التي يجب تشفيرها باستخدام مفتاح مرتبط ببيانات اعتماد المستخدم، مثل رقم التعريف الشخصي أو كلمة المرور، استخدِم مساحة التخزين المشفَّرة لبيانات الاعتماد. تتوفّر مساحة التخزين المشفّرة لبيانات الاعتماد بعد أن يفتح المستخدم قفل الجهاز بنجاح وحتى يعيد تشغيل الجهاز. إذا فعّل المستخدم شاشة القفل بعد فتح قفل الجهاز، ستظل مساحة التخزين المشفَّرة باستخدام بيانات الاعتماد متاحة.

طلب إذن بالتشغيل أثناء وضع "التشغيل المباشر"

يجب أن تسجّل التطبيقات مكوّناتها في النظام قبل أن تتمكّن من العمل أثناء وضع "التشغيل المباشر" أو الوصول إلى مساحة التخزين المشفّرة على الجهاز. تسجّل التطبيقات في النظام من خلال وضع علامة على المكوّنات على أنّها متوافقة مع التشفير. لوضع علامة على المكوّن تشير إلى أنّه متوافق مع التشفير، اضبط السمة android:directBootAware على "صحيح" في ملف البيان.

يمكن للمكوّنات التي تراعي التشفير التسجيل لتلقّي رسالة بث 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 من خلال استدعاء Context.createDeviceProtectedStorageContext(). تستخدم جميع طلبات البيانات من واجهة برمجة التطبيقات للتخزين التي يتم إجراؤها باستخدام هذا السياق مساحة التخزين المشفَّرة على الجهاز. يصل المثال التالي إلى مساحة التخزين المشفَّرة على الجهاز ويفتح ملف بيانات تطبيق حالي:

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
      
  • تتيح الأجهزة التي تعمل بنظام التشغيل Android 13 أو الإصدارات الأقدم وضع "التشغيل المباشر" "المحاكي" الذي يستخدم أذونات الملفات لمحاكاة تأثيرات قفل الملفات المشفّرة وفتح قفلها. لا تستخدِم وضع المحاكاة إلا أثناء التطوير، فقد يؤدي إلى فقدان البيانات. لتفعيل وضع "التشغيل المباشر" الذي تمت محاكاته، اضبط نقش قفل على الجهاز، واختَر "لا شكرًا" إذا طُلب منك شاشة بدء تشغيل آمنة عند ضبط نقش قفل، ثم شغِّل أمر واجهة الأوامر التالي:

    adb shell sm set-emulate-fbe true
    

    لإيقاف وضع &quot;التشغيل المباشر&quot; الذي تمت محاكاته، نفِّذ أمر واجهة الأوامر التالي:

    adb shell sm set-emulate-fbe false
    

    يؤدي تشغيل أي من هذين الأمرين إلى إعادة تشغيل الجهاز.

التحقّق من حالة تشفير سياسة الجهاز

يمكن لتطبيقات إدارة الأجهزة استخدام DevicePolicyManager.getStorageEncryptionStatus() للتحقّق من حالة التشفير الحالية للجهاز.

إذا كان تطبيقك يستهدف مستوى واجهة برمجة تطبيقات أقل من Android 7.0 (واجهة برمجة التطبيقات 24)، ستعرض الدالة getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE إذا كان الجهاز يستخدم تشفير الأقراص بالكامل أو التشفير على مستوى الملفات مع ميزة "التشغيل المباشر". في كلتا الحالتين، يتم تخزين البيانات دائمًا مشفّرة في حالة عدم النشاط.

إذا كان تطبيقك يستهدف الإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات) أو إصدارًا أحدث، getStorageEncryptionStatus() يعرض ENCRYPTION_STATUS_ACTIVE إذا كان الجهاز يستخدم تشفير القرص بالكامل. وتعرِض هذه الإشارة ENCRYPTION_STATUS_ACTIVE_PER_USER إذا كان الجهاز يستخدم التشفير على مستوى الملفات مع ميزة "التشغيل المباشر".

إذا كنت تنشئ تطبيقًا لإدارة الأجهزة يستهدف الإصدار Android 7.0، تأكَّد من التحقّق من كل من ENCRYPTION_STATUS_ACTIVE و ENCRYPTION_STATUS_ACTIVE_PER_USER لتحديد ما إذا كان الجهاز مشفّرًا.

عيّنات تعليمات برمجية إضافية

يوضّح نموذج DirectBoot بشكل أكبر استخدام واجهات برمجة التطبيقات المشمولة في هذه الصفحة.