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

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

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

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

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

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

পার্টিশনের প্রয়োজনীয়তা

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

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

  • F2FS ব্যবহার করে:
    • 109s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: F2FS: এনক্রিপশন=aes-256-xts:aes-256-cts
    • 104s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: F2FS: এনক্রিপশন = বরফ
  • ext4 ব্যবহার করে:
    • 135s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: ext4: encryption=aes-256-xts:aes-256-cts

যদি এটি আপনার প্ল্যাটফর্মে অনেক বেশি সময় নেয়, তাহলে আপনি মাউন্ট পতাকাটিতে এমন কোনো পতাকা আছে কিনা তা পরীক্ষা করতে চাইতে পারেন যা "সিঙ্ক" লিখতে বাধ্য করে, অথবা আপনি আরও ভাল পারফরম্যান্স পেতে স্পষ্টভাবে একটি "অ্যাসিঙ্ক" পতাকা নির্দিষ্ট করতে পারেন।

metadata পার্টিশন (16 MB বা বড়) ইনস্টল করা ছবি সম্পর্কিত ডেটা সংরক্ষণের জন্য প্রয়োজন। এটি প্রথম পর্যায়ে মাউন্ট করার সময় মাউন্ট করা আবশ্যক।

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

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

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

ওয়েভার HAL

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

দারোয়ান HAL

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

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

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

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

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

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

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

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

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

  • GSI.img (1~1.5 G) সংরক্ষণ করার জন্য একটি যৌক্তিক পার্টিশন
  • GSI চালানোর জন্য স্যান্ডবক্স হিসেবে একটি 8 GB খালি /data পার্টিশন

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

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

আপনি adb , একটি OEM অ্যাপ বা এক-ক্লিক DSU লোডার (Android 11 বা উচ্চতর) ব্যবহার করে 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 চালু করুন

ডিএসইউতে প্রধান এন্ট্রি পয়েন্ট হল 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 একটি সিস্টেম API, আপনি নিয়মিত SDK API দিয়ে অ্যাপটি তৈরি করতে পারবেন না এবং আপনি এটি Google Play-তে প্রকাশ করতে পারবেন না। এই অ্যাপটির উদ্দেশ্য হল:

  1. একটি বিক্রেতা-সংজ্ঞায়িত স্কিম সহ একটি চিত্র তালিকা এবং সংশ্লিষ্ট URL আনুন৷
  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 লোডার

অ্যান্ড্রয়েড 11 এক-ক্লিক ডিএসইউ লোডার প্রবর্তন করে, যা ডেভেলপার সেটিংসে একটি ফ্রন্টএন্ড।

DSU লোডার চালু করা হচ্ছে

চিত্র 1. DSU লোডার চালু করা হচ্ছে

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

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

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

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

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

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

বৈশিষ্ট্য পতাকা সক্রিয় করা হচ্ছে.

চিত্র 3. বৈশিষ্ট্য পতাকা সক্রিয় করা হচ্ছে

বৈশিষ্ট্য ফ্ল্যাগ UI একটি ব্যবহারকারী বিল্ড চলমান একটি ডিভাইসে অনুপলব্ধ হতে পারে. এই ক্ষেত্রে, পরিবর্তে adb কমান্ড ব্যবহার করুন:

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

জিসিই-তে বিক্রেতা হোস্ট সিস্টেমের ছবি (ঐচ্ছিক)

সিস্টেম ইমেজগুলির জন্য সম্ভাব্য স্টোরেজ অবস্থানগুলির মধ্যে একটি হল Google Compute Engine (GCE) বালতি। রিলিজ অ্যাডমিনিস্ট্রেটর রিলিজ করা সিস্টেম ইমেজ যোগ/মোছা/পরিবর্তন করতে GCP স্টোরেজ কনসোল ব্যবহার করে।

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

GCE-তে পাবলিক অ্যাক্সেস

চিত্র 4. GCE-তে পাবলিক অ্যাক্সেস

একটি আইটেম সর্বজনীন করার পদ্ধতি Google ক্লাউড ডকুমেন্টেশনে উপলব্ধ।

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

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

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

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

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

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

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

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

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

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

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

দ্বিতীয়ত, আদিম image প্রকাশিত ডিএসইউ প্যাকেজগুলি বর্ণনা করতে ব্যবহৃত হয়। আদিম চিত্রের ভিতরে বেশ কয়েকটি বৈশিষ্ট্য রয়েছে:

  • name এবং details বৈশিষ্ট্যগুলি হল স্ট্রিং যা ব্যবহারকারীর নির্বাচন করার জন্য ডায়ালগে দেখানো হয়।

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

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

  • ঐচ্ছিক tos বৈশিষ্ট্য একটি পাঠ্য ফাইলের দিকে নির্দেশ করে যা সংশ্লিষ্ট DSU প্যাকেজের পরিষেবার শর্তাবলী বর্ণনা করে। যখন একজন বিকাশকারী নির্দিষ্ট পরিষেবার শর্তাবলী সহ একটি DSU প্যাকেজ নির্বাচন করেন, চিত্র 6-এ দেখানো ডায়ালগ বক্সটি খোলে, DSU প্যাকেজ ইনস্টল করার আগে বিকাশকারীকে পরিষেবার শর্তাবলী মেনে নিতে বলে।

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

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

