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

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

ระบบไม่รองรับเวอร์ชันอิมเมจแบบผสมสำหรับรายการต่อไปนี้

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

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

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

สแนปชอตของผู้ให้บริการคือสแนปชอตที่ 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

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

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

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