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

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

KotlinJava
val directBootContext: Context = appContext.createDeviceProtectedStorageContext()
// Access appDataFilename that lives in device encrypted storage
val inStream: InputStream = directBootContext.openFileInput(appDataFilename)
// Use inStream to read content...
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 يمكن تحويل Android 12 إلى تنسيق ملفات تشفير البيانات. وهناك طريقتان لذلك:

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

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

    adb shell sm set-emulate-fbe true
    

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

    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 أيضًا استخدام واجهات برمجة التطبيقات التي تتناولها هذه الصفحة.