রেফারেন্সের জন্য, এখানে 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 হল একটি ঐচ্ছিক পূর্ণসংখ্যা যা একটি Android রিলিজ নির্দিষ্ট করে। উদাহরণস্বরূপ, Android 10-এর জন্য, os_version হল 10 এবং Android 11-এর জন্য, os_version হল 11 । যখন এই বৈশিষ্ট্যটি নির্দিষ্ট করা হয়, তখন এটি অবশ্যই ro.system.build.version.release সিস্টেম সম্পত্তির সমান বা তার চেয়ে বেশি হতে হবে৷ এই চেকটি একটি Android 11 বিক্রেতা ডিভাইসে একটি Android 10 GSI ইমেজ বুট করা প্রতিরোধ করতে ব্যবহৃত হয়, যা বর্তমানে সমর্থিত নয়। একটি Android 10 ডিভাইসে একটি Android 11 GSI ইমেজ বুট করার অনুমতি দেওয়া হয়েছে।

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

নিরাপত্তার জন্য DSU কী প্রত্যাহার করুন

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

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

নিরাপত্তা শক্তি নিশ্চিত করতে মূল প্রত্যাহার তালিকা URL একটি HTTPS URL হওয়া উচিত এবং একটি সংস্থান স্ট্রিং-এ নির্দিষ্ট করা হয়েছে:

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

স্ট্রিংটির মান হল https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json , যা Google-এ প্রকাশিত GSI কীগুলির জন্য একটি প্রত্যাহার তালিকা৷ এই রিসোর্স স্ট্রিংটি ওভারলেড এবং কাস্টমাইজ করা যেতে পারে, যাতে OEM যারা DSU বৈশিষ্ট্য গ্রহণ করে তাদের নিজস্ব কী কালো তালিকা প্রদান এবং বজায় রাখতে পারে। এটি ডিভাইসের রামডিস্ক ইমেজ আপডেট না করেই নির্দিষ্ট পাবলিক কী ব্লক করার জন্য 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 পাবকি তৈরি করা বিভাগে বর্ণিত হয়েছে৷
  • status কীটির প্রত্যাহার স্থিতি নির্দেশ করে। বর্তমানে, একমাত্র সমর্থিত মানটি REVOKED
  • reason হল একটি ঐচ্ছিক স্ট্রিং যা প্রত্যাহার করার কারণ বর্ণনা করে।

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

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

একটি নতুন কী জোড়া তৈরি করুন

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

$ 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. droidcore টার্গেট যোগ করা oem_cert.avbpubkey এর উপর নির্ভরশীল করুন:

    droidcore: oem_cert.avbpubkey
    

JSON বর্ণনাকারীতে AVB পাবকি অ্যাট্রিবিউট তৈরি করুন

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

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

এটি JSON বর্ণনাকারীর pubkey বৈশিষ্ট্যের বিষয়বস্তু হবে।

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

একটি DSU প্যাকেজ সাইন ইন করুন

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

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

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

    $ 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 যোগ করার বিষয়ে আরও তথ্যের জন্য, 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 প্যাকেজ তৈরি করুন

নিম্নলিখিত উদাহরণটি একটি 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 কাস্টমাইজ করুন

ডিফল্টরূপে, DSU লোডার GSI চিত্রগুলির একটি মেটাডেটা নির্দেশ করে যা https://...google.com/.../gsi-src.json

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

{
    "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"
      },

}

চিত্র 7-এ দেখানো একটি OEM-এর জন্য প্রকাশিত DSU মেটাডেটা চেইন করা সম্ভব।

চেইনিং প্রকাশিত DSU মেটাডেটা

চিত্র 7. চেইনিং প্রকাশিত DSU মেটাডেটা

,

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

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

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

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

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

পার্টিশনের প্রয়োজনীয়তা

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

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

  • F2FS ব্যবহার করে:
    • 109s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: F2FS: এনক্রিপশন=aes-256-xts:aes-256-cts
    • 104s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: F2FS: এনক্রিপশন = বরফ
  • ext4 ব্যবহার করে:
    • 135s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: ext4: encryption=aes-256-xts:aes-256-cts

যদি এটি আপনার প্ল্যাটফর্মে অনেক বেশি সময় নেয়, তাহলে আপনি মাউন্ট পতাকাটিতে এমন কোনো পতাকা আছে কিনা তা পরীক্ষা করতে চাইতে পারেন যা "সিঙ্ক" লিখতে বাধ্য করে, অথবা আপনি আরও ভাল পারফরম্যান্স পেতে স্পষ্টভাবে একটি "অ্যাসিঙ্ক" পতাকা নির্দিষ্ট করতে পারেন।

metadata পার্টিশন (16 MB বা বড়) ইনস্টল করা ছবি সম্পর্কিত ডেটা সংরক্ষণের জন্য প্রয়োজন। এটি প্রথম পর্যায়ে মাউন্ট করার সময় মাউন্ট করা আবশ্যক।

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

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

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

ওয়েভার HAL

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

দারোয়ান HAL

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

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

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

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

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

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

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

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

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

  • GSI.img (1~1.5 G) সংরক্ষণ করার জন্য একটি যৌক্তিক পার্টিশন
  • GSI চালানোর জন্য স্যান্ডবক্স হিসেবে একটি 8 GB খালি /data পার্টিশন

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

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

আপনি adb , একটি OEM অ্যাপ বা এক-ক্লিক DSU লোডার (Android 11 বা উচ্চতর) ব্যবহার করে 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 চালু করুন

