OTA প্যাকেজ তৈরি করা

A/B সিস্টেম আপডেট বা A/B নয় এমন সিস্টেম আপডেট ব্যবহার করে এমন ডিভাইসের জন্য সম্পূর্ণ এবং ইনক্রিমেন্টাল OTA প্যাকেজ তৈরি করতে আপনি build/make/tools/releasetools-এ দেওয়া ota_from_target_files টুল ব্যবহার করতে পারেন। টুলটি Android বিল্ড সিস্টেমের তৈরি করা target-files.zip ফাইলকে ইনপুট হিসেবে নেয়।

Android 11 বা তার পরবর্তী যেকোনও ভার্সনে চলা ডিভাইসের জন্য, আপনি বিভিন্ন SKU সহ একাধিক ডিভাইসের জন্য একটি OTA প্যাকেজ তৈরি করতে পারবেন। এটি করার জন্য ডায়নামিক ফিঙ্গারপ্রিন্ট ব্যবহার করার জন্য টার্গেট ডিভাইস কনফিগার করতে হবে এবং প্রি ও পোস্টকন্ডিশন এন্ট্রিতে ডিভাইসের নাম ও ফিঙ্গারপ্রিন্ট অন্তর্ভুক্ত করার জন্য OTA মেটাডেটা আপডেট করতে হবে।

Android 8.0-এ নন-A/B ডিভাইসের জন্য ফাইল-ভিত্তিক OTA প্যাকেজ বন্ধ করা হয়েছে, যার পরিবর্তে ব্লক-ভিত্তিক OTA প্যাকেজ ব্যবহার করতে হবে। ব্লক-ভিত্তিক OTA প্যাকেজ তৈরি করতে বা Android 7.x বা এর আগের যেকোনও ভার্সনে চলা ডিভাইস, ota_from_target_files প্যারামিটারে --block বিকল্পটি পাস করুন।

সম্পূর্ণ আপডেট তৈরি করুন

সম্পূর্ণ আপডেট হল একটি OTA প্যাকেজ যাতে ডিভাইসের (সিস্টেম, বুট ও রিকভারি পার্টিশন) সম্পূর্ণ চূড়ান্ত অবস্থা থাকে। ডিভাইসটি যতক্ষণ পর্যন্ত প্যাকেজ গ্রহণ ও প্রয়োগ করতে পারবে, ততক্ষণ পর্যন্ত ডিভাইসের বর্তমান অবস্থা যাই হোক না কেন, প্যাকেজটি বিল্ড ইনস্টল করতে পারবে। যেমন, নিম্নলিখিত কমান্ডগুলি target-files.zip ডিভাইসের জন্য tardis আর্কাইভ তৈরি করতে রিলিজ টুল ব্যবহার করে।

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

make dist একটি সম্পূর্ণ OTA প্যাকেজ তৈরি করে ($OUT-এ)। এর ফলে .zip ফাইল তৈরি হয় যার মধ্যে tardis ডিভাইসের জন্য OTA প্যাকেজ তৈরি করার জন্য প্রয়োজনীয় সবকিছু থাকে। এছাড়াও, আপনি Python বাইনারি হিসেবে ota_from_target_files তৈরি করতে এবং সম্পূর্ণ বা ইনক্রিমেন্টাল প্যাকেজ তৈরি করতে এটি কল করতে পারবেন।

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

ota_from_target_files পাথ $PATH-এ সেট-আপ করা হয় এবং এর ফলে প্রাপ্ত python বাইনারি out/ ডিরেক্টরিতে থাকে।

ota_update.zip এখন টেস্ট ডিভাইসে পাঠানোর জন্য রেডি (সবকিছু টেস্ট কী দিয়ে সাইন করা আছে)। ব্যবহারকারীর ডিভাইসের জন্য, রিলিজের জন্য বিল্ড সাইন করা নিবন্ধে বিস্তারিতভাবে বলা হয়েছে সেই অনুযায়ী আপনার নিজস্ব প্রাইভেট কী তৈরি ও ব্যবহার করুন।

ইনক্রিমেন্টাল আপডেট তৈরি করা

