ডায়নামিক সিস্টেম আপডেট

ডাইনামিক সিস্টেম আপডেট (ডিএসইউ) আপনাকে এমন একটি অ্যান্ড্রয়েড সিস্টেম ইমেজ তৈরি করার সুযোগ দেয়, যা ব্যবহারকারীরা ইন্টারনেট থেকে ডাউনলোড করে বর্তমান সিস্টেম ইমেজটি নষ্ট হওয়ার ঝুঁকি ছাড়াই পরীক্ষা করে দেখতে পারেন। এই ডকুমেন্টটিতে ডিএসইউ সমর্থন করার পদ্ধতি বর্ণনা করা হয়েছে।

কার্নেলের প্রয়োজনীয়তা

কার্নেলের প্রয়োজনীয়তা জানতে 'ডাইনামিক পার্টিশন বাস্তবায়ন' দেখুন।

এছাড়াও, DSU অ্যান্ড্রয়েড সিস্টেম ইমেজ যাচাই করার জন্য ডিভাইস-ম্যাপার-ভেরিটি (dm-verity) কার্নেল ফিচারের উপর নির্ভর করে। তাই আপনাকে অবশ্যই নিম্নলিখিত কার্নেল কনফিগারেশনগুলো সক্রিয় করতে হবে:

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

বিভাজনের প্রয়োজনীয়তা

অ্যান্ড্রয়েড ১১ থেকে, DSU-এর জন্য /data পার্টিশনে F2FS বা ext4 ফাইল সিস্টেম ব্যবহার করা আবশ্যক। F2FS উন্নততর পারফরম্যান্স দেয় এবং এটিই সুপারিশ করা হয়, কিন্তু পার্থক্যটি নগণ্য হওয়া উচিত।

পিক্সেল ডিভাইসে ডাইনামিক সিস্টেম আপডেট হতে কতক্ষণ সময় লাগে তার কিছু উদাহরণ নিচে দেওয়া হলো:

  • F2FS ব্যবহার করে:
    • 109s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরণ: F2FS: এনক্রিপশন=aes-256-xts:aes-256-cts
    • ১০৪ সেকেন্ড, ৮ জিবি ব্যবহারকারী, ৮৬৭ মেগাবাইট সিস্টেম, ফাইল সিস্টেমের ধরণ: এফ২এফএস: এনক্রিপশন=আইস
  • ext4 ব্যবহার করে:
    • ১৩৫ সেকেন্ড, ৮ জিবি ব্যবহারকারী, ৮৬৭ মেগাবাইট সিস্টেম, ফাইল সিস্টেমের ধরণ: ext4: এনক্রিপশন=aes-256-xts:aes-256-cts

আপনার প্ল্যাটফর্মে যদি অনেক বেশি সময় লাগে, তাহলে আপনি দেখে নিতে পারেন যে মাউন্ট ফ্ল্যাগে “সিঙ্ক” রাইট ফাংশনের জন্য কোনো ফ্ল্যাগ আছে কিনা, অথবা আরও ভালো পারফরম্যান্সের জন্য আপনি স্পষ্টভাবে একটি “অ্যাসিঙ্ক” ফ্ল্যাগ উল্লেখ করে দিতে পারেন।

ইনস্টল করা ইমেজ সম্পর্কিত ডেটা সংরক্ষণের জন্য metadata পার্টিশন (১৬ এমবি বা তার বেশি) প্রয়োজন। প্রথম পর্যায়ের মাউন্টের সময় এটি অবশ্যই মাউন্ট করতে হবে।

userdata পার্টিশনে অবশ্যই F2FS অথবা ext4 ফাইল সিস্টেম ব্যবহার করতে হবে। F2FS ব্যবহার করার সময়, অ্যান্ড্রয়েড কমন কার্নেলে উপলব্ধ F2FS সম্পর্কিত সমস্ত প্যাচ অন্তর্ভুক্ত করুন।

DSU কার্নেল/কমন ৪.৯ দিয়ে তৈরি ও পরীক্ষা করা হয়েছে। এই ফিচারটির জন্য কার্নেল ৪.৯ বা তার উচ্চতর সংস্করণ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।

বিক্রেতার HAL আচরণ

উইভার এইচএএল

উইভার এইচএএল (Weaver HAL) ব্যবহারকারীর কী (user key) সংরক্ষণের জন্য একটি নির্দিষ্ট সংখ্যক স্লট প্রদান করে। ডিএসইউ (DSU) দুটি অতিরিক্ত কী স্লট ব্যবহার করে। যদি কোনো ওইএম (OEM)-এর উইভার এইচএএল থাকে, তবে তাতে একটি জেনেরিক সিস্টেম ইমেজ (GSI) এবং একটি হোস্ট ইমেজের জন্য পর্যাপ্ত স্লট থাকা প্রয়োজন।

