डायरेक्ट बूट मोड के साथ काम करना

Android 7.0 सुरक्षित, डायरेक्ट बूट मोड में चलता है जब डिवाइस चालू हो, लेकिन उपयोगकर्ता ने डिवाइस. इसके लिए, सिस्टम में डेटा के लिए दो स्टोरेज लोकेशन उपलब्ध हैं:

  • क्रेडेंशियल का एन्क्रिप्ट (सुरक्षित) किया गया स्टोरेज, जो स्टोरेज की डिफ़ॉल्ट जगह है और सिर्फ़ डिवाइस के अनलॉक होने के बाद उपलब्ध होता है.
  • डिवाइस का एन्क्रिप्ट (सुरक्षित) किया गया स्टोरेज, जो दोनों में उपलब्ध स्टोरेज की जगह है डायरेक्ट बूट मोड के दौरान और उपयोगकर्ता के डिवाइस को अनलॉक करने के बाद.

डिफ़ॉल्ट रूप से, डायरेक्ट बूट मोड के दौरान ऐप्लिकेशन नहीं चलते हैं. अगर डायरेक्ट बूट मोड के दौरान आपके ऐप्लिकेशन को कोई कार्रवाई करनी है, तो इस मोड के दौरान चलाए जाने वाले ऐप्लिकेशन के कॉम्पोनेंट शामिल करने होंगे. डायरेक्ट बूट मोड के दौरान चलने वाले ऐप्लिकेशन के इस्तेमाल के कुछ सामान्य उदाहरणों में ये शामिल हैं:

  • ऐसे ऐप्लिकेशन जिनमें सूचनाएं शेड्यूल की गई हैं, जैसे कि अलार्म क्लॉक दिखाई देता है.
  • ऐसे ऐप्लिकेशन जो उपयोगकर्ता को ज़रूरी सूचनाएं देते हैं, जैसे कि एसएमएस ऐप्लिकेशन.
  • 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 के नए वर्शन वाले ज़्यादातर डिवाइस में डायरेक्ट बूट मोड चालू होता है जब भी लॉकस्क्रीन क्रेडेंशियल (पिन, पैटर्न या पासवर्ड) सेट किया गया हो. खास तौर पर, यह उन सभी डिवाइसों पर लागू होता है जो फ़ाइल-आधारित एन्क्रिप्शन का इस्तेमाल करते हैं. यह देखने के लिए कि डिवाइस में फ़ाइल एन्क्रिप्ट (सुरक्षित) करने का तरीका इस्तेमाल किया गया है या नहीं, नीचे दी गई शेल कमांड:

adb shell getprop ro.crypto.type

अगर आउटपुट file आता है, तो इसका मतलब है कि डिवाइस में फ़ाइल पर आधारित एन्क्रिप्ट (सुरक्षित) करने का तरीका मौजूद है चालू किया गया.

