เปิดใช้งาน VNDK

VNDK ต้องการการเปลี่ยนแปลงโค้ดเบสหลายประการเพื่อแยกข้อกังวลระหว่างผู้จำหน่ายและระบบ ใช้คำแนะนำต่อไปนี้เพื่อเปิดใช้งาน VNDK ในฐานรหัสของผู้จำหน่าย/OEM

สร้างไลบรารีระบบ

ระบบบิลด์ประกอบด้วยอ็อบเจ็กต์หลายประเภท รวมถึงไลบรารี (แบบแบ่งใช้ สแตติก หรือส่วนหัว) และไบนารี

สร้างไลบรารีระบบ
รูปที่ 1. สร้างไลบรารีระบบ
  • ไลบรารี core ถูกใช้โดยอิมเมจระบบบนอิมเมจระบบ ไลบรารีเหล่านี้ไม่สามารถใช้โดย vendor , vendor_available , vndk หรือ vndk-sp ไลบรารี
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • ไลบรารี vendor-only (หรือ proprietary ) ถูกใช้โดยอิมเมจของผู้จำหน่าย บนอิมเมจของผู้จำหน่าย
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
    
  • ไลบรารี vendor_available ถูกใช้โดยอิมเมจของผู้จำหน่าย บนอิมเมจของผู้จำหน่าย (อาจมีข้อมูลที่ซ้ำกันของ core )
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
    
  • อิมเมจผู้ขายใช้ไลบรารี vndk บนอิมเมจระบบ
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
    
  • ไลบรารี vndk-sp ถูกใช้โดยอิมเมจของผู้จำหน่าย และโดยอิมเมจระบบทางอ้อมด้วย
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
    
  • ไลบรารี llndk ถูกใช้โดยทั้งระบบและอิมเมจของผู้จำหน่าย
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }
    

เมื่อ lib ถูกทำเครื่องหมายเป็น vendor_available:true มันจะถูกสร้างขึ้นสองครั้ง:

  • หนึ่งครั้งสำหรับแพลตฟอร์ม (และติดตั้งลงใน /system/lib )
  • หนึ่งครั้งสำหรับผู้จำหน่าย (และติดตั้งลงใน /vendor/lib หรือ VNDK APEX)

libs เวอร์ชันผู้ขายถูกสร้างขึ้นด้วย -D__ANDROID_VNDK__ ส่วนประกอบของระบบส่วนตัวที่อาจมีการเปลี่ยนแปลงอย่างมากใน Android เวอร์ชันต่อๆ ไปจะถูกปิดใช้งานด้วยแฟล็กนี้ นอกจากนี้ ไลบรารีต่างๆ จะส่งออกชุดส่วนหัวที่แตกต่างกัน (เช่น liblog ) ตัวเลือกเฉพาะสำหรับตัวแปรผู้จำหน่ายของเป้าหมายสามารถระบุได้ในไฟล์ Android.bp ใน:

target: { vendor: { … } }

การเปิดใช้งาน VNDK สำหรับโค้ดเบส

หากต้องการเปิดใช้งาน VNDK สำหรับโค้ดเบส:

  1. กำหนดคุณสมบัติโดยการคำนวณขนาดที่ต้องการของพาร์ติชัน vendor.img และ system.img
  2. เปิดใช้งาน BOARD_VNDK_VERSION=current คุณสามารถเพิ่ม BoardConfig.mk หรือสร้างส่วนประกอบได้โดยตรง (เช่น m -j BOARD_VNDK_VERSION=current MY-LIB )

หลังจากเปิดใช้งาน BOARD_VNDK_VERSION=current แล้ว ระบบบิลด์จะบังคับใช้การขึ้นต่อกันและข้อกำหนดส่วนหัวต่อไปนี้

การจัดการการพึ่งพา

วัตถุ vendor ที่ขึ้นอยู่กับองค์ประกอบ core ที่ไม่มีอยู่ใน vndk หรือเป็นวัตถุ vendor ต้องได้รับการแก้ไขโดยใช้หนึ่งในตัวเลือกต่อไปนี้:

  • การพึ่งพาสามารถลบออกได้
  • หาก vendor เป็นเจ้าของส่วนประกอบ core ก็สามารถทำเครื่องหมายเป็น vendor_available หรือ vendor ได้
  • การเปลี่ยนแปลงที่ทำให้วัตถุหลักเป็นส่วนหนึ่งของ vndk อาจถูกอัปสตรีมไปยัง Google

นอกจากนี้ หากส่วนประกอบ core มีการพึ่งพาส่วนประกอบของ vendor ส่วนประกอบ vendor จะต้องถูกทำให้เป็นส่วนประกอบ core หรือ การขึ้นต่อกันจะต้องถูกลบออกด้วยวิธีอื่น (ตัวอย่างเช่น โดยการเอาการขึ้นต่อกันออก หรือโดยการย้ายการขึ้นต่อกันไปยังส่วนประกอบ vendor ).

การจัดการส่วนหัว

ต้องลบการพึ่งพาส่วนหัวส่วนกลางออกเพื่อให้ระบบ build ทราบว่าจะสร้างส่วนหัวโดยมีหรือไม่มี -D__ANDROID_VNDK__ ตัวอย่างเช่น ส่วนหัว libutils เช่น utils/StrongPointer.h ยังคงสามารถเข้าถึงได้โดยใช้ไลบรารีส่วนหัว libutils_headers

ส่วนหัวบางรายการ (เช่น unistd.h ) ไม่สามารถรวมแบบส่งผ่านได้อีกต่อไป แต่สามารถรวมไว้ในเครื่องได้

ในที่สุด ส่วนสาธารณะของ private/android_filesystem_config.h ได้ถูกย้ายไปที่ cutils/android_filesystem_config.h หากต้องการจัดการส่วนหัวเหล่านี้ ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:

  • ลบการพึ่งพาไปยัง private/android_filesystem_config.h โดยแทนที่มาโคร AID_* ทั้งหมดด้วยการเรียก getgrnam / getpwnam หากเป็นไปได้ ตัวอย่างเช่น:
    • (uid_t)AID_WIFI กลายเป็น getpwnam("wifi")->pw_uid
    • (gid_t)AID_SDCARD_R กลายเป็น getgrnam("sdcard_r")->gr_gid
    สำหรับรายละเอียด โปรดดูที่ private/android_filesystem_config.h
  • สำหรับ AIS แบบฮาร์ดโค้ด ให้รวม cutils/android_filesystem_config.h