रिलीज़ के लिए बिल्ड पर हस्ताक्षर करना

Android OS की इमेज में, क्रिप्टोग्राफ़िक सिग्नेचर का इस्तेमाल दो जगहों पर किया जाता है:

  1. इमेज में मौजूद हर .apk फ़ाइल पर हस्ताक्षर होना चाहिए. Android का Package Manager, .apk सिग्नेचर का इस्तेमाल दो तरीकों से करता है:
    • किसी ऐप्लिकेशन को बदलने पर, उसे उसी कुंजी से साइन किया जाना चाहिए जिससे पुराने ऐप्लिकेशन को साइन किया गया था. ऐसा करने पर ही, नए ऐप्लिकेशन को पुराने ऐप्लिकेशन का डेटा ऐक्सेस करने की अनुमति मिलेगी. यह बात, .apk को बदलकर उपयोगकर्ता के ऐप्लिकेशन अपडेट करने और /data में इंस्टॉल किए गए सिस्टम ऐप्लिकेशन को नए वर्शन से बदलने, दोनों पर लागू होती है.
    • अगर दो या इससे ज़्यादा ऐप्लिकेशन को उपयोगकर्ता आईडी शेयर करना है, तो उन्हें एक ही कुंजी से साइन किया जाना चाहिए. इससे वे डेटा वगैरह शेयर कर पाएंगे.
  2. OTA अपडेट पैकेज पर, सिस्टम के लिए ज़रूरी किसी एक कुंजी से हस्ताक्षर किया जाना चाहिए. ऐसा न होने पर, इंस्टॉलेशन प्रोसेस उन्हें अस्वीकार कर देगी.

रिलीज़ की कुंजियां

Android ट्री में, build/target/product/security के नीचे test-keys शामिल हैं. make का इस्तेमाल करके Android OS इमेज बनाने पर, सभी .apk फ़ाइलों पर test-keys का इस्तेमाल करके हस्ताक्षर किए जाएंगे. टेस्ट-की सार्वजनिक तौर पर उपलब्ध होती हैं. इसलिए, कोई भी व्यक्ति एक ही कुंजी से अपनी .apk फ़ाइलों पर हस्ताक्षर कर सकता है. इससे, वे आपके ओएस इमेज में बने सिस्टम ऐप्लिकेशन को बदल सकते हैं या उन्हें हाइजैक कर सकते हैं. इस वजह से, सार्वजनिक तौर पर रिलीज़ की गई या डिप्लॉय की गई किसी भी Android OS इमेज को release-keys के खास सेट से साइन करना ज़रूरी है. इन कुंजियों का ऐक्सेस सिर्फ़ आपके पास होता है.

रिलीज़-की का अपना यूनीक सेट जनरेट करने के लिए, अपने Android ट्री के रूट से ये कमांड चलाएं:

subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
mkdir ~/.android-certs
for x in releasekey platform shared media networkstack; do \
    ./development/tools/make_key ~/.android-certs/$x "$subject"; \
  done

$subject को बदलकर, अपने संगठन की जानकारी डालें. किसी भी डायरेक्ट्री का इस्तेमाल किया जा सकता है. हालांकि, ऐसी जगह चुनें जिसका बैक अप लिया गया हो और जो सुरक्षित हो. कुछ वेंडर, अपनी निजी कुंजी को मज़बूत लंबे पासवर्ड से एन्क्रिप्ट (सुरक्षित) करते हैं. साथ ही, एन्क्रिप्ट (सुरक्षित) की गई कुंजी को सोर्स कंट्रोल में सेव करते हैं. वहीं, कुछ वेंडर अपनी रिलीज़ कुंजियों को किसी दूसरी जगह पर सेव करते हैं. जैसे, एयर-गैप्ड कंप्यूटर पर.

रिलीज़ इमेज जनरेट करने के लिए, इसका इस्तेमाल करें:

