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

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

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

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

  • التطبيقات التي تُرسِل إشعارات مجدوَلة، مثل تطبيقات المنبّهات
  • التطبيقات التي ترسل إشعارات مهمة للمستخدمين، مثل تطبيقات الرسائل القصيرة
  • التطبيقات التي توفّر خدمات تسهيل الاستخدام، مثل 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 من خلال الاتصال بالخدمة 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) وتعمل بالإصدار 7.0 من Android وحتى 12 من Android إلى التشفير المستنِد إلى الملفات. وهناك طريقتان لذلك:

      تحذير: تؤدي أي من طريقتَي التحويل إلى التشفير المستند إلى الملفات إلى محو جميع بيانات المستخدم على الجهاز.

    • على الجهاز، فعِّل خيارات المطوّر إذا لم يسبق لك تفعيلها، وذلك من خلال الانتقال إلى الإعدادات > لمحة عن الهاتف والنقر على رقم الإصدار سبع مرات. بعد ذلك، انتقِل إلى الإعدادات > خيارات المطوّرين واختَر التحويل إلى تشفير الملفات.
    • بدلاً من ذلك، يمكنك تنفيذ أوامر shell التالية:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • تتيح الأجهزة التي تعمل بنظام التشغيل Android 13 أو الإصدارات الأقدم وضع التمهيد المباشر "المحاكي" الذي يستخدم أذونات الملفات لمحاكاة تأثيرات قفل الملفات المشفَّرة وفتح قفلها. لا تستخدِم الوضع المحاكي إلا أثناء التطوير، إذ يمكن أن يؤدي إلى فقدان البيانات. لتفعيل وضع Direct Boot (التشغيل المباشر) المحاكي، اضبط نمط قفل على الجهاز، واختَر "لا، شكرًا" إذا طُلب منك شاشة تشغيل آمنة عند ضبط نمط القفل، ثم نفِّذ الأمر التالي في واجهة الأوامر:

    adb shell sm set-emulate-fbe true
    

    لإيقاف وضع "التشغيل المباشر" المحاكي، شغِّل الأمر التالي في واجهة الصعق:

    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 إذا كان الجهاز يستخدم التشفير المستند إلى الملفات مع ميزة "التشغيل المباشر".

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

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

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