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

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 จากแฟล็ก 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