ডিএসইউতে প্রধান এন্ট্রি পয়েন্ট হল 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 একটি সিস্টেম API, আপনি নিয়মিত SDK API দিয়ে অ্যাপটি তৈরি করতে পারবেন না এবং আপনি এটি Google Play-তে প্রকাশ করতে পারবেন না। এই অ্যাপটির উদ্দেশ্য হল:

  1. একটি বিক্রেতা-সংজ্ঞায়িত স্কিম সহ একটি চিত্র তালিকা এবং সংশ্লিষ্ট URL আনুন৷
  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 লোডার

অ্যান্ড্রয়েড 11 এক-ক্লিক ডিএসইউ লোডার প্রবর্তন করে, যা ডেভেলপার সেটিংসে একটি ফ্রন্টএন্ড।

DSU লোডার চালু করা হচ্ছে

চিত্র 1. DSU লোডার চালু করা হচ্ছে

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

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

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

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

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

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

বৈশিষ্ট্য পতাকা সক্রিয় করা হচ্ছে.

চিত্র 3. বৈশিষ্ট্য পতাকা সক্রিয় করা হচ্ছে

বৈশিষ্ট্য ফ্ল্যাগ UI একটি ব্যবহারকারী বিল্ড চলমান একটি ডিভাইসে অনুপলব্ধ হতে পারে. এই ক্ষেত্রে, পরিবর্তে adb কমান্ড ব্যবহার করুন:

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

জিসিই-তে বিক্রেতা হোস্ট সিস্টেমের ছবি (ঐচ্ছিক)

সিস্টেম ইমেজগুলির জন্য সম্ভাব্য স্টোরেজ অবস্থানগুলির মধ্যে একটি হল Google Compute Engine (GCE) বালতি। রিলিজ অ্যাডমিনিস্ট্রেটর রিলিজ করা সিস্টেম ইমেজ যোগ/মোছা/পরিবর্তন করতে GCP স্টোরেজ কনসোল ব্যবহার করে।

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

GCE-তে পাবলিক অ্যাক্সেস

চিত্র 4. GCE-তে পাবলিক অ্যাক্সেস

একটি আইটেম সর্বজনীন করার পদ্ধতি Google ক্লাউড ডকুমেন্টেশনে উপলব্ধ।

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

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

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

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

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

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

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

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

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

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

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

দ্বিতীয়ত, আদিম image প্রকাশিত ডিএসইউ প্যাকেজগুলি বর্ণনা করতে ব্যবহৃত হয়। আদিম চিত্রের ভিতরে বেশ কয়েকটি বৈশিষ্ট্য রয়েছে:

  • name এবং details বৈশিষ্ট্যগুলি হল স্ট্রিং যা ব্যবহারকারীর নির্বাচন করার জন্য ডায়ালগে দেখানো হয়।

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

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

  • ঐচ্ছিক tos বৈশিষ্ট্য একটি পাঠ্য ফাইলের দিকে নির্দেশ করে যা সংশ্লিষ্ট DSU প্যাকেজের পরিষেবার শর্তাবলী বর্ণনা করে। যখন একজন বিকাশকারী নির্দিষ্ট পরিষেবার শর্তাবলী সহ একটি DSU প্যাকেজ নির্বাচন করেন, চিত্র 6-এ দেখানো ডায়ালগ বক্সটি খোলে, DSU প্যাকেজ ইনস্টল করার আগে বিকাশকারীকে পরিষেবার শর্তাবলী মেনে নিতে বলে।

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

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

রেফারেন্সের জন্য, এখানে 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 হল একটি ঐচ্ছিক পূর্ণসংখ্যা যা একটি Android রিলিজ নির্দিষ্ট করে। উদাহরণস্বরূপ, Android 10-এর জন্য, os_version হল 10 এবং Android 11-এর জন্য, os_version হল 11 । যখন এই বৈশিষ্ট্যটি নির্দিষ্ট করা হয়, তখন এটি অবশ্যই ro.system.build.version.release সিস্টেম সম্পত্তির সমান বা তার চেয়ে বেশি হতে হবে৷ এই চেকটি একটি Android 11 বিক্রেতা ডিভাইসে একটি Android 10 GSI ইমেজ বুট করা প্রতিরোধ করতে ব্যবহৃত হয়, যা বর্তমানে সমর্থিত নয়। একটি Android 10 ডিভাইসে একটি Android 11 GSI ইমেজ বুট করার অনুমতি দেওয়া হয়েছে।

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

নিরাপত্তার জন্য DSU কী প্রত্যাহার করুন

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

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

নিরাপত্তা শক্তি নিশ্চিত করতে মূল প্রত্যাহার তালিকা URL একটি HTTPS URL হওয়া উচিত এবং একটি সংস্থান স্ট্রিং-এ নির্দিষ্ট করা হয়েছে:

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

স্ট্রিংটির মান হল https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json , যা Google-এ প্রকাশিত GSI কীগুলির জন্য একটি প্রত্যাহার তালিকা৷ এই রিসোর্স স্ট্রিংটি ওভারলেড এবং কাস্টমাইজ করা যেতে পারে, যাতে OEM যারা DSU বৈশিষ্ট্য গ্রহণ করে তাদের নিজস্ব কী কালো তালিকা প্রদান এবং বজায় রাখতে পারে। এটি ডিভাইসের রামডিস্ক ইমেজ আপডেট না করেই নির্দিষ্ট পাবলিক কী ব্লক করার জন্য 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 পাবকি তৈরি করা বিভাগে বর্ণিত হয়েছে৷
  • status কীটির প্রত্যাহার স্থিতি নির্দেশ করে। বর্তমানে, একমাত্র সমর্থিত মানটি REVOKED
  • reason হল একটি ঐচ্ছিক স্ট্রিং যা প্রত্যাহার করার কারণ বর্ণনা করে।

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

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