ইনক্রিমেন্টাল আপডেট হল একটি OTA প্যাকেজ যাতে ডিভাইসে আগে থেকেই থাকা ডেটার বাইনারি প্যাচ থাকে। ইনক্রিমেন্টাল আপডেট সহ প্যাকেজগুলি সাধারণত ছোট হয় কারণ এতে অপরিবর্তিত ফাইল অন্তর্ভুক্ত করার প্রয়োজন হয় না। এছাড়াও, পরিবর্তিত ফাইলগুলি প্রায়শই তাদের আগের ভার্সনের মতো হয়, তাই প্যাকেজে শুধুমাত্র দুটি ফাইলের মধ্যে পার্থক্য এনকোড করলেই চলে।

আপনি শুধুমাত্র সেইসব ডিভাইসে ইনক্রিমেন্টাল আপডেট প্যাকেজ ইনস্টল করতে পারবেন যেগুলিতে প্যাকেজ তৈরি করার জন্য ব্যবহৃত সোর্স বিল্ড আছে। ইনক্রিমেন্টাল আপডেট তৈরি করতে, আগের বিল্ডের target_files.zip ফাইল (যেটি আপনি থেকে আপডেট করতে চান) এবং নতুন বিল্ডের target_files.zip ফাইল, দুটিই প্রয়োজন। যেমন, নিম্নলিখিত কমান্ডগুলি tardis ডিভাইসের জন্য ইনক্রিমেন্টাল আপডেট তৈরি করতে রিলিজ টুল ব্যবহার করে।

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

এই বিল্ডটি আগের বিল্ডের সাথে খুব মিল রয়েছে এবং ইনক্রিমেন্টাল আপডেট প্যাকেজ (incremental_ota_update.zip) সংশ্লিষ্ট সম্পূর্ণ আপডেটের (প্রায় ১ এমবি, যেখানে ৬০ এমবি হওয়ার কথা) তুলনায় অনেক ছোট।

ইনক্রিমেন্টাল প্যাকেজ শুধুমাত্র সেইসব ডিভাইসে ডিস্ট্রিবিউট করুন যেগুলি ইনক্রিমেন্টাল প্যাকেজের শুরুর পয়েন্ট হিসেবে ব্যবহৃত আগের বিল্ডের সাথে হুবহু এক। আপনাকে PREVIOUS-tardis-target_files.zip বা PREVIOUS-tardis-img.zip-এর ছবি ফ্ল্যাশ করতে হবে (দুটিই make dist দিয়ে তৈরি, fastboot update দিয়ে ফ্ল্যাশ করতে হবে), PRODUCT_OUT ডিরেক্টরির ছবি নয় (make দিয়ে তৈরি, যা fastboot flashall দিয়ে ফ্ল্যাশ করা হবে)। অন্য কোনও বিল্ড সহ ডিভাইসে ইনক্রিমেন্টাল প্যাকেজ ইনস্টল করার চেষ্টা করলে, ইনস্টলেশন সংক্রান্ত সমস্যা হবে। ইনস্টল করা না গেলে, ডিভাইসটি একই অবস্থায় থাকে (পুরনো সিস্টেম রান করে); প্যাকেজটি আপডেট করার আগে, এটি সব ফাইলের আগের অবস্থা যাচাই করে তাই ডিভাইসটি অর্ধেক আপগ্রেড করা অবস্থায় আটকে থাকে না।

ব্যবহারকারীর সেরা অভিজ্ঞতা নিশ্চিত করতে, প্রতি ৩–৪টি ইনক্রিমেন্টাল আপডেটের জন্য একটি সম্পূর্ণ আপডেট অফার করুন। এটি ব্যবহারকারীদের লেটেস্ট রিলিজের সাথে আপডেট থাকতে এবং ইনক্রিমেন্টাল আপডেটের দীর্ঘ ইনস্টল সিকোয়েন্স এড়াতে সাহায্য করে।

একাধিক SKU-এর জন্য OTA প্যাকেজ তৈরি করা

Android 11 বা তার পরবর্তী যেকোনও ভার্সনে বিভিন্ন SKU সহ একাধিক ডিভাইসের জন্য একটি OTA প্যাকেজ ব্যবহার করা যায়। এটি করার জন্য, ডায়নামিক ফিঙ্গারপ্রিন্ট ব্যবহার করার জন্য টার্গেট ডিভাইস কনফিগার করতে হবে এবং OTA মেটাডেটা আপডেট করতে হবে (OTA টুল ব্যবহার করে) যাতে প্রি ও পোস্ট কন্ডিশন এন্ট্রিতে ডিভাইসের নাম ও ফিঙ্গারপ্রিন্ট অন্তর্ভুক্ত করা যায়।

