ইন্টারফেস হ্যাশিং

এই ডকুমেন্টে HIDL ইন্টারফেস হ্যাশিংয়ের বিবরণ দেওয়া আছে। এটি হল এমন একটি মেকানিজম যা আকস্মিক ইন্টারফেস পরিবর্তন প্রতিরোধ করে এবং ইন্টারফেস পরিবর্তনগুলি পুঙ্খানুপুঙ্খভাবে যাচাই করা হয়েছে কিনা তা নিশ্চিত করে। এই মেকানিজমটি প্রয়োজন কারণ HIDL ইন্টারফেসের ভার্সন আছে, যার অর্থ হল কোনও ইন্টারফেস রিলিজ করার পরে, অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) সংরক্ষণকারী পদ্ধতি (যেমন, কমেন্ট সংশোধন) ছাড়া এটি পরিবর্তন করা যাবে না।

লেআউট

প্রতিটি প্যাকেজ রুট ডিরেক্টরিতে (যেমন, android.hardware-এর সাথে hardware/interfaces বা vendor.foo-এর সাথে vendor/foo/hardware/interfaces ম্যাপ করা) অবশ্যই একটি current.txt ফাইল থাকতে হবে যা রিলিজ করা সব HIDL ইন্টারফেস ফাইলের তালিকা দেখায়।

# current.txt files support comments starting with a '#' character
# this file, for instance, would be vendor/foo/hardware/interfaces/current.txt

# Each line has a SHA-256 hash followed by the name of an interface.
# They have been shortened in this doc for brevity but they are
# 64 characters in length in an actual current.txt file.
d4ed2f0e...995f9ec4 vendor.awesome.foo@1.0::IFoo # comments can also go here

# types.hal files are also noted in current.txt files
c84da9f5...f8ea2648 vendor.awesome.foo@1.0::types

# Multiple hashes can be in the file for the same interface. This can be used
# to note how ABI sustaining changes were made to the interface.
# For instance, here is another hash for IFoo:

# Fixes type where "FooCallback" was misspelled in comment on "FooStruct"
822998d7...74d63b8c vendor.awesome.foo@1.0::IFoo

মনে রাখবেন: কোন হ্যাশ কোথা থেকে এসেছে তা ট্র্যাক করতে সাহায্য করার জন্য, Google HIDL current.txt ফাইলগুলিকে আলাদা বিভাগে ভাগ করে: প্রথম বিভাগটি হল Android 8-এ রিলিজ করা হয়েছে; পরের বিভাগটি Android 8 MR1-এ রিলিজ করা হয়েছে। আমরা বিশেষভাবে সাজেস্ট করি যে আপনার current.txt ফাইলে একই ধরনের লেআউট ব্যবহার করুন।

hidl-gen সহ হ্যাশ

আপনি current.txt ফাইলে ম্যানুয়ালি বা hidl-gen ব্যবহার করে হ্যাশ যোগ করতে পারবেন। hidl-gen-এর সাথে ব্যবহার করা যায় এমন কমান্ডের উদাহরণ নিচে দেওয়া কোড স্নিপেটে দেওয়া হল। এর সাহায্যে current.txt ফাইল ম্যানেজ করা যায় (হ্যাশ সংক্ষিপ্ত করা হয়েছে):

hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0::types
9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0::INfc
07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0
9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
f2fe5442...72655de6 vendor.awesome.nfc@1.0::INfcClientCallback
hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0 >> vendor/awesome/hardware/interfaces/current.txt

সতর্কতা: আগে রিলিজ করা ইন্টারফেসের জন্য হ্যাশ পরিবর্তন করবেন না। এই ধরনের ইন্টারফেস পরিবর্তন করার সময়, current.txt ফাইলের শেষে একটি নতুন হ্যাশ যোগ করুন। আরও বিবরণের জন্য, ABI স্টেবিলিটি দেখুন।