দ্বাররক্ষক এইচএএল

গেটকিপার HAL-কে বড় USER_ID মান সমর্থন করতে হবে, কারণ GSI, HAL-এ UID-গুলোকে +1000000 দ্বারা অফসেট করে।

বুট যাচাই করুন

আপনি যদি ভেরিফাইড বুট নিষ্ক্রিয় না করে ডেভেলপার জিএসআই ইমেজগুলোকে লকড (LOCKED) অবস্থায় বুট করা সমর্থন করতে চান, তাহলে device/<device_name>/device.mk ফাইলে নিম্নলিখিত লাইনটি যোগ করে ডেভেলপার জিএসআই কীগুলো অন্তর্ভুক্ত করুন:

$(call inherit-product, $(SRC_TARGET_DIR)/product/developer_gsi_keys.mk)

রোলব্যাক সুরক্ষা

DSU ব্যবহার করার সময়, ডাউনলোড করা অ্যান্ড্রয়েড সিস্টেম ইমেজটি ডিভাইসের বর্তমান সিস্টেম ইমেজের চেয়ে নতুন হতে হবে। এটি করার জন্য, উভয় সিস্টেম ইমেজের অ্যান্ড্রয়েড ভেরিফাইড বুট (AVB) প্রপার্টি ডেসক্রিপ্টরে থাকা সিকিউরিটি প্যাচ লেভেল তুলনা করা হয়: Prop: com.android.build.system.security_patch -> '2019-04-05'

যেসব ডিভাইস AVB ব্যবহার করে না, সেগুলোর ক্ষেত্রে বুটলোডারের সাথে কার্নেল cmdline বা bootconfig-এ বর্তমান সিস্টেম ইমেজের সিকিউরিটি প্যাচ লেভেলটি যোগ করুন: androidboot.system.security_patch=2019-04-05

হার্ডওয়্যারের প্রয়োজনীয়তা

যখন আপনি একটি DSU ইনস্ট্যান্স চালু করেন, তখন দুটি অস্থায়ী ফাইল বরাদ্দ করা হয়:

  • GSI.img (১~১.৫ জিবি) সংরক্ষণের জন্য একটি লজিক্যাল পার্টিশন।
  • GSI চালানোর জন্য স্যান্ডবক্স হিসেবে একটি ৮ জিবি খালি /data পার্টিশন।

একটি DSU ইনস্ট্যান্স চালু করার আগে আমরা কমপক্ষে ১০ জিবি খালি জায়গা সংরক্ষণ করার পরামর্শ দিই। DSU এসডি কার্ড থেকেও জায়গা বরাদ্দ সমর্থন করে। যখন একটি এসডি কার্ড উপস্থিত থাকে, তখন জায়গা বরাদ্দের ক্ষেত্রে এটির সর্বোচ্চ অগ্রাধিকার থাকে। কম ক্ষমতার ডিভাইসগুলির জন্য এসডি কার্ড সমর্থন অত্যন্ত গুরুত্বপূর্ণ, যেগুলিতে পর্যাপ্ত অভ্যন্তরীণ স্টোরেজ নাও থাকতে পারে। যখন একটি এসডি কার্ড উপস্থিত থাকে, তখন নিশ্চিত করুন যে এটি অ্যাডপ্টেড নয়। DSU অ্যাডপ্টেড এসডি কার্ড সমর্থন করে না।

উপলব্ধ ফ্রন্টএন্ড

আপনি adb , একটি OEM অ্যাপ, অথবা ওয়ান-ক্লিক DSU লোডার (অ্যান্ড্রয়েড ১১ বা তার পরবর্তী সংস্করণে) ব্যবহার করে DSU চালু করতে পারেন।

adb ব্যবহার করে DSU চালু করুন

adb ব্যবহার করে DSU চালু করতে, এই কমান্ডগুলো লিখুন:

$ simg2img out/target/product/.../system.img system.raw
$ gzip -c system.raw > system.raw.gz
$ adb push system.raw.gz /storage/emulated/0/Download
$ adb shell am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity  \
-a android.os.image.action.START_INSTALL    \
-d file:///storage/emulated/0/Download/system.raw.gz  \
--el KEY_SYSTEM_SIZE $(du -b system.raw|cut -f1)  \
--el KEY_USERDATA_SIZE 8589934592

একটি অ্যাপ ব্যবহার করে DSU চালু করুন

DSU-তে প্রবেশের প্রধান পথ হলো android.os.image.DynamicSystemClient.java API:

public class DynamicSystemClient {


...
...

