สร้างสแนปชอตผู้ให้บริการ

Android 11 รองรับอาร์ติแฟกต์บิลด์ VNDK และสแนปชอตผู้ให้บริการ ซึ่งคุณใช้บิลด์ vendor.img ได้ไม่ว่า Android ในแผนผังต้นทางจะเป็นเวอร์ชันใดก็ตาม ซึ่งจะช่วยให้ใช้ภาพเวอร์ชันต่างๆ ได้ เช่น เวนเดอร์รายเก่าและภาพระบบเวอร์ชันใหม่

ระบบไม่รองรับรูปภาพผสมเวอร์ชันต่อไปนี้

  • Android.mk. เนื่องจาก Soong จะสร้างภาพรวมของผู้ให้บริการ ระบบจะไม่บันทึกโมดูลที่กําหนดไว้ใน Android.mk เป็นภาพรวมของผู้ให้บริการ (นอกจากนี้ ระบบยังไม่รับประกันว่าโมดูลที่เป็นกรรมสิทธิ์ของ SoC ใน Android.mk จะทํางานได้)

  • เครื่องฆ่าเชื้อ สแน็ปชอตของผู้ให้บริการและ VNDK ไม่รองรับโปรแกรมตรวจสอบเนื่องจากต้องสร้างตัวแปรของโปรแกรมตรวจสอบแยกต่างหาก

เกี่ยวกับภาพรวมผู้ให้บริการ

สแนปชอตของผู้ให้บริการคือสแนปชอตที่เป็นของ OEM ซึ่งเป็นชุดโมดูล C++ ที่คอมไพล์ไว้ล่วงหน้าซึ่งติดตั้งใน /vendor แต่ได้รับการดูแลรักษาใน AOSP หากไม่จับภาพสแนปชอตของผู้ให้บริการใน Android เวอร์ชันก่อนหน้า การอัปเกรดไปใช้ Android เวอร์ชันใหม่อาจทำให้พาร์ติชันผู้ให้บริการเสียหายได้ เนื่องจากอาจนำโมดูลสแนปชอตของผู้ให้บริการออกหรือเปลี่ยนแปลงได้โดยที่ไม่ต้องใช้ API หรือ ABI ร่วมกัน

สแนปชอตผู้ให้บริการมีโมดูลต่อไปนี้บน AOSP

  • ไลบรารีที่ใช้ร่วมกัน คงที่ และส่วนหัวที่มี vendor: true หรือ vendor_available: true
  • ไลบรารีแบบคงที่ของ VNDK ที่มี vendor_available: true
  • ไฟล์ปฏิบัติการและไฟล์ออบเจ็กต์ที่มี vendor: true หรือ vendor_available: true

ระบบจะถือว่าโมดูลที่อยู่ในไดเรกทอรีต่อไปนี้เป็นโค้ดฮาร์ดแวร์ของ SoC และจะไม่สนใจ

  • device/
  • vendor/
  • hardware/ ยกเว้น
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

รหัสฮาร์ดแวร์ของ SoC อาจอยู่ในไดเรกทอรีอื่นๆ ด้วย ขณะนี้ภาพรวมของผู้ให้บริการยังไม่รองรับการกำหนดค่าดังกล่าว

สร้างสแนปชอตผู้ให้บริการ

สร้างสแนปชอตผู้ให้บริการโดยใช้คำสั่งต่อไปนี้

. build/envsetup.sh
lunch target
m dist vendor-snapshot

คำสั่งเหล่านี้จะสร้างไฟล์ vendor-$(TARGET_DEVICE).zip ใน $DIST_DIR ตัวอย่างต่อไปนี้แสดงไฟล์ ZIP ของภาพรวมผู้ให้บริการ

vendor-$(TARGET_DEVICE).zip
├── arch-arm64-armv8-a
│   ├── binary         -> binary files, *.json files
│   ├── header         -> *.json files
│   ├── object         -> *.o files, *.json files
│   ├── shared         -> *.so files, *.json files
│   └── static         -> *.a files, *.json files
├── arch-arm-armv8-a   -> (arch-arm64-armv8-a)
├── configs            -> *.rc files, *.xml files
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files
  • ไฟล์ JSON มีแฟล็ก เช่น ชื่อโมดูล ไดเรกทอรีที่ส่งออก ไฟล์ init_rc และไฟล์ vintf_fragments
  • ไดเรกทอรี configs มีไฟล์ .rc และ .xml จาก Flag init_rc และ vintf_fragments

ติดตั้งสแนปชอตของผู้ให้บริการ

หากต้องการติดตั้งสแนปชอตของผู้ให้บริการ ให้ไปที่ไดเรกทอรีปลายทางและใช้คำสั่งต่อไปนี้

python3 development/vendor_snapshot/update.py --local $DIST_DIR --install-dir \
    vendor/vendor name/vendor_snapshot VER

คำสั่งนี้จะสร้าง /vendor/vendor name/vendor_snapshot/vVER/$(TARGET_ARCH)/Android.bp ตัวอย่างต่อไปนี้แสดงโครงสร้างไดเรกทอรีของภาพรวมผู้ให้บริการ

vendor/vendor name/vendor_snapshot/
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a
│   │   │   ├── binary         -> (prebuilt libs)
│   │   │   ├── object         -> (prebuilt libs)
│   │   │   ├── shared         -> (prebuilt libs)
│   │   │   └── static         -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (same as above)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (snapshot modules)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   └── x86                    -> (same as above)
└── (other vendor versions)    -> (same as above)

สร้างอิมเมจของผู้ให้บริการ

เมื่อใช้อาร์ติแฟกต์การสร้างสแนปชอต VNDK และภาพรวมของผู้ให้บริการ คุณจะสร้าง vendor.img ได้โดยไม่คำนึงถึงเวอร์ชัน Android ในซอร์สทรี ซึ่งทำให้สร้างอิมเมจได้หลายเวอร์ชัน หลังจากติดตั้งทั้งสแนปชอต VNDK และสแนปชอตของผู้ให้บริการแล้ว ให้ตั้งค่า BOARD_VNDK_VERSION เป็นเวอร์ชันของผู้ให้บริการ เช่น

# BoardConfig.mk
BOARD_VNDK_VERSION := 29

เมื่อตั้งค่า BOARD_VNDK_VERSION เป็นค่าอื่นที่ไม่ใช่ current ระบบจะดำเนินการดังนี้

  • เปิดใช้โมดูลสแนปชอต VNDK และโมดูลสแนปชอตของผู้ให้บริการของ BOARD_VNDK_VERSION โมดูลภาพรวมแต่ละรายการจะลบล้างโมดูลแหล่งที่มา C++ ที่มีชื่อเดียวกัน
  • ตั้งค่า ro.vndk.version เป็น BOARD_VNDK_VERSION
  • ติดตั้งโมดูลสแนปชอต VNDK ของ BOARD_VNDK_VERSION ถึง system_ext