মুক্তির জন্য সাইন তৈরি করে

অ্যান্ড্রয়েড ওএস ইমেজ দুটি স্থানে ক্রিপ্টোগ্রাফিক স্বাক্ষর ব্যবহার করে:

  1. ইমেজের ভেতরের প্রতিটি .apk ফাইল অবশ্যই স্বাক্ষরিত হতে হবে। অ্যান্ড্রয়েডের প্যাকেজ ম্যানেজার একটি .apk স্বাক্ষর দুইভাবে ব্যবহার করে:
    • যখন কোনো অ্যাপ্লিকেশন প্রতিস্থাপন করা হয়, তখন পুরোনো অ্যাপ্লিকেশনটির ডেটা অ্যাক্সেস করার জন্য সেটিকে অবশ্যই পুরোনো অ্যাপ্লিকেশনটির মতো একই কী (key) দিয়ে সাইন করতে হবে। এই নিয়মটি .apk ফাইল ওভাররাইট করে ইউজার অ্যাপ আপডেট করার ক্ষেত্রে এবং /data অধীনে ইনস্টল করা একটি নতুন সংস্করণ দিয়ে সিস্টেম অ্যাপ ওভাররাইড করার ক্ষেত্রেও প্রযোজ্য।
    • যদি দুই বা ততোধিক অ্যাপ্লিকেশন একটি ইউজার আইডি শেয়ার করতে চায় (যাতে তারা ডেটা ইত্যাদি আদান-প্রদান করতে পারে), তবে সেগুলোকে অবশ্যই একই কী (key) দিয়ে সাইন করতে হবে।
  2. OTA আপডেট প্যাকেজগুলো অবশ্যই সিস্টেমের প্রত্যাশিত কীগুলোর মধ্যে একটি দিয়ে স্বাক্ষরিত হতে হবে, অন্যথায় ইনস্টলেশন প্রক্রিয়া সেগুলোকে প্রত্যাখ্যান করবে।

রিলিজ কী

অ্যান্ড্রয়েড ট্রি-তে build/target/product/security এর অধীনে টেস্ট-কী অন্তর্ভুক্ত থাকে। make ব্যবহার করে একটি অ্যান্ড্রয়েড ওএস ইমেজ তৈরি করলে, টেস্ট-কী ব্যবহার করে সমস্ত .apk ফাইল সাইন করা হয়। যেহেতু টেস্ট-কীগুলো সর্বজনবিদিত, তাই যে কেউ একই কী ব্যবহার করে তাদের নিজস্ব .apk ফাইল সাইন করতে পারে, যা তাদেরকে আপনার ওএস ইমেজে বিল্ট-ইন সিস্টেম অ্যাপগুলো প্রতিস্থাপন বা হাইজ্যাক করার সুযোগ করে দিতে পারে। এই কারণে, সর্বজনীনভাবে প্রকাশিত বা ডেপ্লয় করা যেকোনো অ্যান্ড্রয়েড ওএস ইমেজকে এক বিশেষ সেট রিলিজ-কী দিয়ে সাইন করা অত্যন্ত গুরুত্বপূর্ণ, যেটিতে শুধুমাত্র আপনারই অ্যাক্সেস থাকবে।

আপনার নিজস্ব স্বতন্ত্র রিলিজ-কী সেট তৈরি করতে, আপনার অ্যান্ড্রয়েড ট্রি-এর রুট থেকে এই কমান্ডগুলো চালান:

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 স্ক্রিপ্টটি ইনপুট হিসেবে একটি target-files .zip ফাইল গ্রহণ করে এবং একটি নতুন target-files .zip ফাইল তৈরি করে, যার সমস্ত .apk ফাইল নতুন কী (key) দিয়ে স্বাক্ষরিত (signed) থাকে। নতুন স্বাক্ষরিত ইমেজগুলো signed-target_files.zip ফাইলের IMAGES/ ফোল্ডারে পাওয়া যাবে।

OTA প্যাকেজগুলিতে স্বাক্ষর করুন

নিম্নলিখিত পদ্ধতি ব্যবহার করে একটি স্বাক্ষরিত টার্গেট-ফাইল জিপকে একটি স্বাক্ষরিত OTA আপডেট জিপে রূপান্তর করা যেতে পারে:
ota_from_target_files \
-k  (--package_key) 
signed-target_files.zip \
signed-ota_update.zip

স্বাক্ষর এবং সাইডলোডিং