     /**
     * Start installing DynamicSystem from URL with default userdata size.
     *
     * @param systemUrl A network URL or a file URL to system image.
     * @param systemSize size of system image.
     */
    public void start(String systemUrl, long systemSize) {
        start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
    }

আপনাকে অবশ্যই এই অ্যাপটি ডিভাইসে বান্ডল/প্রি-ইনস্টল করতে হবে। যেহেতু DynamicSystemClient একটি সিস্টেম এপিআই, তাই আপনি সাধারণ এসডিকে এপিআই দিয়ে অ্যাপটি বিল্ড করতে পারবেন না এবং গুগল প্লে-তে এটি প্রকাশও করতে পারবেন না। এই অ্যাপটির উদ্দেশ্য হলো:

  1. ভেন্ডর-নির্ধারিত স্কিম অনুযায়ী ছবির তালিকা এবং সংশ্লিষ্ট ইউআরএলটি নিয়ে আসুন।
  2. তালিকার ছবিগুলো ডিভাইসের সাথে মিলিয়ে ব্যবহারকারীকে বেছে নেওয়ার জন্য সামঞ্জস্যপূর্ণ ছবিগুলো দেখান।
  3. DynamicSystemClient.start কে এইভাবে কল করুন:

    DynamicSystemClient aot = new DynamicSystemClient(...)
       aot.start(
            ...URL of the selected image...,
            ...uncompressed size of the selected image...);
    
    

ইউআরএলটি একটি জিপ করা, নন-স্পার্স সিস্টেম ইমেজ ফাইলকে নির্দেশ করে, যা আপনি নিম্নলিখিত কমান্ডগুলো ব্যবহার করে তৈরি করতে পারেন:

$ simg2img ${OUT}/system.img ${OUT}/system.raw
$ gzip ${OUT}/system.raw
$ ls ${OUT}/system.raw.gz

ফাইলের নামটি এই বিন্যাস অনুসরণ করবে:

<android version>.<lunch name>.<user defined title>.raw.gz

উদাহরণ:

  • o.aosp_taimen-userdebug.2018dev.raw.gz
  • p.aosp_taimen-userdebug.2018dev.raw.gz

এক-ক্লিক ডিএসইউ লোডার

অ্যান্ড্রয়েড ১১-এ ওয়ান-ক্লিক ডিএসইউ লোডার চালু করা হয়েছে, যা ডেভেলপার সেটিংসের একটি ফ্রন্টএন্ড।

ডিএসইউ লোডার চালু করা হচ্ছে

চিত্র ১. ডিএসইউ লোডার চালু করা

যখন ডেভেলপার DSU লোডার বোতামে ক্লিক করেন, তখন এটি ওয়েব থেকে একটি পূর্ব-কনফিগার করা DSU JSON ডেসক্রিপ্টর নিয়ে আসে এবং ফ্লোটিং মেনুতে সমস্ত প্রযোজ্য ইমেজ প্রদর্শন করে। DSU ইনস্টলেশন শুরু করতে একটি ইমেজ নির্বাচন করুন, এবং এর অগ্রগতি নোটিফিকেশন বারে দেখানো হবে।

DSU ইমেজ ইনস্টলেশনের অগ্রগতি

চিত্র ২. ডিএসইউ ইমেজ ইনস্টলেশনের অগ্রগতি

ডিফল্টরূপে, DSU লোডার একটি JSON ডেসক্রিপ্টর লোড করে, যাতে GSI ইমেজগুলো থাকে। নিম্নলিখিত বিভাগগুলিতে দেখানো হয়েছে কীভাবে OEM-স্বাক্ষরিত DSU প্যাকেজ তৈরি করতে হয় এবং DSU লোডার থেকে সেগুলি লোড করতে হয়।

বৈশিষ্ট্য পতাকা

DSU ফিচারটি settings_dynamic_android ফিচার ফ্ল্যাগের অধীনে রয়েছে। DSU ব্যবহার করার আগে, নিশ্চিত করুন যে সংশ্লিষ্ট ফিচার ফ্ল্যাগটি সক্রিয় করা আছে।

ফিচার ফ্ল্যাগটি সক্রিয় করা হচ্ছে।

চিত্র ৩. ফিচার ফ্ল্যাগ সক্রিয় করা

ইউজার বিল্ড চালিত ডিভাইসে ফিচার ফ্ল্যাগ UI অনুপলব্ধ থাকতে পারে। এই ক্ষেত্রে, এর পরিবর্তে adb কমান্ডটি ব্যবহার করুন:

$ adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1

GCE-তে ভেন্ডর হোস্ট সিস্টেম ইমেজ (ঐচ্ছিক)

সিস্টেম ইমেজ সংরক্ষণের সম্ভাব্য স্থানগুলোর মধ্যে একটি হলো গুগল কম্পিউট ইঞ্জিন (GCE) বাকেট। রিলিজ অ্যাডমিনিস্ট্রেটর প্রকাশিত সিস্টেম ইমেজটি যোগ/মুছে ফেলা/পরিবর্তন করার জন্য GCP স্টোরেজ কনসোল ব্যবহার করেন।

ছবিগুলো অবশ্যই সর্বজনীন প্রবেশাধিকারযোগ্য হতে হবে, যেমনটি এখানে দেখানো হয়েছে:

GCE-তে জনসাধারণের প্রবেশাধিকার

চিত্র ৪। জিসিই-তে জনসাধারণের প্রবেশাধিকার

কোনো আইটেমকে সর্বজনীন করার পদ্ধতি গুগল ক্লাউড ডকুমেন্টেশনে পাওয়া যাবে।

জিপ ফাইলে একাধিক পার্টিশনযুক্ত ডিএসইউ

অ্যান্ড্রয়েড ১১ থেকে, DSU-তে একাধিক পার্টিশন থাকতে পারে। উদাহরণস্বরূপ, এতে system.img এর পাশাপাশি একটি product.img ও থাকতে পারে। যখন ডিভাইসটি বুট হয়, তখন প্রথম ধাপের init ইনস্টল করা DSU পার্টিশনগুলো শনাক্ত করে এবং ডিভাইসের পার্টিশনটিকে সাময়িকভাবে প্রতিস্থাপন করে, যখন ইনস্টল করা DSU-টি সক্রিয় থাকে। DSU প্যাকেজে এমন একটি পার্টিশন থাকতে পারে, যার অনুরূপ কোনো পার্টিশন ডিভাইসে নেই।

একাধিক পার্টিশন সহ DSU প্রক্রিয়া

চিত্র ৫. একাধিক পার্টিশন সহ ডিএসইউ প্রক্রিয়া

OEM-স্বাক্ষরিত DSU

ডিভাইসে চলমান সমস্ত ইমেজ যেন ডিভাইস প্রস্তুতকারক দ্বারা অনুমোদিত হয়, তা নিশ্চিত করার জন্য একটি DSU প্যাকেজের মধ্যে থাকা সমস্ত ইমেজ অবশ্যই স্বাক্ষরিত হতে হবে। উদাহরণস্বরূপ, ধরে নিন একটি DSU প্যাকেজ আছে যাতে নীচের মতো দুটি পার্টিশন ইমেজ রয়েছে:

dsu.zip {
    - system.img
    - product.img
}

ZIP ফাইলে রাখার আগে system.img এবং product.img উভয়কেই OEM কী দ্বারা সাইন করতে হবে। প্রচলিত পদ্ধতি হলো একটি অ্যাসিমেট্রিক অ্যালগরিদম, যেমন RSA, ব্যবহার করা, যেখানে প্যাকেজটি সাইন করার জন্য সিক্রেট কী এবং এটি ভেরিফাই করার জন্য পাবলিক কী ব্যবহৃত হয়। প্রথম ধাপের র‍্যামডিস্কে অবশ্যই পেয়ারিং পাবলিক কী অন্তর্ভুক্ত থাকতে হবে, যেমন, /avb/*.avbpubkey । যদি ডিভাইসটি ইতিমধ্যে AVB গ্রহণ করে থাকে, তবে বিদ্যমান সাইনিং পদ্ধতিই যথেষ্ট হবে। নিম্নলিখিত বিভাগগুলিতে সাইনিং প্রক্রিয়াটি ব্যাখ্যা করা হয়েছে এবং DSU প্যাকেজে ইমেজগুলি ভেরিফাই করার জন্য ব্যবহৃত AVB পাবকির অবস্থান তুলে ধরা হয়েছে।

DSU JSON বর্ণনাকারী

DSU JSON ডেসক্রিপ্টরটি DSU প্যাকেজগুলোর বর্ণনা দেয়। এটি দুটি প্রিমিটিভ সমর্থন করে। প্রথমত, include প্রিমিটিভটি অতিরিক্ত JSON ডেসক্রিপ্টর অন্তর্ভুক্ত করে অথবা DSU লোডারকে একটি নতুন অবস্থানে পুনঃনির্দেশিত করে। উদাহরণস্বরূপ:

{
    "include": ["https://.../gsi-release/gsi-src.json"]
}

দ্বিতীয়ত, রিলিজ করা DSU প্যাকেজগুলো বর্ণনা করার জন্য image প্রিমিটিভ ব্যবহার করা হয়। ইমেজ প্রিমিটিভের ভেতরে বেশ কয়েকটি অ্যাট্রিবিউট থাকে:

  • name এবং details অ্যাট্রিবিউটগুলো হলো স্ট্রিং, যা ব্যবহারকারীকে বেছে নেওয়ার জন্য ডায়ালগ বক্সে দেখানো হয়।

  • cpu_api , vndk , এবং os_version অ্যাট্রিবিউটগুলো সামঞ্জস্যতা যাচাইয়ের জন্য ব্যবহৃত হয়, যা পরবর্তী বিভাগে বর্ণনা করা হয়েছে।

  • ঐচ্ছিক pubkey অ্যাট্রিবিউটটি সেই পাবলিক কী-এর বর্ণনা দেয়, যা DSU প্যাকেজটি সাইন করার জন্য ব্যবহৃত সিক্রেট কী-এর সাথে যুক্ত থাকে। যখন এটি নির্দিষ্ট করা হয়, তখন DSU সার্ভিসটি যাচাই করতে পারে যে ডিভাইসটির কাছে DSU প্যাকেজটি ভেরিফাই করার জন্য ব্যবহৃত কী-টি আছে কি না। এর ফলে একটি অচেনা DSU প্যাকেজ ইনস্টল হওয়া এড়ানো যায়; যেমন, OEM-B দ্বারা তৈরি কোনো ডিভাইসে OEM-A দ্বারা সাইন করা একটি DSU ইনস্টল করা।

  • ঐচ্ছিক tos অ্যাট্রিবিউটটি একটি টেক্সট ফাইলকে নির্দেশ করে, যেখানে সংশ্লিষ্ট DSU প্যাকেজের পরিষেবার শর্তাবলী বর্ণনা করা থাকে। যখন কোনো ডেভেলপার 'terms of service' অ্যাট্রিবিউটটি নির্দিষ্ট করে একটি DSU প্যাকেজ নির্বাচন করেন, তখন চিত্র ৬-এ দেখানো ডায়ালগ বক্সটি খোলে এবং DSU প্যাকেজটি ইনস্টল করার আগে ডেভেলপারকে পরিষেবার শর্তাবলী গ্রহণ করতে বলে।

    পরিষেবার শর্তাবলী ডায়ালগ বক্স

    চিত্র ৬. পরিষেবার শর্তাবলী ডায়ালগ বক্স

তথ্যসূত্র হিসেবে, এখানে GSI-এর জন্য একটি DSU JSON ডেসক্রিপ্টর দেওয়া হলো:

{
   "images":[
      {
         "name":"GSI+GMS x86",
         "os_version":"10",
         "cpu_abi": "x86",
         "details":"exp-QP1A.190711.020.C4-5928301",
         "vndk":[
            27,
            28,
            29
         ],
         "pubkey":"",
         "tos": "https://dl.google.com/developers/android/gsi/gsi-tos.txt",
         "uri":"https://.../gsi/gsi_gms_x86-exp-QP1A.190711.020.C4-5928301.zip"
      },
      {
         "name":"GSI+GMS ARM64",
         "os_version":"10",
         "cpu_abi": "arm64-v8a",
         "details":"exp-QP1A.190711.020.C4-5928301",
         "vndk":[
            27,
            28,
            29
         ],
         "pubkey":"",
         "tos": "https://dl.google.com/developers/android/gsi/gsi-tos.txt",
         "uri":"https://.../gsi/gsi_gms_arm64-exp-QP1A.190711.020.C4-5928301.zip"
      },
      {
         "name":"GSI ARM64",
         "os_version":"10",
         "cpu_abi": "arm64-v8a",
         "details":"exp-QP1A.190711.020.C4-5928301",
         "vndk":[
            27,
            28,
            29
         ],
         "pubkey":"",
         "uri":"https://.../gsi/aosp_arm64-exp-QP1A.190711.020.C4-5928301.zip"
      },
      {
         "name":"GSI x86_64",
         "os_version":"10",
         "cpu_abi": "x86_64",
         "details":"exp-QP1A.190711.020.C4-5928301",
         "vndk":[
            27,
            28,
            29
         ],
         "pubkey":"",
         "uri":"https://.../gsi/aosp_x86_64-exp-QP1A.190711.020.C4-5928301.zip"
      }
   ]
}

সামঞ্জস্য ব্যবস্থাপনা

একটি DSU প্যাকেজ এবং স্থানীয় ডিভাইসের মধ্যে সামঞ্জস্য নির্দিষ্ট করতে বেশ কিছু অ্যাট্রিবিউট ব্যবহার করা হয়:

  • cpu_api হলো একটি স্ট্রিং যা ডিভাইসের আর্কিটেকচার বর্ণনা করে। এই অ্যাট্রিবিউটটি বাধ্যতামূলক এবং এটিকে ro.product.cpu.abi সিস্টেম প্রপার্টির সাথে তুলনা করা হয়। এদের মান অবশ্যই হুবহু মিলতে হবে।

  • os_version হলো একটি ঐচ্ছিক পূর্ণসংখ্যা যা একটি অ্যান্ড্রয়েড রিলিজ নির্দিষ্ট করে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড ১০-এর জন্য os_version হলো 10 এবং অ্যান্ড্রয়েড ১১-এর জন্য os_version হলো 11 যখন এই অ্যাট্রিবিউটটি নির্দিষ্ট করা হয়, তখন এটি অবশ্যই ro.system.build.version.release সিস্টেম প্রপার্টির সমান বা তার চেয়ে বড় হতে হবে। এই চেকটি ব্যবহার করা হয় অ্যান্ড্রয়েড ১১ ভেন্ডর ডিভাইসে অ্যান্ড্রয়েড ১০ GSI ইমেজ বুট করা প্রতিরোধ করার জন্য, যা বর্তমানে সমর্থিত নয়। অ্যান্ড্রয়েড ১০ ডিভাইসে অ্যান্ড্রয়েড ১১ GSI ইমেজ বুট করার অনুমতি আছে।

  • vndk হলো একটি ঐচ্ছিক অ্যারে যা DSU প্যাকেজে অন্তর্ভুক্ত সমস্ত VNDK-কে নির্দিষ্ট করে। যখন এটি নির্দিষ্ট করা হয়, তখন DSU লোডার পরীক্ষা করে দেখে যে ro.vndk.version সিস্টেম প্রপার্টি থেকে নেওয়া নম্বরটি অন্তর্ভুক্ত আছে কি না।

নিরাপত্তার জন্য DSU কীগুলি বাতিল করুন

অত্যন্ত বিরল ক্ষেত্রে যখন DSU ইমেজগুলিতে স্বাক্ষর করতে ব্যবহৃত RSA কী পেয়ারটি অরক্ষিত হয়ে পড়ে, তখন অরক্ষিত কী-টি অপসারণ করার জন্য যত দ্রুত সম্ভব র‍্যামডিস্ক আপডেট করা উচিত। বুট পার্টিশন আপডেট করার পাশাপাশি, আপনি একটি HTTPS URL থেকে DSU কী বাতিলকরণ তালিকা (কী ব্ল্যাকলিস্ট) ব্যবহার করে অরক্ষিত কী-গুলিকে ব্লক করতে পারেন।

DSU কী বাতিলকরণ তালিকায় বাতিলকৃত AVB পাবলিক কী-গুলোর একটি তালিকা থাকে। DSU ইনস্টলেশনের সময়, DSU ইমেজগুলোর ভেতরের পাবলিক কী-গুলো এই বাতিলকরণ তালিকার সাথে মিলিয়ে যাচাই করা হয়। যদি ইমেজগুলোতে কোনো বাতিলকৃত পাবলিক কী পাওয়া যায়, তাহলে DSU ইনস্টলেশন প্রক্রিয়াটি থেমে যায়।

নিরাপত্তার শক্তি নিশ্চিত করার জন্য মূল রিভোকেশন লিস্ট ইউআরএলটি অবশ্যই একটি HTTPS ইউআরএল হতে হবে এবং এটি একটি রিসোর্স স্ট্রিং-এ নির্দিষ্ট করা থাকে:

frameworks/base/packages/DynamicSystemInstallationService/res/values/strings.xml@key_revocation_list_url

স্ট্রিংটির ভ্যালু হলো https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json , যা গুগল কর্তৃক প্রকাশিত GSI কী-গুলোর একটি রিভোকেশন লিস্ট। এই রিসোর্স স্ট্রিংটি ওভারলে এবং কাস্টমাইজ করা যায়, যাতে DSU ফিচারটি গ্রহণকারী OEM-রা তাদের নিজস্ব কী ব্ল্যাকলিস্ট সরবরাহ ও রক্ষণাবেক্ষণ করতে পারে। এর মাধ্যমে OEM-রা ডিভাইসের র‍্যামডিস্ক ইমেজ আপডেট না করেই নির্দিষ্ট কিছু পাবলিক কী ব্লক করার সুযোগ পায়।

বাতিলকরণ তালিকার বিন্যাসটি হলো:

{
   "entries":[
      {
         "public_key":"bf14e439d1acf231095c4109f94f00fc473148e6",
         "status":"REVOKED",
         "reason":"Key revocation test key"
      },
      {
         "public_key":"d199b2f29f3dc224cca778a7544ea89470cbef46",
         "status":"REVOKED",
         "reason":"Key revocation test key"
      }
   ]
}
  • public_key হলো বাতিলকৃত কী-টির SHA-1 ডাইজেস্ট, যা AVB pubkey তৈরি করার অংশে বর্ণিত ফরম্যাটে থাকে।
  • status কী-টির বাতিলকরণ অবস্থা নির্দেশ করে। বর্তমানে, শুধুমাত্র REVOKED মানটিই সমর্থিত।
  • reason হলো একটি ঐচ্ছিক স্ট্রিং, যা বাতিলের কারণ বর্ণনা করে।

ডিএসইউ পদ্ধতি

এই অংশে বিভিন্ন DSU কনফিগারেশন পদ্ধতি বর্ণনা করা হয়েছে।

একটি নতুন কী পেয়ার তৈরি করুন

openssl কমান্ড ব্যবহার করে .pem ফরম্যাটে (উদাহরণস্বরূপ, ২০৪৮ বিট আকারের) একটি RSA প্রাইভেট/পাবলিক কী পেয়ার তৈরি করুন:

$ openssl genrsa -out oem_cert_pri.pem 2048
$ openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem

প্রাইভেট কী অ্যাক্সেসযোগ্য নাও হতে পারে এবং এটি শুধুমাত্র একটি হার্ডওয়্যার সিকিউরিটি মডিউলে (HSM) রাখা থাকে। এই ক্ষেত্রে, কী জেনারেশনের পরে একটি x509 পাবলিক কী সার্টিফিকেট উপলব্ধ থাকতে পারে। একটি x509 সার্টিফিকেট থেকে AVB পাবলিক কী জেনারেট করার নির্দেশাবলীর জন্য "র‍্যামডিস্কে পেয়ারিং পাবকি যোগ করা" বিভাগটি দেখুন।

একটি x509 সার্টিফিকেটকে PEM ফরম্যাটে রূপান্তর করতে:

$ openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem

সার্টিফিকেটটি যদি আগে থেকেই একটি PEM ফাইল হয়, তাহলে এই ধাপটি এড়িয়ে যান।

পেয়ারিং পাবকিটি র‍্যামডিস্কে যোগ করুন।

স্বাক্ষরিত DSU প্যাকেজটি যাচাই করার জন্য oem_cert.avbpubkey ফাইলটি /avb/*.avbpubkey অধীনে রাখতে হবে। প্রথমে, PEM ফরম্যাটে থাকা পাবলিক কী-টিকে AVB পাবলিক কী ফরম্যাটে রূপান্তর করুন:

$ avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey

এরপর নিম্নলিখিত ধাপগুলো অনুসরণ করে প্রথম পর্যায়ের র‍্যামডিস্কে পাবলিক কী-টি অন্তর্ভুক্ত করুন।

  1. avbpubkey কপি করার জন্য একটি প্রি-বিল্ট মডিউল যোগ করুন। উদাহরণস্বরূপ, device/<company>/<board>/oem_cert.avbpubkey এবং device/<company>/<board>/avb/Android.mk ফাইল দুটি এই ধরনের কন্টেন্ট দিয়ে যোগ করুন:

    include $(CLEAR_VARS)
    
    LOCAL_MODULE := oem_cert.avbpubkey
    LOCAL_MODULE_CLASS := ETC
    LOCAL_SRC_FILES := $(LOCAL_MODULE)
    ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/first_stage_ramdisk/avb
    else
    LOCAL_MODULE_PATH := $(TARGET_RAMDISK_OUT)/avb
    endif
    
    include $(BUILD_PREBUILT)
    
  2. যোগ করা oem_cert.avbpubkey এর উপর droidcore টার্গেটকে নির্ভরশীল করুন:

    droidcore: oem_cert.avbpubkey
    

JSON ডেসক্রিপ্টরে AVB pubkey অ্যাট্রিবিউটটি তৈরি করুন।

oem_cert.avbpubkey ফাইলটি AVB পাবলিক কী বাইনারি ফরম্যাটে রয়েছে। JSON ডেসক্রিপ্টরে রাখার আগে এটিকে পাঠযোগ্য করার জন্য SHA-1 ব্যবহার করুন:

$ sha1sum oem_cert.avbpubkey | cut -f1 -d ' '
3e62f2be9d9d813ef5........866ac72a51fd20

এটিই হবে JSON ডেসক্রিপ্টরের pubkey অ্যাট্রিবিউটের বিষয়বস্তু।

   "images":[
      {
         ...
         "pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20",
         ...
      },

একটি ডিএসইউ প্যাকেজে স্বাক্ষর করুন

একটি DSU প্যাকেজ স্বাক্ষর করতে এই পদ্ধতিগুলোর মধ্যে একটি ব্যবহার করুন:

  • পদ্ধতি ১: মূল AVB সাইনিং প্রক্রিয়ার মাধ্যমে তৈরি আর্টিফ্যাক্টটি পুনরায় ব্যবহার করে একটি DSU প্যাকেজ তৈরি করুন। একটি বিকল্প পদ্ধতি হলো রিলিজ প্যাকেজ থেকে ইতিমধ্যে স্বাক্ষরিত ইমেজগুলো এক্সট্র্যাক্ট করা এবং সেই এক্সট্র্যাক্ট করা ইমেজগুলো ব্যবহার করে সরাসরি ZIP ফাইল তৈরি করা।

  • পদ্ধতি ২: প্রাইভেট কী উপলব্ধ থাকলে DSU পার্টিশন সাইন করতে নিম্নলিখিত কমান্ডগুলি ব্যবহার করুন। একটি DSU প্যাকেজের (ZIP ফাইল) মধ্যে থাকা প্রতিটি img আলাদাভাবে সাইন করা হয়:

    $ key_len=$(openssl rsa -in oem_cert_pri.pem -text | grep Private-Key | sed -e 's/.*(\(.*\) bit.*/\1/')
    $ for partition in system product; do
        avbtool add_hashtree_footer \
            --image ${OUT}/${partition}.img \
            --partition_name ${partition} \
            --algorithm SHA256_RSA${key_len} \
            --key oem_cert_pri.pem
    done
    

avbtool ব্যবহার করে add_hashtree_footer যোগ করার বিষয়ে আরও তথ্যের জন্য, Using avbtool দেখুন।

স্থানীয়ভাবে DSU প্যাকেজটি যাচাই করুন

এই কমান্ডগুলো ব্যবহার করে পেয়ারিং পাবলিক কী-এর সাথে সমস্ত লোকাল ইমেজ যাচাই করার পরামর্শ দেওয়া হচ্ছে:


for partition in system product; do
    avbtool verify_image --image ${OUT}/${partition}.img  --key oem_cert_pub.pem
done

প্রত্যাশিত আউটপুটটি দেখতে এইরকম:

Verifying image dsu/system.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/system.img
: Successfully verified sha1 hashtree of dsu/system.img for image of 898494464 bytes

Verifying image dsu/product.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/product.img
: Successfully verified sha1 hashtree of dsu/product.img for image of 905830400 bytes

একটি ডিএসইউ প্যাকেজ তৈরি করুন

নিম্নলিখিত উদাহরণটি একটি DSU প্যাকেজ তৈরি করে যাতে একটি system.img এবং একটি product.img থাকে:

dsu.zip {
    - system.img
    - product.img
}

উভয় ছবিতে স্বাক্ষর করার পর, ZIP ফাইলটি তৈরি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

$ mkdir -p dsu
$ cp ${OUT}/system.img dsu
$ cp ${OUT}/product.img dsu
$ cd dsu && zip ../dsu.zip *.img && cd -

ওয়ান-ক্লিক ডিএসইউ কাস্টমাইজ করুন

ডিফল্টরূপে, DSU লোডারটি GSI ইমেজের মেটাডেটাকে নির্দেশ করে, যা হলো https://...google.com/.../gsi-src.json

OEM-রা তাদের নিজস্ব JSON ডেসক্রিপ্টর নির্দেশ করে এমন persist.sys.fflag.override.settings_dynamic_system.list প্রপার্টিটি সংজ্ঞায়িত করার মাধ্যমে তালিকাটি ওভাররাইট করতে পারে। উদাহরণস্বরূপ, একটি OEM এইভাবে GSI এবং OEM-এর নিজস্ব ইমেজ সহ JSON মেটাডেটা সরবরাহ করতে পারে:

{
    "include": ["https://dl.google.com/.../gsi-src.JSON"]
    "images":[
      {
         "name":"OEM image",
         "os_version":"10",
         "cpu_abi": "arm64-v8a",
         "details":"...",
         "vndk":[
            27,
            28,
            29
         ],
         "spl":"...",
         "pubkey":"",
         "uri":"https://.../....zip"
      },

}

চিত্র ৭-এ দেখানো অনুযায়ী কোনো OEM-এর পক্ষে প্রকাশিত DSU মেটাডেটাকে শৃঙ্খলিত করা সম্ভব।

প্রকাশিত DSU মেটাডেটা শৃঙ্খলিত করা

চিত্র ৭. প্রকাশিত ডিএসইউ মেটাডেটার শৃঙ্খলীকরণ