SKU সম্পর্কে

SKU-এর ফর্ম্যাট হল সম্মিলিত বিল্ড প্যারামিটার মানের একটি বৈচিত্র্য এবং সাধারণত বর্তমান build_fingerprint প্যারামিটারের একটি অঘোষিত সাবসেট। OEM-রা কোনও SKU-এর জন্য CDD-অনুমোদিত বিল্ড প্যারামিটারের যেকোনও কম্বিনেশন ব্যবহার করতে পারে, সেই সাথে সেইসব SKU-এর জন্য একটি ছবিও ব্যবহার করতে পারে। যেমন, নিম্নলিখিত SKU-তে একাধিক ভেরিয়েশন আছে:

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA হল ডিভাইস লেভেল (যেমন, Pro, Premium বা Plus)
  • modifierB হল হার্ডওয়্যারের ভেরিয়েশন (যেমন রেডিও)
  • modifierC হল অঞ্চল, যা সাধারণ হতে পারে (যেমন NA, EMEA বা CHN ) অথবা দেশ বা ভাষা-নির্দিষ্ট (যেমন JPN, ENG বা CHN)

অনেক OEM একাধিক SKU-এর জন্য একটি ছবি ব্যবহার করে, তারপরে ডিভাইস বুট-আপ করার পরে রানটাইমে চূড়ান্ত প্রোডাক্টের নাম এবং ডিভাইস ফিঙ্গারপ্রিন্ট তৈরি করে। এই প্রসেস প্ল্যাটফর্ম ডেভেলপমেন্ট প্রসেসকে সহজ করে তোলে, যার ফলে সামান্য কাস্টমাইজেশন সহ ডিভাইসগুলি কিন্তু বিভিন্ন প্রোডাক্টের নাম সাধারণ ছবি শেয়ার করতে সক্ষম হয় (যেমন tardis এবং tardispro)।

ডায়নামিক ফিঙ্গারপ্রিন্ট ব্যবহার করুন

ফিঙ্গারপ্রিন্ট হল বিল্ড প্যারামিটার-এর একটি নির্দিষ্ট কনক্যাটেনেশন, যেমন ro.product.brand, ro.product.name ও ro.product.device। ডিভাইসের ফিঙ্গারপ্রিন্ট সিস্টেম পার্টিশন ফিঙ্গারপ্রিন্ট থেকে পাওয়া যায় এবং ডিভাইসে চলা ছবি (ও বাইট)-এর অনন্য শনাক্তকারী হিসেবে ব্যবহার করা হয়। ডায়নামিক ফিঙ্গারপ্রিন্ট তৈরি করতে, ডিভাইসের বুট টাইমে বুটলোডার ভেরিয়েবলের ভ্যালু পেতে ডিভাইসের build.prop ফাইলে ডায়নামিক লজিক ব্যবহার করুন, তারপর সেই ডেটা ব্যবহার করে সেই ডিভাইসের জন্য ডায়নামিক ফিঙ্গারপ্রিন্ট তৈরি করুন।

যেমন, tardis এবং tardispro ডিভাইসের জন্য ডায়নামিক ফিঙ্গারপ্রিন্ট ব্যবহার করতে, নিচে দেখানো ফাইলগুলি আপডেট করুন।

  • নিম্নলিখিত লাইনটি অন্তর্ভুক্ত করতে odm/etc/build_std.prop ফাইলটি আপডেট করুন।

    ro.odm.product.device=tardis
    
  • নিম্নলিখিত লাইনটি অন্তর্ভুক্ত করতে odm/etc/build_pro.prop ফাইলটি আপডেট করুন।

    ro.odm.product.device=tardispro
    
  • নিচের লাইনগুলি অন্তর্ভুক্ত করতে odm/etc/build.prop ফাইল আপডেট করুন।

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