সাইডলোডিং রিকভারির স্বাভাবিক প্যাকেজ সিগনেচার যাচাইকরণ প্রক্রিয়াকে বাইপাস করে না—একটি প্যাকেজ ইনস্টল করার আগে, রিকভারি যাচাই করে দেখবে যে প্যাকেজটি রিকভারি পার্টিশনে সংরক্ষিত পাবলিক কীগুলোর সাথে মেলে এমন কোনো একটি প্রাইভেট কী দিয়ে স্বাক্ষরিত কিনা, ঠিক যেমনটি এটি ওভার-দ্য-এয়ার ডেলিভারি করা কোনো প্যাকেজের ক্ষেত্রে করে থাকে।

মূল সিস্টেম থেকে প্রাপ্ত আপডেট প্যাকেজগুলি সাধারণত দুইবার যাচাই করা হয়: একবার মূল সিস্টেম দ্বারা, অ্যান্ড্রয়েড এপিআই-এর RecoverySystem.verifyPackage() পদ্ধতি ব্যবহার করে, এবং তারপর আবার রিকভারি দ্বারা। RecoverySystem এপিআই মূল সিস্টেমে সংরক্ষিত পাবলিক কী-গুলির সাথে সিগনেচারটি মিলিয়ে দেখে, যা ডিফল্টরূপে /system/etc/security/otacerts.zip ফাইলে থাকে। রিকভারি সিগনেচারটি রিকভারি পার্টিশন র‍্যাম ডিস্কে সংরক্ষিত পাবলিক কী-গুলির সাথে মিলিয়ে দেখে, /res/keys ফাইলে থাকে।

ডিফল্টরূপে, বিল্ড দ্বারা উৎপাদিত টার্গেট-ফাইলস .zip ফাইলটি টেস্ট কী-এর সাথে মিলিয়ে OTA সার্টিফিকেট সেট করে। একটি রিলিজড ইমেজে অবশ্যই একটি ভিন্ন সার্টিফিকেট ব্যবহার করতে হবে, যাতে ডিভাইসগুলো আপডেট প্যাকেজের সত্যতা যাচাই করতে পারে। পূর্ববর্তী বিভাগে দেখানো অনুযায়ী, sign_target_files_apks-o ফ্ল্যাগটি পাস করলে, এটি আপনার certs ডিরেক্টরি থেকে রিলিজ কী সার্টিফিকেট দ্বারা টেস্ট কী সার্টিফিকেটটিকে প্রতিস্থাপন করে।