একটি নতুন কী জোড়া তৈরি করুন

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

$ 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. droidcore টার্গেট যোগ করা oem_cert.avbpubkey এর উপর নির্ভরশীল করুন:

    droidcore: oem_cert.avbpubkey
    

JSON বর্ণনাকারীতে AVB পাবকি অ্যাট্রিবিউট তৈরি করুন

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

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

এটি JSON বর্ণনাকারীর pubkey বৈশিষ্ট্যের বিষয়বস্তু হবে।

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

একটি DSU প্যাকেজ সাইন ইন করুন

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

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

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

    $ 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 যোগ করার বিষয়ে আরও তথ্যের জন্য, 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 প্যাকেজ তৈরি করুন

নিম্নলিখিত উদাহরণটি একটি 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 কাস্টমাইজ করুন

ডিফল্টরূপে, DSU লোডার GSI চিত্রগুলির একটি মেটাডেটা নির্দেশ করে যা https://...google.com/.../gsi-src.json

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

{
    "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"
      },

}

চিত্র 7-এ দেখানো একটি OEM-এর জন্য প্রকাশিত DSU মেটাডেটা চেইন করা সম্ভব।

চেইনিং প্রকাশিত DSU মেটাডেটা

চিত্র 7. চেইনিং প্রকাশিত DSU মেটাডেটা

,

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

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

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

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

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

পার্টিশনের প্রয়োজনীয়তা

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

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

  • F2FS ব্যবহার করে:
    • 109s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: F2FS: এনক্রিপশন=aes-256-xts:aes-256-cts
    • 104s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: F2FS: এনক্রিপশন = বরফ
  • ext4 ব্যবহার করে:
    • 135s, 8G ব্যবহারকারী, 867M সিস্টেম, ফাইল সিস্টেমের ধরন: ext4: encryption=aes-256-xts:aes-256-cts

যদি এটি আপনার প্ল্যাটফর্মে অনেক বেশি সময় নেয়, তাহলে আপনি মাউন্ট পতাকাটিতে এমন কোনো পতাকা আছে কিনা তা পরীক্ষা করতে চাইতে পারেন যা "সিঙ্ক" লিখতে বাধ্য করে, অথবা আপনি আরও ভাল পারফরম্যান্স পেতে স্পষ্টভাবে একটি "অ্যাসিঙ্ক" পতাকা নির্দিষ্ট করতে পারেন।

metadata পার্টিশন (16 MB বা বড়) ইনস্টল করা ছবি সম্পর্কিত ডেটা সংরক্ষণের জন্য প্রয়োজন। এটি প্রথম পর্যায়ে মাউন্ট করার সময় মাউন্ট করা আবশ্যক।

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

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

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

ওয়েভার HAL

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

দারোয়ান HAL

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

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

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

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

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

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

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

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

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

  • GSI.img (1~1.5 G) সংরক্ষণ করার জন্য একটি যৌক্তিক পার্টিশন
  • GSI চালানোর জন্য স্যান্ডবক্স হিসেবে একটি 8 GB খালি /data পার্টিশন

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

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

আপনি adb , একটি OEM অ্যাপ বা এক-ক্লিক DSU লোডার (Android 11 বা উচ্চতর) ব্যবহার করে 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 চালু করুন

ডিএসইউতে প্রধান এন্ট্রি পয়েন্ট হল 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

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

অ্যান্ড্রয়েড 11 ওয়ান-ক্লিক ডিএসইউ লোডার পরিচয় করিয়ে দেয়, যা বিকাশকারী সেটিংসের একটি ফ্রন্টেন্ড।

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

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

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

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

চিত্র 2। ডিএসইউ চিত্র ইনস্টলেশন অগ্রগতি

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

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

ডিএসইউ বৈশিষ্ট্যটি settings_dynamic_android বৈশিষ্ট্য পতাকাগুলির অধীনে রয়েছে। ডিএসইউ ব্যবহার করার আগে, নিশ্চিত করুন যে সংশ্লিষ্ট বৈশিষ্ট্য পতাকা সক্ষম রয়েছে।

বৈশিষ্ট্য পতাকা সক্ষম করা।

চিত্র 3। বৈশিষ্ট্য পতাকা সক্ষম করা

বৈশিষ্ট্যযুক্ত পতাকা ইউআই ব্যবহারকারী বিল্ড চালানো কোনও ডিভাইসে অনুপলব্ধ হতে পারে। এই ক্ষেত্রে, পরিবর্তে adb কমান্ডটি ব্যবহার করুন:

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

জিসিইতে বিক্রেতা হোস্ট সিস্টেমের চিত্রগুলি (al চ্ছিক)

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

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

জিসিইতে পাবলিক অ্যাক্সেস

চিত্র 4। জিসিইতে পাবলিক অ্যাক্সেস

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

জিপ ফাইলে একাধিক অংশের ডিএসইউ

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

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

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

OEM- স্বাক্ষরিত ডিএসইউ

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

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

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

ডিএসইউ জসন বর্ণনাকারী

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

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