hidl-gen-এর মাধ্যমে তৈরি করা প্রতিটি ইন্টারফেস সংজ্ঞা লাইব্রেরিতে হ্যাশ অন্তর্ভুক্ত থাকে, যা IBase::getHashChain কল করে পাওয়া যেতে পারে। hidl-gen কোনও ইন্টারফেস কম্পাইল করার সময়, HAL পরিবর্তন করা হয়েছে কিনা তা দেখতে HAL প্যাকেজের রুট ডিরেক্টরিতে current.txt ফাইল চেক করে:

  • HAL-এর জন্য কোনও হ্যাশ খুঁজে না পাওয়া গেলে, ইন্টারফেসটি রিলিজ করা হয়নি (ডেভেলপমেন্ট প্রসেসে আছে) বলে ধরে নেওয়া হয় এবং কম্পাইলেশন প্রসেস চলতে থাকে।
  • হ্যাশ পাওয়া গেলে, বর্তমান ইন্টারফেসের সাথে সেগুলি চেক করা হয়:
    • ইন্টারফেসটি হ্যাশের সাথে ম্যাচ করলে, কম্পাইলেশন প্রসেস চলতে থাকে।
    • ইন্টারফেস কোনও হ্যাশের সাথে না মিললে, কম্পাইলেশন বন্ধ করে দেওয়া হয়, কারণ এর অর্থ হল আগে রিলিজ করা ইন্টারফেস পরিবর্তন করা হচ্ছে।
      • ABI-সংরক্ষণকারী পরিবর্তনের জন্য (ABI স্টেবিলিটি দেখুন), কম্পাইলেশন শুরু করার আগে current.txt ফাইল অবশ্যই পরিবর্তন করতে হবে।
      • অন্যান্য সব পরিবর্তন ইন্টারফেসের মাইনর বা মেজর ভার্সন আপগ্রেডে করা উচিত।

ABI স্থিতিশীলতা

ABI-তে বাইনারি লিঙ্কেজ/কলিং কনভেনশন/ইত্যাদি থাকে। ABI বা API পরিবর্তিত হলে, ইন্টারফেসটি অফিসিয়াল ইন্টারফেসের সাথে কম্পাইল করা জেনেরিক system.img-এর সাথে আর কাজ করে না।

ইন্টারফেসের ভার্সন আছে এবং ABI স্থিতিশীল কিনা তা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ কারণ:

  • এটি নিশ্চিত করে যে আপনার প্রয়োগ করা ভেন্ডর টেস্ট স্যুট (VTS) পাস করতে পারবে, যা আপনাকে ফ্রেমওয়ার্ক-অনলি OTA করতে পারার জন্য সঠিক পথে রাখে।
  • OEM হিসেবে, এটি আপনাকে একটি বোর্ড সাপোর্ট প্যাকেজ (BSP) প্রদান করতে সক্ষম করে যা ব্যবহার করা সহজ এবং মেনে চলে।
  • কোন ইন্টারফেস রিলিজ করা যেতে পারে তা ট্র্যাক করতে এটি আপনাকে সাহায্য করে। current.txt ইন্টারফেস ডিরেক্টরির একটি ম্যাপের কথা বিবেচনা করুন যা আপনাকে প্যাকেজ রুটে প্রদান করা সমস্ত ইন্টারফেসের ইতিহাস এবং অবস্থা দেখতে দেয়।

যে ইন্টারফেসের জন্য আগে থেকেই current.txt-এ এন্ট্রি আছে, সেটির জন্য নতুন হ্যাশ যোগ করার সময়, শুধুমাত্র সেইসব হ্যাশ যোগ করুন যেগুলি ABI স্থিতিশীলতা বজায় রাখে এমন ইন্টারফেসকে প্রতিনিধিত্ব করে। নিম্নলিখিত ধরনের পরিবর্তনগুলি পর্যালোচনা করুন:

পরিবর্তন করার অনুমতি দেওয়া হয়েছে
  • কোনও কমেন্ট পরিবর্তন করা (যদি না এটি কোনও পদ্ধতির অর্থ পরিবর্তন করে)।
  • প্যারামিটারের নাম পরিবর্তন করা।
  • রিটার্ন প্যারামিটারের নাম পরিবর্তন করা।
  • অ্যানোটেশন পরিবর্তন করা।
পরিবর্তন করার অনুমতি নেই
  • আর্গুমেন্ট, পদ্ধতি ইত্যাদি আবার সাজানো।
  • ইন্টারফেসের নাম পরিবর্তন করা বা এটিকে নতুন প্যাকেজে সরানো।
  • প্যাকেজের নাম পরিবর্তন করা।
  • ইন্টারফেসে যেকোনও জায়গায় কোনও পদ্ধতি/স্ট্রাক ফিল্ড/ইত্যাদি যোগ করা।
  • C++ vtable-কে ভেঙে দিতে পারে এমন যেকোনও কিছু।
  • ইত্যাদি