সাধারণত সিস্টেম ইমেজ এবং রিকভারি ইমেজ একই OTA পাবলিক কী সেট সংরক্ষণ করে। শুধুমাত্র রিকভারি কী সেটে একটি কী যোগ করার মাধ্যমে, এমন প্যাকেজ সাইন করা সম্ভব যা কেবল সাইডলোডিংয়ের মাধ্যমে ইনস্টল করা যায় (যদি মূল সিস্টেমের আপডেট ডাউনলোড প্রক্রিয়াটি 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। প্রাইভেট কী গোপন রাখা উচিত এবং একটি প্যাকেজ সাইন করার জন্য এটির প্রয়োজন হয়। কী-টি নিজেও একটি পাসওয়ার্ড দ্বারা সুরক্ষিত থাকতে পারে। অন্যদিকে, সার্টিফিকেটে কী-টির শুধুমাত্র পাবলিক অংশ থাকে, তাই এটি ব্যাপকভাবে বিতরণ করা যায়। কোনো প্যাকেজ সংশ্লিষ্ট প্রাইভেট কী দ্বারা সাইন করা হয়েছে কিনা, তা যাচাই করতে এটি ব্যবহৃত হয়।

স্ট্যান্ডার্ড অ্যান্ড্রয়েড বিল্ডে পাঁচটি কী ব্যবহৃত হয়, যেগুলোর সবগুলোই build/target/product/security তে অবস্থিত:

টেস্টকি
যেসব প্যাকেজে অন্য কোনো কী নির্দিষ্ট করা থাকে না, সেগুলোর জন্য সাধারণ ডিফল্ট কী।
প্ল্যাটফর্ম
মূল প্ল্যাটফর্মের অংশ এমন প্যাকেজগুলির জন্য টেস্ট কী।
শেয়ার করা
হোম/কন্টাক্টস প্রক্রিয়ায় শেয়ার করা জিনিসগুলির জন্য টেস্ট কী।
মিডিয়া
মিডিয়া/ডাউনলোড সিস্টেমের অংশ এমন প্যাকেজগুলোর জন্য টেস্ট কী।
নেটওয়ার্কস্ট্যাক
নেটওয়ার্কিং সিস্টেমের অংশ এমন প্যাকেজগুলির জন্য টেস্ট কী। নেটওয়ার্কস্ট্যাক কী মডিউলার সিস্টেম কম্পোনেন্ট হিসেবে ডিজাইন করা বাইনারিগুলিতে স্বাক্ষর করতে ব্যবহৃত হয়। যদি আপনার মডিউল আপডেটগুলি আলাদাভাবে বিল্ড করা হয় এবং আপনার ডিভাইস ইমেজে প্রি-বিল্ট হিসেবে একত্রিত করা হয়, তাহলে অ্যান্ড্রয়েড সোর্স ট্রিতে আপনার নেটওয়ার্কস্ট্যাক কী তৈরি করার প্রয়োজন নাও হতে পারে।

স্বতন্ত্র প্যাকেজগুলো তাদের 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-গুলোকে প্রি-সাইনড হিসেবে গণ্য করবে।

কাল্পনিক টারডিস প্রোডাক্টটির জন্য আপনার ছয়টি পাসওয়ার্ড-সুরক্ষিত কী প্রয়োজন: 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 স্বাক্ষর কী প্রতিস্থাপন

অ্যান্ড্রয়েড ১০ নিম্ন-স্তরের সিস্টেম মডিউল ইনস্টল করার জন্য APEX ফাইল ফরম্যাট চালু করেছে। APEX সাইনিং- এ যেমন ব্যাখ্যা করা হয়েছে, প্রতিটি APEX ফাইল দুটি কী (key) দিয়ে সাইন করা হয়: একটি APEX-এর ভেতরের মিনি ফাইল সিস্টেম ইমেজের জন্য এবং অন্যটি সম্পূর্ণ APEX-টির জন্য।

রিলিজের জন্য সাইন করার সময়, একটি APEX ফাইলের দুটি সাইনিং কী রিলিজ কী দ্বারা প্রতিস্থাপিত হয়। ফাইল সিস্টেম পেলোড কী --extra_apex_payload ফ্ল্যাগ দিয়ে এবং সম্পূর্ণ APEX ফাইল সাইনিং কী --extra_apks ফ্ল্যাগ দিয়ে নির্দিষ্ট করা হয়।

tardis প্রোডাক্টের জন্য, ধরে নিন যে 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 নির্দিষ্ট রিলিজ কী-গুলো (APEX ফাইলের জন্য runtime_apex_container এবং ফাইল ইমেজ পেলোডের জন্য 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 সহ রান করুন।

ম্যানুয়ালি কী তৈরি করুন

অ্যান্ড্রয়েড পাবলিক এক্সপোনেন্ট ৩ সহ ২০৪৮-বিট আরএসএ কী ব্যবহার করে। আপনি 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 টার্মিনাল হয়, তাহলে প্রোগ্রামটি হ্যাং হয়ে গেছে বলে মনে হবে, যদিও এটি আসলে আপনার পাসওয়ার্ড দেওয়ার জন্য অপেক্ষা করতে থাকে। অন্যান্য স্থান থেকে পাসওয়ার্ড পড়ার জন্য `-passout` আর্গুমেন্টের জন্য অন্য মানও ব্যবহার করা যেতে পারে; বিস্তারিত জানতে, openssl ডকুমেন্টেশন দেখুন।

temp.pem অন্তর্বর্তী ফাইলটিতে কোনো ধরনের পাসওয়ার্ড সুরক্ষা ছাড়াই প্রাইভেট কী থাকে, তাই রিলিজ কী তৈরি করার সময় এটি সতর্কতার সাথে নিষ্পত্তি করুন। বিশেষ করে, GNUshred ইউটিলিটিটি নেটওয়ার্ক বা জার্নালড ফাইলসিস্টেমে কার্যকর নাও হতে পারে। কী তৈরি করার সময়, অন্তর্বর্তী ফাইলগুলো যাতে অসাবধানতাবশত উন্মুক্ত না হয়ে যায়, তা নিশ্চিত করতে আপনি র‍্যাম ডিস্কে অবস্থিত একটি ওয়ার্কিং ডিরেক্টরি (যেমন একটি tmpfs পার্টিশন) ব্যবহার করতে পারেন।

ইমেজ ফাইল তৈরি করুন

যখন আপনার কাছে signed-target_files.zip থাকবে, তখন আপনাকে ইমেজটি তৈরি করতে হবে যাতে আপনি এটি একটি ডিভাইসে রাখতে পারেন। টার্গেট ফাইলগুলো থেকে সাইনড ইমেজ তৈরি করতে, অ্যান্ড্রয়েড ট্রি-এর রুট থেকে নিম্নলিখিত কমান্ডটি চালান:

img_from_target_files signed-target_files.zip signed-img.zip
ফলস্বরূপ তৈরি হওয়া ফাইল, signed-img.zip ,-টিতে সমস্ত .img ফাইল রয়েছে। কোনো ডিভাইসে একটি ইমেজ লোড করতে, নিম্নোক্তভাবে fastboot ব্যবহার করুন:
fastboot update signed-img.zip