डिफ़ॉल्ट रूप से फ़ाइल-आधारित एन्क्रिप्शन का इस्तेमाल न करने वाले डिवाइसों पर, डायरेक्ट बूट मोड की जांच करने के लिए ये विकल्प हो सकते हैं:

  • फ़ुल-डिस्क एन्क्रिप्शन (ro.crypto.type=block) का इस्तेमाल करने वाले और Android 7.0 से लेकर Android 12 तक के वर्शन पर काम करने वाले कुछ डिवाइसों को, फ़ाइल-आधारित एन्क्रिप्शन में बदला जा सकता है. ऐसा करने के दो तरीके हैं:

      चेतावनी: एक या एक से ज़्यादा तरीके से कन्वर्ज़न फ़ाइल आधारित एन्क्रिप्शन, डिवाइस पर मौजूद सभी उपयोगकर्ता डेटा को वाइप कर देता है.

    • अगर आपने डिवाइस पर डेवलपर के लिए सेटिंग और टूल की सुविधा पहले से चालू नहीं की है, तो इसे चालू करें. इसके लिए, सेटिंग > फ़ोन के बारे में जानकारी पर जाएं और बिल्ड नंबर पर सात बार टैप करें. इसके बाद, सेटिंग > डेवलपर के लिए सेटिंग और टूल पर जाएं और फ़ाइल को एन्क्रिप्ट (सुरक्षित) करने की सुविधा में बदलें को चुनें.
    • इसके अलावा, ये शेल कमांड चलाएं:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • Android 13 या इससे पहले के वर्शन वाले डिवाइसों पर, "एम्युलेट किया गया" डायरेक्ट बूट मोड जो GA4 को सिम्युलेट करने के लिए फ़ाइल अनुमतियों का इस्तेमाल करता है एन्क्रिप्ट की गई फ़ाइलों को लॉक और अनलॉक किए जाने के असर. एमुलेट किए गए मोड का इस्तेमाल सिर्फ़ डेवलपमेंट के दौरान करें. ऐसा करने से डेटा मिट सकता है. एम्युलेट किए गए डायरेक्ट बूट मोड को चालू करने के लिए, डिवाइस पर लॉक पैटर्न सेट करें. अगर लॉक पैटर्न सेट करते समय, आपसे सुरक्षित स्टार्ट-अप स्क्रीन का अनुरोध किया जाता है, तो "नहीं, धन्यवाद" चुनें. इसके बाद, यहां दी गई शेल कमांड चलाएं:

    adb shell sm set-emulate-fbe true
    

    एम्युलेट किए गए डायरेक्ट बूट मोड को बंद करने के लिए, यह शेल कमांड चलाएं:

    adb shell sm set-emulate-fbe false
    

    इनमें से किसी भी निर्देश को चलाने पर, डिवाइस रीबूट हो जाता है.

डिवाइस की नीति के हिसाब से, एन्क्रिप्शन की स्थिति देखना

डिवाइस के एडमिन ऐप्लिकेशन इनका इस्तेमाल कर सकते हैं DevicePolicyManager.getStorageEncryptionStatus() डिवाइस की मौजूदा एन्क्रिप्शन स्थिति देखने के लिए.

अगर आपका ऐप्लिकेशन Android 7.0 (एपीआई 24) से पहले के एपीआई लेवल को टारगेट करता है, तो डिवाइस पर फ़ुल-डिस्क एन्क्रिप्शन या Direct Boot के साथ फ़ाइल-आधारित एन्क्रिप्शन का इस्तेमाल होने पर, getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE दिखाता है. इन दोनों ही मामलों में, डेटा को हमेशा एन्क्रिप्ट (सुरक्षित) करके स्टोर किया जाता है.

अगर आपका ऐप्लिकेशन Android 7.0 (एपीआई 24) या उसके बाद के वर्शन को टारगेट करता है, तो डिवाइस पर फ़ुल-डिस्क एन्क्रिप्शन का इस्तेमाल होने पर, getStorageEncryptionStatus(), ENCRYPTION_STATUS_ACTIVE दिखाता है. यह वापस आ जाता है अगर डिवाइस में फ़ाइल के आधार पर एन्क्रिप्ट (सुरक्षित) करने का तरीका इस्तेमाल किया जा रहा है, तो ENCRYPTION_STATUS_ACTIVE_PER_USER डायरेक्ट बूट के साथ.

अगर आपने डिवाइस के एडमिन ऐप्लिकेशन को बनाया है जो Android 7.0 को टारगेट करता है, तो पक्का करें कि आपने ENCRYPTION_STATUS_ACTIVE और यह पता लगाने के लिए ENCRYPTION_STATUS_ACTIVE_PER_USER कि डिवाइस एन्क्रिप्ट किया गया है.

अन्य कोड सैंपल

DirectBoot सैंपल, इस पेज पर बताए गए एपीआई के इस्तेमाल के बारे में बताता है.