দ্বিতীয়ত, image আদিমটি প্রকাশিত ডিএসইউ প্যাকেজগুলি বর্ণনা করতে ব্যবহৃত হয়। চিত্রের আদিম ভিতরে বেশ কয়েকটি বৈশিষ্ট্য রয়েছে:

  • name এবং details বৈশিষ্ট্যগুলি এমন স্ট্রিং যা ব্যবহারকারী নির্বাচন করার জন্য ডায়ালগটিতে প্রদর্শিত হয়।

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

  • Ph চ্ছিক pubkey অ্যাট্রিবিউটটি পাবলিক কীটি বর্ণনা করে যা ডিএসইউ প্যাকেজটিতে স্বাক্ষর করতে ব্যবহৃত সিক্রেট কী দিয়ে জোড়া দেয়। এটি নির্দিষ্ট করা হলে, ডিএসইউ পরিষেবাটি ডিএসইউ প্যাকেজটি যাচাই করতে ব্যবহৃত কী রয়েছে কিনা তা পরীক্ষা করতে পারে। এটি একটি অচেনা ডিএসইউ প্যাকেজ ইনস্টল করা এড়িয়ে যায়, উদাহরণস্বরূপ ওএম-বি দ্বারা তৈরি ডিভাইসে ওএম-এ দ্বারা স্বাক্ষরিত একটি ডিএসইউ ইনস্টল করা।

  • Al চ্ছিক tos বৈশিষ্ট্যটি একটি পাঠ্য ফাইলের দিকে নির্দেশ করে যা সংশ্লিষ্ট ডিএসইউ প্যাকেজের জন্য পরিষেবার শর্তাদি বর্ণনা করে। যখন কোনও বিকাশকারী নির্দিষ্ট পরিষেবার বৈশিষ্ট্যের শর্তাদি সহ একটি ডিএসইউ প্যাকেজ নির্বাচন করে, চিত্র 6 -এ প্রদর্শিত ডায়ালগ বাক্সটি খোলে, বিকাশকারীকে ডিএসইউ প্যাকেজটি ইনস্টল করার আগে পরিষেবার শর্তাদি গ্রহণ করতে বলে।

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

    চিত্র 6। পরিষেবা ডায়ালগ বাক্সের শর্তাদি

রেফারেন্সের জন্য, জিএসআইয়ের জন্য এখানে একটি ডিএসইউ জসন বর্ণনাকারী:

{
   "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"
      }
   ]
}

সামঞ্জস্যতা পরিচালনা

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

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

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

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

সুরক্ষার জন্য ডিএসইউ কীগুলি প্রত্যাহার করুন

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

ডিএসইউ কী প্রত্যাহার তালিকায় প্রত্যাহার করা এভিবি পাবলিক কীগুলির একটি তালিকা রয়েছে। ডিএসইউ ইনস্টলেশন চলাকালীন, ডিএসইউ চিত্রগুলির অভ্যন্তরে পাবলিক কীগুলি প্রত্যাহার তালিকার সাথে বৈধ করা হয়। যদি চিত্রগুলিতে প্রত্যাহার করা পাবলিক কী রয়েছে বলে মনে হয় তবে ডিএসইউ ইনস্টলেশন প্রক্রিয়া বন্ধ হয়ে যায়।

সুরক্ষা শক্তি নিশ্চিত করার জন্য মূল প্রত্যাহার তালিকার ইউআরএল একটি এইচটিটিপিএস ইউআরএল হওয়া উচিত এবং এটি একটি সংস্থান স্ট্রিংয়ে নির্দিষ্ট করা হয়েছে:

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

স্ট্রিংয়ের মানটি হ'ল https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json , যা গুগল-রিলিজ জিএসআই কীগুলির জন্য একটি প্রত্যাহার তালিকা। এই রিসোর্স স্ট্রিংটি ওভারলাইড এবং কাস্টমাইজ করা যেতে পারে, যাতে ডিএসইউ বৈশিষ্ট্যটি গ্রহণ করে এমন ওএমগুলি তাদের নিজস্ব কী ব্ল্যাকলিস্ট সরবরাহ করতে এবং বজায় রাখতে পারে। এটি 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 ডাইজেস্ট।
  • status কীটির প্রত্যাহার স্থিতি নির্দেশ করে। বর্তমানে, একমাত্র সমর্থিত মান REVOKED হয়।
  • reason হ'ল একটি al চ্ছিক স্ট্রিং যা প্রত্যাহারের কারণ বর্ণনা করে।

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

এই বিভাগটি কীভাবে বেশ কয়েকটি ডিএসইউ কনফিগারেশন পদ্ধতি সম্পাদন করবেন তা বর্ণনা করে।

একটি নতুন কী জোড়া তৈরি করুন

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

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

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

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

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

শংসাপত্রটি ইতিমধ্যে একটি পিইএম ফাইল হলে এই পদক্ষেপটি এড়িয়ে যান।

র‌্যামডিস্কে জুটিযুক্ত পাবকে যুক্ত করুন

