การแฮชอินเทอร์เฟซ

เอกสารนี้อธิบายการแฮชอินเทอร์เฟซ HIDL ซึ่งเป็นกลไกป้องกันการเปลี่ยนแปลงอินเทอร์เฟซโดยไม่ตั้งใจ และตรวจสอบการเปลี่ยนแปลงอินเทอร์เฟซอย่างละเอียด ต้องใช้กลไกนี้เนื่องจากอินเทอร์เฟซ HIDL มีเวอร์ชัน ซึ่งหมายความว่าหลังจากเผยแพร่อินเทอร์เฟซแล้ว จะต้องไม่มีการเปลี่ยนแปลงใดๆ ยกเว้นในลักษณะที่เก็บ Application Binary Interface (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 ออกเป็นส่วนต่างๆ เพื่อช่วยในการติดตามว่าแฮชแต่ละรายการมาจากที่ใด โดยส่วนที่ 1 คือเผยแพร่ใน 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 คอมไพล์อินเทอร์เฟซ ระบบจะตรวจสอบไฟล์ current.txt ในไดเรกทอรีรูทของแพ็กเกจ HAL เพื่อดูว่า HAL มีการเปลี่ยนแปลงหรือไม่ โดยทำดังนี้

  • หากไม่พบแฮชสําหรับ HAL ระบบจะถือว่าอินเทอร์เฟซนั้นยังไม่เผยแพร่ (อยู่ระหว่างการพัฒนา) และดำเนินการคอมไพล์ต่อ
  • หากพบแฮช ระบบจะตรวจสอบแฮชกับอินเทอร์เฟซปัจจุบัน ดังนี้
    • หากอินเทอร์เฟซตรงกับแฮช ระบบจะดำเนินการคอมไพล์ต่อ
    • หากอินเทอร์เฟซไม่ตรงกับแฮช ระบบจะหยุดการคอมไพล์เนื่องจากมีการเปลี่ยนแปลงอินเทอร์เฟซที่เผยแพร่ก่อนหน้านี้
      • สำหรับการเปลี่ยนแปลงที่รักษา ABI (ดูความเสถียรของ ABI) ไฟล์ current.txt ต้องได้รับการแก้ไขก่อนการคอมไพล์จึงจะดำเนินการต่อได้
      • การเปลี่ยนแปลงอื่นๆ ทั้งหมดควรทำในการอัปเกรดอินเทอร์เฟซเป็นเวอร์ชันย่อยหรือเวอร์ชันหลัก

ความเสถียรของ ABI

ABI ประกอบด้วยการลิงก์แบบไบนารี/รูปแบบการเรียกใช้/ฯลฯ หาก ABI หรือ API มีการเปลี่ยนแปลง อินเทอร์เฟซจะไม่ทำงานกับ system.img ทั่วไปที่คอมไพล์ด้วยอินเทอร์เฟซอย่างเป็นทางการอีกต่อไป

การตรวจสอบว่าอินเทอร์เฟซมีเวอร์ชันและ ABI ทำงานได้อย่างเสถียรนั้นสำคัญอย่างยิ่งด้วยเหตุผลหลายประการ ดังนี้

  • การดำเนินการนี้ช่วยให้มั่นใจได้ว่าการติดตั้งใช้งานจะผ่านชุดทดสอบของผู้ให้บริการ (VTS) ซึ่งจะช่วยให้คุณดำเนินการ OTA เฉพาะเฟรมเวิร์กได้
  • ในฐานะ OEM คุณจะจัดหา Board Support Package (BSP) ที่ใช้งานง่ายและเป็นไปตามข้อกำหนดได้
  • ซึ่งจะช่วยให้คุณติดตามได้ว่าอินเทอร์เฟซใดบ้างที่เผยแพร่ได้ ลองพิจารณาcurrent.txtแผนที่ของไดเรกทอรีอินเทอร์เฟซที่ช่วยให้คุณดูประวัติและสถานะของอินเทอร์เฟซทั้งหมดที่ระบุไว้ในรูทของแพ็กเกจได้

เมื่อเพิ่มแฮชใหม่สำหรับอินเทอร์เฟซที่มีรายการใน current.txt อยู่แล้ว โปรดตรวจสอบว่าได้เพิ่มเฉพาะแฮชที่แสดงถึงอินเทอร์เฟซที่รักษาเสถียรภาพของ ABI ตรวจสอบการเปลี่ยนแปลงประเภทต่อไปนี้

อนุญาตการเปลี่ยนแปลง
  • การเปลี่ยนความคิดเห็น (เว้นแต่ว่าจะทำให้ความหมายของวิธีการเปลี่ยนไป)
  • การเปลี่ยนชื่อพารามิเตอร์
  • การเปลี่ยนชื่อพารามิเตอร์ผลลัพธ์
  • การเปลี่ยนคำอธิบายประกอบ
ไม่อนุญาตให้เปลี่ยนแปลง
  • การจัดเรียงอาร์กิวเมนต์ วิธีการ และอื่นๆ ใหม่
  • การเปลี่ยนชื่ออินเทอร์เฟซหรือย้ายอินเทอร์เฟซไปยังแพ็กเกจใหม่
  • การเปลี่ยนชื่อแพ็กเกจ
  • การเพิ่มเมธอด/ฟิลด์โครงสร้าง/อื่นๆ ในที่ใดก็ได้ในอินเทอร์เฟซ
  • ทุกอย่างที่อาจทำให้ vtable ของ C++ ใช้งานไม่ได้
  • etc. (ฯลฯ)