এইসব লাইন, বুটলোডার প্রপার্টির ro.boot.product.hardware.sku ভ্যালুর (যা শুধু-পঠনযোগ্য) উপর ভিত্তি করে ডিভাইসের নাম, ফিঙ্গারপ্রিন্ট ও ro.build.fingerprint ভ্যালু ডায়নামিক সেট করে।

OTA প্যাকেজ মেটাডেটা আপডেট করা

OTA প্যাকেজে একটি মেটাডেটা ফাইল (META-INF/com/android/metadata) থাকে যা OTA প্যাকেজের পূর্বশর্ত ও পরবর্তী শর্ত সহ প্যাকেজটি বর্ণনা করে। যেমন, নিচের কোডটি হল tardis ডিভাইসের জন্য OTA প্যাকেজের মেটাডেটা ফাইল।

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

pre-device, pre-build-incremental এবং pre-build কোডের মান OTA প্যাকেজ ইনস্টল করার আগে ডিভাইসের অবস্থা নির্ধারণ করে। OTA প্যাকেজ ইনস্টল করার পরে ডিভাইসের যে অবস্থা হবে বলে আশা করা হচ্ছে তা post-build-incremental এবং post-build ভ্যালু দিয়ে নির্ধারণ করা হয়। pre- এবং post- ফিল্ডের ভ্যালু নিম্নলিখিত সংশ্লিষ্ট বিল্ড প্রপার্টি থেকে নেওয়া হয়েছে।

  • pre-device ভ্যালু ro.product.device বিল্ড প্রপার্টি থেকে পাওয়া গেছে।
  • ro.build.version.incremental বিল্ড প্রপার্টি থেকে pre-build-incremental ও post-build-incremental ভ্যালু পাওয়া যায়।
  • pre-build ও post-build ভ্যালুগুলি ro.build.fingerprint বিল্ড প্রপার্টি থেকে নেওয়া হয়।

Android 11 বা তার পরবর্তী যেকোনও ভার্সন দ্বারা পরিচালিত ডিভাইসে, আপনি OTA টুলে --boot_variable_file ফ্ল্যাগ ব্যবহার করে এমন ফাইলের পাথ নির্দিষ্ট করতে পারবেন যেটিতে ডিভাইসের ডায়নামিক ফিঙ্গারপ্রিন্ট তৈরি করার জন্য ব্যবহৃত রানটাইম ভেরিয়েবলের ভ্যালু থাকে। তারপর, pre- এবং post- শর্তে ডিভাইসের নাম এবং ফিঙ্গারপ্রিন্ট অন্তর্ভুক্ত করার জন্য OTA মেটাডেটা আপডেট করতে ডেটা ব্যবহার করা হয় (ডিলিমিটার হিসেবে পাইপ অক্ষর | ব্যবহার করে)। --boot_variable_file ফ্ল্যাগে নিম্নলিখিত সিনট্যাক্স ও বিবরণ আছে।

  • সিনট্যাক্স: --boot_variable_file <path>
  • বিবরণ: এমন ফাইলের পাথ নির্দিষ্ট করে যাতে ro.boot.* প্রপার্টির সম্ভাব্য ভ্যালু থাকে। ইমপোর্ট স্টেটমেন্টের মাধ্যমে কিছু ro.product.* প্রপার্টি ওভাররাইড করা হলে, সম্ভাব্য রানটাইম ফিঙ্গারপ্রিন্ট গণনা করতে ব্যবহৃত হয়। ফাইলে প্রতি লাইনে একটি করে প্রপার্টি থাকতে হবে এবং প্রতিটি লাইনের ফর্ম্যাট নিম্নলিখিত হতে হবে: prop_name=value1,value2.

যেমন, প্রপার্টি ro.boot.product.hardware.sku=std,pro হলে, tardis ও tardispro ডিভাইসের OTA মেটাডেটা নিচে দেখানো হল।

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

Android 10 ভার্সনে চলে এমন ডিভাইসে এই কার্যকারিতা কাজ করানোর জন্য, রেফারেন্স ইমপ্লিমেন্টেশন দেখুন। এই পরিবর্তন তালিকা শর্তসাপেক্ষে build.prop ফাইলে import স্টেটমেন্ট পার্স করে, যা প্রপার্টি ওভাররাইডকে শনাক্ত করতে এবং চূড়ান্ত OTA মেটাডেটাতে প্রতিফলিত করতে সক্ষম করে।