make dist
sign_target_files_apks \
-o \    # explained in the next section
--default_key_mappings ~/.android-certs out/dist/*-target_files-*.zip \
signed-target_files.zip

sign_target_files_apks स्क्रिप्ट, टारगेट-फ़ाइलें .zip को इनपुट के तौर पर लेती है और नई टारगेट-फ़ाइलें .zip बनाती है. इनमें सभी .apk फ़ाइलों पर नई कुंजियों से हस्ताक्षर किए जाते हैं. नई साइन की गई इमेज, IMAGES/ में signed-target_files.zip में जाकर देखी जा सकती हैं.

OTA पैकेज पर हस्ताक्षर करना

हस्ताक्षर की गई टारगेट-फ़ाइलों वाली ZIP फ़ाइल को, हस्ताक्षर की गई OTA अपडेट वाली ZIP फ़ाइल में बदला जा सकता है. इसके लिए, यह तरीका अपनाएं:
ota_from_target_files \
-k  (--package_key) 
signed-target_files.zip \
signed-ota_update.zip

हस्ताक्षर और साइडलोडिंग

साइडलोडिंग, रिकवरी के सामान्य पैकेज सिग्नेचर की पुष्टि करने के तरीके को बायपास नहीं करती. किसी पैकेज को इंस्टॉल करने से पहले, रिकवरी यह पुष्टि करेगी कि उस पर, रिकवरी पार्टीशन में सेव किए गए सार्वजनिक पासकोड से मेल खाने वाले किसी निजी पासकोड से साइन किया गया है. यह पुष्टि, ओवर-द-एयर डिलीवर किए गए पैकेज के लिए भी की जाती है.

मुख्य सिस्टम से मिले अपडेट पैकेज की पुष्टि आम तौर पर दो बार की जाती है: पहली बार, मुख्य सिस्टम android API में मौजूद RecoverySystem.verifyPackage() तरीके का इस्तेमाल करके पुष्टि करता है. इसके बाद, रिकवरी सिस्टम पुष्टि करता है. RecoverySystem API, मुख्य सिस्टम में सेव की गई सार्वजनिक कुंजियों के हिसाब से हस्ताक्षर की जांच करता है. यह जांच, डिफ़ॉल्ट रूप से /system/etc/security/otacerts.zip फ़ाइल में की जाती है. रिकवरी प्रोसेस, हस्ताक्षर की जांच करती है. इसके लिए, रिकवरी पार्टीशन के रैम डिस्क में सेव की गई सार्वजनिक कुंजियों का इस्तेमाल किया जाता है. ये कुंजियां, /res/keys फ़ाइल में मौजूद होती हैं.

डिफ़ॉल्ट रूप से, बिल्ड से जनरेट हुई टारगेट फ़ाइलें .zip, ओटीए सर्टिफ़िकेट को टेस्ट की से मैच करने के लिए सेट करती हैं. रिलीज़ की गई इमेज पर, किसी दूसरे सर्टिफ़िकेट का इस्तेमाल किया जाना चाहिए, ताकि डिवाइस अपडेट पैकेज की पुष्टि कर सकें. पिछले सेक्शन में दिखाए गए तरीके से, -o फ़्लैग को sign_target_files_apks पर पास करने से, टेस्ट की कुंजी का सर्टिफ़िकेट, आपके सर्टिफ़िकेट डायरेक्ट्री में मौजूद रिलीज़ की कुंजी के सर्टिफ़िकेट से बदल जाता है.

आम तौर पर, सिस्टम इमेज और रिकवरी इमेज में, ओटीए की एक ही तरह की सार्वजनिक कुंजियां सेव होती हैं. सिर्फ़ कुंजियों के रिकवरी सेट में कोई कुंजी जोड़ने से, ऐसे पैकेज पर साइन किया जा सकता है जिन्हें सिर्फ़ साइडलोडिंग के ज़रिए इंस्टॉल किया जा सकता है. हालांकि, इसके लिए यह ज़रूरी है कि मुख्य सिस्टम का अपडेट डाउनलोड करने का तरीका, otacerts.zip के ख़िलाफ़ सही तरीके से पुष्टि कर रहा हो. अपने प्रॉडक्ट की परिभाषा में PRODUCT_EXTRA_RECOVERY_KEYS वैरिएबल सेट करके, सिर्फ़ रिकवरी में शामिल की जाने वाली अतिरिक्त कुंजियां तय की जा सकती हैं:

vendor/yoyodyne/tardis/products/tardis.mk
 [...]

PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload

इसमें रिकवरी की फ़ाइल में मौजूद सार्वजनिक कुंजी vendor/yoyodyne/security/tardis/sideload.x509.pem भी शामिल होती है, ताकि इस कुंजी से हस्ताक्षर किए गए पैकेज इंस्टॉल किए जा सकें. हालांकि, अतिरिक्त कुंजी को otacerts.zip में शामिल नहीं किया गया है. इसलिए, डाउनलोड किए गए पैकेज की सही तरीके से पुष्टि करने वाले सिस्टम, इस कुंजी से साइन किए गए पैकेज के लिए रिकवरी शुरू नहीं करते.

सर्टिफ़िकेट और निजी पासकोड

हर कुंजी दो फ़ाइलों में मिलती है: सर्टिफ़िकेट, जिसका एक्सटेंशन .x509.pem होता है. दूसरी फ़ाइल निजी पासकोड होता है, जिसका एक्सटेंशन .pk8 होता है. निजी कुंजी को गोपनीय रखना चाहिए. साथ ही, पैकेज पर हस्ताक्षर करने के लिए इसकी ज़रूरत होती है. ऐसा हो सकता है कि कुंजी को पासवर्ड से सुरक्षित किया गया हो. इसके उलट, सर्टिफ़िकेट में सिर्फ़ कुंजी का सार्वजनिक हिस्सा होता है. इसलिए, इसे बड़े पैमाने पर डिस्ट्रिब्यूट किया जा सकता है. इसका इस्तेमाल यह पुष्टि करने के लिए किया जाता है कि पैकेज पर, उससे जुड़ी निजी कुंजी से हस्ताक्षर किया गया है.

स्टैंडर्ड Android बिल्ड में पांच कुंजियों का इस्तेमाल किया जाता है. ये सभी कुंजियां build/target/product/security में मौजूद होती हैं:

testkey
ऐसे पैकेज के लिए सामान्य डिफ़ॉल्ट कुंजी जिनके लिए कोई कुंजी तय नहीं की गई है.
प्लेटफ़ॉर्म
कोर प्लैटफ़ॉर्म का हिस्सा बनने वाले पैकेज के लिए टेस्ट कुंजी.
शेयर किया गया
होम/संपर्क की प्रोसेस में शेयर की गई चीज़ों के लिए टेस्ट कुंजी.
media
मीडिया/डाउनलोड सिस्टम का हिस्सा बनने वाले पैकेज के लिए टेस्ट कुंजी.
networkstack
नेटवर्किंग सिस्टम का हिस्सा बनने वाले पैकेज के लिए टेस्ट की. networkstack कुंजी का इस्तेमाल, मॉड्यूलर सिस्टम कॉम्पोनेंट के तौर पर डिज़ाइन किए गए बाइनरी पर हस्ताक्षर करने के लिए किया जाता है. अगर आपके मॉड्यूल अपडेट अलग से बनाए गए हैं और उन्हें डिवाइस की इमेज में प्रीबिल्ट के तौर पर इंटिग्रेट किया गया है, तो हो सकता है कि आपको Android सोर्स ट्री में networkstack कुंजी जनरेट करने की ज़रूरत न पड़े.

अलग-अलग पैकेज, Android.mk फ़ाइल में LOCAL_CERTIFICATE सेट करके, इनमें से किसी एक कुंजी के बारे में बताते हैं. (अगर यह वैरिएबल सेट नहीं है, तो testkey का इस्तेमाल किया जाता है.) पाथनेम के हिसाब से, पूरी तरह से अलग कुंजी भी तय की जा सकती है. उदाहरण के लिए:

device/yoyodyne/apps/SpecialApp/Android.mk
 [...]

LOCAL_CERTIFICATE := device/yoyodyne/security/special

अब यह बिल्ड, SpecialApp.apk पर साइन करने के लिए device/yoyodyne/security/special.{x509.pem,pk8} कुंजी का इस्तेमाल करता है. बिल्ड में सिर्फ़ ऐसी निजी कुंजियों का इस्तेमाल किया जा सकता है जिन्हें पासवर्ड से सुरक्षित न किया गया हो .

हस्ताक्षर करने के बेहतर विकल्प

APK साइनिंग पासकोड बदलना

हस्ताक्षर करने वाली स्क्रिप्ट sign_target_files_apks, किसी बिल्ड के लिए जनरेट की गई टारगेट फ़ाइलों पर काम करती है. बिल्ड के समय इस्तेमाल किए गए सर्टिफ़िकेट और निजी कुंजियों की सभी जानकारी, टारगेट फ़ाइलों में शामिल होती है. रिलीज़ के लिए साइन करने वाली स्क्रिप्ट को चलाने पर, कुंजी के नाम या APK के नाम के आधार पर साइनिंग कुंजियों को बदला जा सकता है.

कुंजी के नामों के आधार पर कुंजी बदलने की सुविधा के बारे में बताने के लिए, --key_mapping और --default_key_mappings फ़्लैग का इस्तेमाल करें:

  • --key_mapping src_key=dest_key फ़्लैग एक बार में एक कुंजी को बदलने की सुविधा देता है.
  • --default_key_mappings dir फ़्लैग, पांच कुंजियों वाली एक डायरेक्ट्री के बारे में बताता है. इसका इस्तेमाल build/target/product/security में मौजूद सभी कुंजियों को बदलने के लिए किया जाता है. यह मैपिंग तय करने के लिए, --key_mapping का पांच बार इस्तेमाल करने के बराबर है.
build/target/product/security/testkey      = dir/releasekey
build/target/product/security/platform     = dir/platform
build/target/product/security/shared       = dir/shared
build/target/product/security/media        = dir/media
build/target/product/security/networkstack = dir/networkstack

APK के नामों के आधार पर, साइनिंग कुंजी बदलने के लिए --extra_apks apk_name1,apk_name2,...=key फ़्लैग का इस्तेमाल करें. अगर key को खाली छोड़ दिया जाता है, तो स्क्रिप्ट, बताए गए APK को पहले से साइन किए गए APK के तौर पर मानती है.

उदाहरण के तौर पर दिए गए Tardis प्रॉडक्ट के लिए, आपको पासवर्ड से सुरक्षित छह कुंजियों की ज़रूरत होगी: पांच कुंजियां, build/target/product/security में मौजूद पांच कुंजियों को बदलने के लिए. एक कुंजी, ऊपर दिए गए उदाहरण में SpecialApp के लिए ज़रूरी अतिरिक्त कुंजी device/yoyodyne/security/special को बदलने के लिए. अगर कुंजियां इन फ़ाइलों में थीं:

vendor/yoyodyne/security/tardis/releasekey.x509.pem
vendor/yoyodyne/security/tardis/releasekey.pk8
vendor/yoyodyne/security/tardis/platform.x509.pem
vendor/yoyodyne/security/tardis/platform.pk8
vendor/yoyodyne/security/tardis/shared.x509.pem
vendor/yoyodyne/security/tardis/shared.pk8
vendor/yoyodyne/security/tardis/media.x509.pem
vendor/yoyodyne/security/tardis/media.pk8
vendor/yoyodyne/security/tardis/networkstack.x509.pem
vendor/yoyodyne/security/tardis/networkstack.pk8
vendor/yoyodyne/security/special.x509.pem
vendor/yoyodyne/security/special.pk8           # NOT password protected
vendor/yoyodyne/security/special-release.x509.pem
vendor/yoyodyne/security/special-release.pk8   # password protected

इसके बाद, आपको सभी ऐप्लिकेशन में इस तरह से साइन करना होगा:

./build/make/tools/releasetools/sign_target_files_apks \
    --default_key_mappings vendor/yoyodyne/security/tardis \
    --key_mapping vendor/yoyodyne/security/special=vendor/yoyodyne/security/special-release \
    --extra_apks PresignedApp= \
    -o tardis-target_files.zip \
    signed-tardis-target_files.zip

इससे ये विकल्प दिखते हैं:

Enter password for vendor/yoyodyne/security/special-release key>
Enter password for vendor/yoyodyne/security/tardis/networkstack key>
Enter password for vendor/yoyodyne/security/tardis/media key>
Enter password for vendor/yoyodyne/security/tardis/platform key>
Enter password for vendor/yoyodyne/security/tardis/releasekey key>
Enter password for vendor/yoyodyne/security/tardis/shared key>
    signing: Phone.apk (vendor/yoyodyne/security/tardis/platform)
    signing: Camera.apk (vendor/yoyodyne/security/tardis/media)
    signing: NetworkStack.apk (vendor/yoyodyne/security/tardis/networkstack)
    signing: Special.apk (vendor/yoyodyne/security/special-release)
    signing: Email.apk (vendor/yoyodyne/security/tardis/releasekey)
        [...]
    signing: ContactsProvider.apk (vendor/yoyodyne/security/tardis/shared)
    signing: Launcher.apk (vendor/yoyodyne/security/tardis/shared)
NOT signing: PresignedApp.apk
        (skipped due to special cert string)
rewriting SYSTEM/build.prop:
  replace:  ro.build.description=tardis-user Eclair ERC91 15449 test-keys
     with:  ro.build.description=tardis-user Eclair ERC91 15449 release-keys
  replace: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/test-keys
     with: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/release-keys
    signing: framework-res.apk (vendor/yoyodyne/security/tardis/platform)
rewriting RECOVERY/RAMDISK/default.prop:
  replace:  ro.build.description=tardis-user Eclair ERC91 15449 test-keys
     with:  ro.build.description=tardis-user Eclair ERC91 15449 release-keys
  replace: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/test-keys
     with: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/release-keys
using:
    vendor/yoyodyne/security/tardis/releasekey.x509.pem
for OTA package verification
done.

पासवर्ड से सुरक्षित की गई सभी कुंजियों के लिए, उपयोगकर्ता से पासवर्ड मांगने के बाद स्क्रिप्ट, इनपुट टारगेट .zip में मौजूद सभी APK फ़ाइलों पर रिलीज़ की गई कुंजियों से फिर से हस्ताक्षर करती है. कमांड चलाने से पहले, ANDROID_PW_FILE एनवायरमेंट वैरिएबल को किसी अस्थायी फ़ाइल नाम पर भी सेट किया जा सकता है. इसके बाद, स्क्रिप्ट आपके एडिटर को चालू करती है, ताकि आप सभी कुंजियों के लिए पासवर्ड डाल सकें. यह पासवर्ड डालने का ज़्यादा आसान तरीका हो सकता है.

APEX साइनिंग की को बदलना

Android 10 में, सिस्टम के निचले लेवल के मॉड्यूल इंस्टॉल करने के लिए APEX फ़ाइल फ़ॉर्मैट पेश किया गया है. APEX पर हस्ताक्षर करने की प्रोसेस में बताया गया है कि हर APEX फ़ाइल पर दो कुंजियों से हस्ताक्षर किया जाता है: एक कुंजी का इस्तेमाल, APEX में मौजूद मिनी फ़ाइल सिस्टम इमेज के लिए किया जाता है और दूसरी कुंजी का इस्तेमाल, पूरे APEX के लिए किया जाता है.

रिलीज़ के लिए साइन करते समय, APEX फ़ाइल की दो साइनिंग कुंजियों को रिलीज़ कुंजियों से बदल दिया जाता है. फ़ाइल सिस्टम पेलोड कुंजी को --extra_apex_payload फ़्लैग के साथ और पूरी APEX फ़ाइल साइनिंग कुंजी को --extra_apks फ़्लैग के साथ तय किया जाता है.

टारडिस प्रॉडक्ट के लिए, मान लें कि आपके पास com.android.conscrypt.apex, com.android.media.apex, और com.android.runtime.release.apex APEX फ़ाइलों के लिए, यह मुख्य कॉन्फ़िगरेशन है.

name="com.android.conscrypt.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED"
name="com.android.media.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED"
name="com.android.runtime.release.apex" public_key="vendor/yoyodyne/security/testkeys/com.android.runtime.avbpubkey" private_key="vendor/yoyodyne/security/testkeys/com.android.runtime.pem" container_certificate="vendor/yoyodyne/security/testkeys/com.google.android.runtime.release_container.x509.pem" container_private_key="vendor/yoyodyne/security/testkeys/com.google.android.runtime.release_container.pk8"

साथ ही, आपके पास रिलीज़ की वाली ये फ़ाइलें होनी चाहिए:

vendor/yoyodyne/security/runtime_apex_container.x509.pem
vendor/yoyodyne/security/runtime_apex_container.pk8
vendor/yoyodyne/security/runtime_apex_payload.pem

रिलीज़ पर हस्ताक्षर करने के दौरान, यह निर्देश com.android.runtime.release.apex और com.android.tzdata.apex के लिए हस्ताक्षर करने वाले कोड को बदल देता है. खास तौर पर, com.android.runtime.release.apex पर बताई गई रिलीज़ कुंजियों से हस्ताक्षर किया जाता है (runtime_apex_container APEX फ़ाइल के लिए और runtime_apex_payload फ़ाइल इमेज पेलोड के लिए). com.android.tzdata.apex को पहले से साइन किया गया माना जाता है. अन्य सभी APEX फ़ाइलों को डिफ़ॉल्ट कॉन्फ़िगरेशन के हिसाब से हैंडल किया जाता है. इसकी जानकारी टारगेट फ़ाइलों में दी गई है.

./build/make/tools/releasetools/sign_target_files_apks \
    --default_key_mappings   vendor/yoyodyne/security/tardis \
    --extra_apks             com.android.runtime.release.apex=vendor/yoyodyne/security/runtime_apex_container \
    --extra_apex_payload_key com.android.runtime.release.apex=vendor/yoyodyne/security/runtime_apex_payload.pem \
    --extra_apks             com.android.media.apex= \
    --extra_apex_payload_key com.android.media.apex= \
    -o tardis-target_files.zip \
    signed-tardis-target_files.zip

ऊपर दिए गए कमांड को चलाने पर, ये लॉग मिलते हैं:

        [...]
    signing: com.android.runtime.release.apex                  container (vendor/yoyodyne/security/runtime_apex_container)
           : com.android.runtime.release.apex                  payload   (vendor/yoyodyne/security/runtime_apex_payload.pem)
NOT signing: com.android.conscrypt.apex
        (skipped due to special cert string)
NOT signing: com.android.media.apex
        (skipped due to special cert string)
        [...]

दूसरे विकल्प

sign_target_files_apks साइनिंग स्क्रिप्ट, बिल्ड प्रॉपर्टी फ़ाइलों में बिल्ड के ब्यौरे और फ़िंगरप्रिंट को फिर से लिखती है, ताकि यह पता चल सके कि बिल्ड पर हस्ताक्षर किया गया है. --tag_changes फ़्लैग से यह कंट्रोल किया जाता है कि फ़िंगरप्रिंट में कौनसे बदलाव किए जाएं. सभी फ़्लैग के बारे में दस्तावेज़ देखने के लिए, -h की मदद से स्क्रिप्ट चलाएं.

कुंजियों को मैन्युअल तरीके से जनरेट करना

Android, सार्वजनिक एक्सपोनेंट 3 के साथ 2048-बिट आरएसए कुंजियों का इस्तेमाल करता है. openssl.org से openssl टूल का इस्तेमाल करके, सर्टिफ़िकेट/निजी कुंजी के जोड़े जनरेट किए जा सकते हैं:

# generate RSA key
openssl genrsa -3 -out temp.pem 2048
Generating RSA private key, 2048 bit long modulus
....+++
.....................+++
e is 3 (0x3)

# create a certificate with the public part of the key
openssl req -new -x509 -key temp.pem -out releasekey.x509.pem -days 10000 -subj '/C=US/ST=California/L=San Narciso/O=Yoyodyne, Inc./OU=Yoyodyne Mobility/CN=Yoyodyne/emailAddress=yoyodyne@example.com'

# create a PKCS#8-formatted version of the private key
openssl pkcs8 -in temp.pem -topk8 -outform DER -out releasekey.pk8 -nocrypt

# securely delete the temp.pem file
shred --remove temp.pem

ऊपर दिया गया openssl pkcs8 निर्देश, बिना पासवर्ड वाली .pk8 फ़ाइल बनाता है. इसका इस्तेमाल बिल्ड सिस्टम के साथ किया जा सकता है. पासवर्ड से सुरक्षित .pk8 फ़ाइल बनाने के लिए (आपको सभी रिलीज़ की के लिए ऐसा करना चाहिए), -nocrypt आर्ग्युमेंट को -passout stdin से बदलें. इसके बाद, openssl स्टैंडर्ड इनपुट से पढ़े गए पासवर्ड की मदद से निजी पासकोड को एन्क्रिप्ट (सुरक्षित) कर देगा. कोई प्रॉम्प्ट प्रिंट नहीं किया जाता. इसलिए, अगर stdin टर्मिनल है, तो प्रोग्राम तब तक काम नहीं करेगा, जब तक आप पासवर्ड नहीं डालते. अन्य जगहों से पासवर्ड पढ़ने के लिए, the-passout आर्ग्युमेंट के लिए अन्य वैल्यू का इस्तेमाल किया जा सकता है. ज़्यादा जानकारी के लिए, openssl का दस्तावेज़ देखें.

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

इमेज फ़ाइलें बनाना

signed-target_files.zip होने पर, आपको इमेज बनानी होगी, ताकि उसे किसी डिवाइस पर दिखाया जा सके. टारगेट फ़ाइलों से साइन की गई इमेज बनाने के लिए, Android ट्री के रूट से यह कमांड चलाएं:

img_from_target_files signed-target_files.zip signed-img.zip
नतीजे के तौर पर मिली फ़ाइल, signed-img.zip में सभी .img फ़ाइलें शामिल होती हैं. किसी डिवाइस पर इमेज लोड करने के लिए, fastboot का इस्तेमाल इस तरह करें:
fastboot update signed-img.zip