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

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

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

adb shell getprop ro.crypto.type

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

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

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

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

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