oem_cert.avbpubkey স্বাক্ষরিত ডিএসইউ প্যাকেজটি যাচাই করতে অবশ্যই /avb/*.avbpubkey এর অধীনে রাখতে হবে। প্রথমে পিইএম ফর্ম্যাটে পাবলিক কীটিকে এভিবি পাবলিক কী ফর্ম্যাটে রূপান্তর করুন:

$ 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: oem_cert.avbpubkey
    

জেএসএন বর্ণনাকারীর মধ্যে এভিবি পাবকি বৈশিষ্ট্য তৈরি করুন

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

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

এটি জেএসএন বর্ণনাকারীর pubkey বৈশিষ্ট্যের সামগ্রী হবে।

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

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

ডিএসইউ প্যাকেজে স্বাক্ষর করতে এই পদ্ধতির একটি ব্যবহার করুন:

  • পদ্ধতি 1: ডিএসইউ প্যাকেজ তৈরি করতে মূল এভিবি স্বাক্ষর প্রক্রিয়া দ্বারা তৈরি শিল্পকলাটি পুনরায় ব্যবহার করুন। একটি বিকল্প পদ্ধতির হ'ল রিলিজ প্যাকেজ থেকে ইতিমধ্যে স্বাক্ষরিত চিত্রগুলি বের করা এবং জিপ ফাইলটি সরাসরি তৈরি করতে নিষ্কাশিত চিত্রগুলি ব্যবহার করা।

  • পদ্ধতি 2: ব্যক্তিগত কী উপলব্ধ থাকলে ডিএসইউ পার্টিশনে স্বাক্ষর করতে নিম্নলিখিত কমান্ডগুলি ব্যবহার করুন। একটি ডিএসইউ প্যাকেজের মধ্যে প্রতিটি 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 যুক্ত করার বিষয়ে আরও তথ্যের জন্য, অ্যাভিবিটিউল ব্যবহার করে দেখুন।

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

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


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

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

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

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

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

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

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

ডিফল্টরূপে, ডিএসইউ লোডার জিএসআই চিত্রগুলির একটি মেটাডেটাকে নির্দেশ করে যা https://...google.com/.../gsi-src.json হয়।

OEMS persist.sys.fflag.override.settings_dynamic_system.list সম্পত্তি যা তাদের নিজস্ব জেএসএন বর্ণনাকারীকে নির্দেশ করে তা সংজ্ঞায়িত করে তালিকাটি ওভাররাইট করতে পারে। উদাহরণস্বরূপ, একটি ওএম জেএসএন মেটাডেটা সরবরাহ করতে পারে যাতে জিএসআইয়ের পাশাপাশি ওএম মালিকানাধীন চিত্রগুলিও অন্তর্ভুক্ত থাকে:

{
    "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"
      },

}

চিত্র 7 -তে দেখানো হিসাবে কোনও ওএম -এর পক্ষে প্রকাশিত ডিএসইউ মেটাডেটা চেইন করা সম্ভব।

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

চিত্র 7। চেইন প্রকাশিত ডিএসইউ মেটাডেটা

,

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

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

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

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

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

পার্টিশন প্রয়োজনীয়তা

অ্যান্ড্রয়েড 11 থেকে শুরু করে, ডিএসইউতে F2FS বা ext4 ফাইল সিস্টেম ব্যবহার করতে /data পার্টিশন প্রয়োজন। এফ 2 এফএস আরও ভাল পারফরম্যান্স দেয় এবং এটি সুপারিশ করা হয়, তবে পার্থক্যটি তুচ্ছ হওয়া উচিত।

পিক্সেল ডিভাইসের সাথে গতিশীল সিস্টেম আপডেট কতক্ষণ সময় নেয় তার কয়েকটি উদাহরণ এখানে রয়েছে:

  • এফ 2 এফএস ব্যবহার করে:
    • 109 এস, 8 জি ব্যবহারকারী, 867 এম সিস্টেম, ফাইল সিস্টেমের ধরণ: এফ 2 এফএস: এনক্রিপশন = এইএস -256-এক্সটিএস: এইএস -256-সিটিএস
    • 104 এস, 8 জি ব্যবহারকারী, 867 এম সিস্টেম, ফাইল সিস্টেমের ধরণ: এফ 2 এফএস: এনক্রিপশন = আইস
  • এক্সট 4 ব্যবহার করে:
    • 135 এস, 8 জি ব্যবহারকারী, 867 এম সিস্টেম, ফাইল সিস্টেমের ধরণ: এক্সট 4: এনক্রিপশন = এইএস -256-এক্সটিএস: এইএস -256-সিটিএস

যদি এটি আপনার প্ল্যাটফর্মে আরও বেশি সময় নেয় তবে আপনি মাউন্ট পতাকাটিতে এমন কোনও পতাকা রয়েছে যা "সিঙ্ক" লিখতে তৈরি করে বা আরও ভাল পারফরম্যান্স পেতে স্পষ্টভাবে একটি "অ্যাসিঙ্ক" পতাকা নির্দিষ্ট করতে পারেন।

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

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

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

বিক্রেতা হাল আচরণ

ওয়েভার হাল

ওয়েভার এইচএল ব্যবহারকারী কীগুলি সংরক্ষণের জন্য একটি নির্দিষ্ট সংখ্যক স্লট সরবরাহ করে। ডিএসইউ দুটি অতিরিক্ত কী স্লট গ্রহণ করে। যদি কোনও OEM এর একটি ওয়েভার এইচএল থাকে তবে এটির জেনেরিক সিস্টেম চিত্র (জিএসআই) এবং একটি হোস্ট চিত্রের জন্য পর্যাপ্ত স্লট থাকা দরকার।

গেটকিপার হাল

গেটকিপার এইচএএলকে বৃহত্তর USER_ID মানগুলি সমর্থন করতে হবে, কারণ জিএসআই +1000000 দ্বারা এইচএএলকে ইউআইডিগুলি অফসেট করে।

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

আপনি যদি যাচাই করা বুটটি অক্ষম না করে লক করা অবস্থায় বুট বিকাশকারী জিএসআই চিত্রগুলিকে সমর্থন করতে চান তবে ফাইল device/<device_name>/device.mk :

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

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

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

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

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

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

  • GSI.img সঞ্চয় করার জন্য একটি যৌক্তিক পার্টিশন (1 ~ 1.5 গ্রাম)
  • জিএসআই চালানোর জন্য স্যান্ডবক্স হিসাবে একটি 8 জিবি খালি /data পার্টিশন

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

উপলভ্য ফ্রন্টেন্ডস

আপনি adb , একটি ওএম অ্যাপ্লিকেশন, বা এক-ক্লিক ডিএসইউ লোডার (অ্যান্ড্রয়েড 11 বা তার বেশি) ব্যবহার করে ডিএসইউ চালু করতে পারেন।

এডিবি ব্যবহার করে ডিএসইউ চালু করুন

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

$ 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

একটি অ্যাপ্লিকেশন ব্যবহার করে ডিএসইউ চালু করুন

ডিএসইউতে মূল প্রবেশের পয়েন্টটি হ'ল android.os.image.DynamicSystemClient.java এপিআই:

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

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

অ্যান্ড্রয়েড 11 ওয়ান-ক্লিক ডিএসইউ লোডার পরিচয় করিয়ে দেয়, যা বিকাশকারী সেটিংসের একটি ফ্রন্টেন্ড।

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

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

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

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

চিত্র 2। ডিএসইউ চিত্র ইনস্টলেশন অগ্রগতি

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

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

ডিএসইউ বৈশিষ্ট্যটি settings_dynamic_android বৈশিষ্ট্য পতাকাগুলির অধীনে রয়েছে। ডিএসইউ ব্যবহার করার আগে, নিশ্চিত করুন যে সংশ্লিষ্ট বৈশিষ্ট্য পতাকা সক্ষম রয়েছে।

বৈশিষ্ট্য পতাকা সক্ষম করা।

চিত্র 3। বৈশিষ্ট্য পতাকা সক্ষম করা

বৈশিষ্ট্যযুক্ত পতাকা ইউআই ব্যবহারকারী বিল্ড চালানো কোনও ডিভাইসে অনুপলব্ধ হতে পারে। এই ক্ষেত্রে, পরিবর্তে adb কমান্ডটি ব্যবহার করুন:

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

জিসিইতে বিক্রেতা হোস্ট সিস্টেমের চিত্রগুলি (al চ্ছিক)

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

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

জিসিইতে পাবলিক অ্যাক্সেস

চিত্র 4। জিসিইতে পাবলিক অ্যাক্সেস

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

জিপ ফাইলে একাধিক অংশের ডিএসইউ

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

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

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

OEM- স্বাক্ষরিত ডিএসইউ

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

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

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

ডিএসইউ জসন বর্ণনাকারী

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

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

দ্বিতীয়ত, image আদিমটি প্রকাশিত ডিএসইউ প্যাকেজগুলি বর্ণনা করতে ব্যবহৃত হয়। চিত্রের আদিম ভিতরে বেশ কয়েকটি বৈশিষ্ট্য রয়েছে:

  • name এবং details বৈশিষ্ট্যগুলি এমন স্ট্রিং যা ব্যবহারকারী নির্বাচন করার জন্য ডায়ালগটিতে প্রদর্শিত হয়।

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

  • Ph চ্ছিক pubkey অ্যাট্রিবিউটটি পাবলিক কীটি বর্ণনা করে যা ডিএসইউ প্যাকেজটিতে স্বাক্ষর করতে ব্যবহৃত সিক্রেট কী দিয়ে জোড়া দেয়। এটি নির্দিষ্ট করা হলে, ডিএসইউ পরিষেবাটি ডিএসইউ প্যাকেজটি যাচাই করতে ব্যবহৃত কী রয়েছে কিনা তা পরীক্ষা করতে পারে। এটি একটি অচেনা ডিএসইউ প্যাকেজ ইনস্টল করা এড়িয়ে যায়, উদাহরণস্বরূপ ওএম-বি দ্বারা তৈরি ডিভাইসে ওএম-এ দ্বারা স্বাক্ষরিত একটি ডিএসইউ ইনস্টল করা।

  • Al চ্ছিক tos বৈশিষ্ট্যটি একটি পাঠ্য ফাইলের দিকে নির্দেশ করে যা সংশ্লিষ্ট ডিএসইউ প্যাকেজের জন্য পরিষেবার শর্তাদি বর্ণনা করে। যখন কোনও বিকাশকারী নির্দিষ্ট পরিষেবার বৈশিষ্ট্যের শর্তাদি সহ একটি ডিএসইউ প্যাকেজ নির্বাচন করে, চিত্র 6 -এ প্রদর্শিত ডায়ালগ বাক্সটি খোলে, বিকাশকারীকে ডিএসইউ প্যাকেজটি ইনস্টল করার আগে পরিষেবার শর্তাদি গ্রহণ করতে বলে।

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

    চিত্র 6। পরিষেবা ডায়ালগ বাক্সের শর্তাদি

রেফারেন্সের জন্য, জিএসআইয়ের জন্য এখানে একটি ডিএসইউ জসন বর্ণনাকারী:

{
   "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"
      }
   ]
}

সামঞ্জস্যতা পরিচালনা

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

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

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

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

সুরক্ষার জন্য ডিএসইউ কীগুলি প্রত্যাহার করুন

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

ডিএসইউ কী প্রত্যাহার তালিকায় প্রত্যাহার করা এভিবি পাবলিক কীগুলির একটি তালিকা রয়েছে। ডিএসইউ ইনস্টলেশন চলাকালীন, ডিএসইউ চিত্রগুলির অভ্যন্তরে পাবলিক কীগুলি প্রত্যাহার তালিকার সাথে বৈধ করা হয়। যদি চিত্রগুলিতে প্রত্যাহার করা পাবলিক কী রয়েছে বলে মনে হয় তবে ডিএসইউ ইনস্টলেশন প্রক্রিয়া বন্ধ হয়ে যায়।

সুরক্ষা শক্তি নিশ্চিত করার জন্য মূল প্রত্যাহার তালিকার ইউআরএল একটি এইচটিটিপিএস ইউআরএল হওয়া উচিত এবং এটি একটি সংস্থান স্ট্রিংয়ে নির্দিষ্ট করা হয়েছে:

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

স্ট্রিংয়ের মানটি হ'ল https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json , যা গুগল-রিলিজ জিএসআই কীগুলির জন্য একটি প্রত্যাহার তালিকা। এই রিসোর্স স্ট্রিংটি ওভারলাইড এবং কাস্টমাইজ করা যেতে পারে, যাতে ডিএসইউ বৈশিষ্ট্যটি গ্রহণ করে এমন ওএমগুলি তাদের নিজস্ব কী ব্ল্যাকলিস্ট সরবরাহ করতে এবং বজায় রাখতে পারে। এটি 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 ডাইজেস্ট।
  • status কীটির প্রত্যাহার স্থিতি নির্দেশ করে। বর্তমানে, একমাত্র সমর্থিত মান REVOKED হয়।
  • reason হ'ল একটি al চ্ছিক স্ট্রিং যা প্রত্যাহারের কারণ বর্ণনা করে।

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

এই বিভাগটি কীভাবে বেশ কয়েকটি ডিএসইউ কনফিগারেশন পদ্ধতি সম্পাদন করবেন তা বর্ণনা করে।

একটি নতুন কী জোড়া তৈরি করুন

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

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

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

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

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

শংসাপত্রটি ইতিমধ্যে একটি পিইএম ফাইল হলে এই পদক্ষেপটি এড়িয়ে যান।

র‌্যামডিস্কে জুটিযুক্ত পাবকে যুক্ত করুন

oem_cert.avbpubkey স্বাক্ষরিত ডিএসইউ প্যাকেজটি যাচাই করতে অবশ্যই /avb/*.avbpubkey এর অধীনে রাখতে হবে। প্রথমে পিইএম ফর্ম্যাটে পাবলিক কীটিকে এভিবি পাবলিক কী ফর্ম্যাটে রূপান্তর করুন:

$ 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: oem_cert.avbpubkey
    

জেএসএন বর্ণনাকারীর মধ্যে এভিবি পাবকি বৈশিষ্ট্য তৈরি করুন

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

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

এটি জেএসএন বর্ণনাকারীর pubkey বৈশিষ্ট্যের সামগ্রী হবে।

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

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

ডিএসইউ প্যাকেজে স্বাক্ষর করতে এই পদ্ধতির একটি ব্যবহার করুন:

  • পদ্ধতি 1: ডিএসইউ প্যাকেজ তৈরি করতে মূল এভিবি স্বাক্ষর প্রক্রিয়া দ্বারা তৈরি শিল্পকলাটি পুনরায় ব্যবহার করুন। একটি বিকল্প পদ্ধতির হ'ল রিলিজ প্যাকেজ থেকে ইতিমধ্যে স্বাক্ষরিত চিত্রগুলি বের করা এবং জিপ ফাইলটি সরাসরি তৈরি করতে নিষ্কাশিত চিত্রগুলি ব্যবহার করা।

  • পদ্ধতি 2: ব্যক্তিগত কী উপলব্ধ থাকলে ডিএসইউ পার্টিশনে স্বাক্ষর করতে নিম্নলিখিত কমান্ডগুলি ব্যবহার করুন। একটি ডিএসইউ প্যাকেজের মধ্যে প্রতিটি 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 যুক্ত করার বিষয়ে আরও তথ্যের জন্য, অ্যাভিবিটিউল ব্যবহার করে দেখুন।

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

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


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

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

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

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

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

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

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

ডিফল্টরূপে, ডিএসইউ লোডার জিএসআই চিত্রগুলির একটি মেটাডেটাকে নির্দেশ করে যা https://...google.com/.../gsi-src.json হয়।

OEMS persist.sys.fflag.override.settings_dynamic_system.list সম্পত্তি যা তাদের নিজস্ব জেএসএন বর্ণনাকারীকে নির্দেশ করে তা সংজ্ঞায়িত করে তালিকাটি ওভাররাইট করতে পারে। উদাহরণস্বরূপ, একটি ওএম জেএসএন মেটাডেটা সরবরাহ করতে পারে যাতে জিএসআইয়ের পাশাপাশি ওএম মালিকানাধীন চিত্রগুলিও অন্তর্ভুক্ত থাকে:

{
    "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"
      },

}

চিত্র 7 -তে দেখানো হিসাবে কোনও ওএম -এর পক্ষে প্রকাশিত ডিএসইউ মেটাডেটা চেইন করা সম্ভব।

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

চিত্র 7। চেইন প্রকাশিত ডিএসইউ মেটাডেটা