เนมสเปซ Linker

ตัวลิงก์แบบไดนามิกช่วยแก้ปัญหา 2 ข้อในการออกแบบ Treble VNDK ดังนี้

  • ระบบจะโหลดไลบรารีที่ใช้ร่วมกันของ SP-HAL และไลบรารีที่เกี่ยวข้อง ซึ่งรวมถึงไลบรารี VNDK-SP ลงในกระบวนการเฟรมเวิร์ก ควรมีกลไกบางอย่างเพื่อป้องกันไม่ให้สัญลักษณ์ทับซ้อนกัน
  • dlopen() และ android_dlopen_ext() อาจทำให้เกิดข้อกําหนดในรันไทม์บางอย่างที่มองไม่เห็นขณะสร้าง และตรวจจับได้ยากโดยใช้การวิเคราะห์แบบคงที่

ปัญหาทั้ง 2 ข้อนี้แก้ไขได้ด้วยกลไกเนมสเปซของ linker กลไกนี้มาจากตัวลิงก์แบบไดนามิก ซึ่งสามารถแยกไลบรารีที่ใช้ร่วมกันในเนมสเปซของ linker ที่แตกต่างกันได้ เพื่อไม่ให้ไลบรารีที่มีชื่อเดียวกันแต่มีสัญลักษณ์ต่างกันเกิดข้อขัดแย้ง

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

เช่น /system/lib[64]/libcutils.so และ /system/lib[64]/vndk-sp-${VER}/libcutils.so เป็น 2 ไลบรารีที่แชร์ โดยคลังทั้ง 2 นี้อาจมีสัญลักษณ์ต่างกัน ระบบจะโหลดไฟล์เหล่านี้ลงในเนมสเปซของ linker ที่แตกต่างกันเพื่อให้โมดูลเฟรมเวิร์กใช้ /system/lib[64]/libcutils.so ได้ และไลบรารีที่ใช้ร่วมกันของ SP-HAL สามารถใช้ /system/lib[64]/vndk-sp-${VER}/libcutils.so ได้

ในทางกลับกัน /system/lib[64]/libc.so เป็นตัวอย่างของห้องสมุดสาธารณะที่ส่งออกโดยเนมสเปซ linker และนําเข้าไปยังเนมสเปซ linker หลายรายการ ระบบจะโหลดไลบรารีที่ใช้ร่วมกันของ /system/lib[64]/libc.so เช่น libnetd_client.so ลงในเนมสเปซที่ /system/lib[64]/libc.so อยู่ เนมสเปซอื่นๆ จะไม่มีสิทธิ์เข้าถึงข้อมูลดังกล่าว กลไกนี้จะรวมรายละเอียดการใช้งานไว้ขณะที่ให้บริการอินเทอร์เฟซสาธารณะ

วิธีการทำงาน

ตัวลิงก์แบบไดนามิกมีหน้าที่โหลดไลบรารีที่ใช้ร่วมกันที่ระบุไว้ในรายการ DT_NEEDED หรือไลบรารีที่ใช้ร่วมกันที่ระบุโดยอาร์กิวเมนต์ของ dlopen() หรือ android_dlopen_ext() ไม่ว่าจะในกรณีใด โปรแกรมเชื่อมโยงแบบไดนามิกจะค้นหาเนมสเปซของโปรแกรมเชื่อมโยงที่ตัวเรียกใช้อยู่ และพยายามโหลดทรัพยากร Dependency ลงในเนมสเปซของโปรแกรมเชื่อมโยงเดียวกัน หากตัวลิงก์แบบไดนามิกโหลดไลบรารีที่ใช้ร่วมกันลงในเนมสเปซของตัวลิงก์ที่ระบุไม่ได้ ก็จะขอไลบรารีที่ใช้ร่วมกันที่ส่งออกจากเนมสเปซของตัวลิงก์ที่ลิงก์

รูปแบบไฟล์การกําหนดค่า

รูปแบบไฟล์กําหนดค่าจะอิงตามรูปแบบไฟล์ INI ไฟล์การกําหนดค่าทั่วไปมีลักษณะดังนี้

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

[system]
additional.namespaces = sphal,vndk

namespace.default.isolated = true
namespace.default.search.paths = /system/${LIB}
namespace.default.permitted.paths = /system/${LIB}/hw
namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}
namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

namespace.sphal.isolated = true
namespace.sphal.visible = true
namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.asan.search.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.asan.permitted.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.links = default,vndk
namespace.sphal.link.default.shared_libs = libc.so:libm.so
namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so

namespace.vndk.isolated = true
namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.links = default
namespace.vndk.link.default.shared_libs = libc.so:libm.so

[vendor]
namespace.default.isolated = false
namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}

ไฟล์การกําหนดค่าประกอบด้วย

  • พร็อพเพอร์ตี้การแมปส่วนไดเรกทอรีหลายรายการในช่วงต้นเพื่อให้ตัวลิงก์แบบไดนามิกเลือกส่วนที่มีประสิทธิภาพ
  • ส่วนการกําหนดค่าเนมสเปซของ linker หลายส่วน
    • แต่ละส่วนจะมีเนมสเปซหลายรายการ (จุดยอดของกราฟ) และลิงก์สำรองหลายรายการระหว่างเนมสเปซ (ส่วนโค้งของกราฟ)
    • เนมสเปซแต่ละรายการมีการแยก เส้นทางการค้นหา เส้นทางที่อนุญาต และการตั้งค่าระดับการเข้าถึงของตนเอง

ตารางด้านล่างจะอธิบายความหมายของพร็อพเพอร์ตี้แต่ละรายการโดยละเอียด

พร็อพเพอร์ตี้การแมปส่วนไดเรกทอรี

พร็อพเพอร์ตี้ คำอธิบาย ตัวอย่าง

dir.name

เส้นทางไปยังไดเรกทอรีที่ใช้กับส่วน [name]

พร็อพเพอร์ตี้แต่ละรายการจะแมปไฟล์ปฏิบัติการภายใต้ไดเรกทอรีไปยังส่วนการกําหนดค่าเนมสเปซของโปรแกรมลิงก์ อาจมีพร็อพเพอร์ตี้ 2 (หรือมากกว่า) รายการที่มี name เดียวกัน แต่ชี้ไปยังไดเรกทอรีที่แตกต่างกัน

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

ซึ่งหมายความว่าการกําหนดค่าที่ระบุในส่วน [system] จะมีผลกับไฟล์ปฏิบัติการที่โหลดจาก /system/bin หรือ /system/xbin

การกําหนดค่าที่ระบุในส่วน [vendor] จะมีผลกับไฟล์ปฏิบัติการที่โหลดจาก /vendor/bin

พร็อพเพอร์ตี้ความสัมพันธ์

พร็อพเพอร์ตี้ คำอธิบาย ตัวอย่าง
additional.namespaces

รายการเนมสเปซเพิ่มเติมที่คั่นด้วยคอมมา (นอกเหนือจากเนมสเปซ default) สำหรับส่วนนั้น

additional.namespaces = sphal,vndk

ซึ่งหมายความว่ามีเนมสเปซ 3 รายการ (default, sphal และ vndk) ในการกำหนดค่า [system]

namespace.name.links

รายการเนมสเปซสำรองที่คั่นด้วยคอมมา

หากไม่พบไลบรารีที่ใช้ร่วมกันในเนมสเปซปัจจุบัน โปรแกรมลิงก์แบบไดนามิกจะพยายามโหลดไลบรารีที่ใช้ร่วมกันจากเนมสเปซสำรอง เนมสเปซที่ระบุไว้ที่ด้านบนของรายการจะมีลำดับความสำคัญสูงกว่า

namespace.sphal.links = default,vndk

หากไลบรารีที่ใช้ร่วมกันหรือไฟล์ปฏิบัติการขอไลบรารีที่ใช้ร่วมกันซึ่งโหลดลงในเนมสเปซ sphal ไม่ได้ ตัวลิงก์แบบไดนามิกจะพยายามโหลดไลบรารีที่ใช้ร่วมกันจากเนมสเปซ default

จากนั้น หากโหลดไลบรารีที่ใช้ร่วมกันจากเนมสเปซ default ไม่ได้เช่นกัน ตัวลิงก์แบบไดนามิกจะพยายามโหลดไลบรารีที่ใช้ร่วมกันจากเนมสเปซ vndk

สุดท้าย หากพยายามดำเนินการทั้งหมดแล้วไม่สำเร็จ ตัวเชื่อมโยงแบบไดนามิกจะแสดงข้อผิดพลาด

namespace.name.link.other.shared_libs

รายการไลบรารีที่ใช้ร่วมกันที่คั่นด้วยโคลอนซึ่งสามารถค้นหาได้ในเนมสเปซ other เมื่อไม่พบไลบรารีเหล่านั้นในเนมสเปซ name

พร็อพเพอร์ตี้นี้ใช้ร่วมกับ namespace.name.link.other.allow_all_shared_libs ไม่ได้

namespace.sphal.link.default.shared_libs = libc.so:libm.so

ซึ่งหมายความว่าลิงก์สำรองยอมรับเฉพาะ libc.so หรือ libm.so เป็นชื่อไลบรารีที่ขอ โปรแกรมลิงก์แบบไดนามิกจะไม่สนใจลิงก์สำรองจากเนมสเปซ sphal ไปยัง default หากชื่อไลบรารีที่ขอไม่ใช่ libc.so หรือ libm.so

namespace.name.link.other.allow_all_shared_libs

ค่าบูลีนซึ่งระบุว่าสามารถค้นหาไลบรารีที่ใช้ร่วมกันทั้งหมดในเนมสเปซ other ได้หรือไม่เมื่อไม่พบไลบรารีเหล่านั้นในเนมสเปซ name

พร็อพเพอร์ตี้นี้ใช้ร่วมกับ namespace.name.link.other.shared_libs ไม่ได้

namespace.vndk.link.sphal.allow_all_shared_libs = true

ซึ่งหมายความว่าชื่อไลบรารีทั้งหมดจะไปยังเนมสเปซ vndk ถึง sphal ผ่านลิงก์สำรองได้

พร็อพเพอร์ตี้เนมสเปซ

พร็อพเพอร์ตี้ คำอธิบาย ตัวอย่าง
namespace.name.isolated

ค่าบูลีนที่ระบุว่าตัวลิงก์แบบไดนามิกควรตรวจสอบตำแหน่งของไลบรารีที่ใช้ร่วมกันหรือไม่

หาก isolated เป็น true ระบบจะโหลดได้เฉพาะไลบรารีที่ใช้ร่วมกันซึ่งอยู่ในไดเรกทอรี search.paths ไดเรกทอรีใดไดเรกทอรีหนึ่ง (ยกเว้นไดเรกทอรีย่อย) หรืออยู่ภายใต้ไดเรกทอรี permitted.paths ไดเรกทอรีใดไดเรกทอรีหนึ่ง (รวมถึงไดเรกทอรีย่อย)

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

namespace.sphal.isolated = true

ซึ่งหมายความว่ามีเพียงไลบรารีที่แชร์ใน search.paths หรือภายใต้ permitted.paths เท่านั้นที่จะโหลดลงในเนมสเปซ sphal ได้

namespace.name.search.paths

รายการไดเรกทอรีที่คั่นด้วยโคลอนเพื่อค้นหาคลังที่ใช้ร่วมกัน

ระบบจะใส่ไดเรกทอรีที่ระบุใน search.paths ไว้หน้าชื่อไลบรารีที่ขอ หากการเรียกฟังก์ชันไปยังรายการ dlopen() หรือ DT_NEEDED ไม่ได้ระบุเส้นทางแบบสมบูรณ์ ไดเรกทอรีที่ระบุไว้ที่ด้านบนของรายการจะมีลำดับความสำคัญสูงกว่า

เมื่อ isolated เป็น true ระบบจะโหลดไลบรารีที่แชร์ซึ่งอยู่ในไดเรกทอรี search.paths รายการใดรายการหนึ่ง (ยกเว้นไดเรกทอรีย่อย) โดยไม่คำนึงถึงพร็อพเพอร์ตี้ permitted.paths

เช่น หาก search.paths เป็น /system/${LIB} และ permitted.paths ว่างเปล่า ระบบจะโหลด /system/${LIB}/libc.so ได้ แต่โหลด /system/${LIB}/vndk/libutils.so ไม่ได้

namespace.default.search.paths = /system/${LIB}

ซึ่งบ่งชี้ว่าตัวลิงก์แบบไดนามิกจะค้นหา/system/${LIB}สำหรับไลบรารีที่ใช้ร่วมกัน

namespace.name.asan.search.paths

รายการไดเรกทอรีที่คั่นด้วยโคลอนเพื่อค้นหาไลบรารีที่ใช้ร่วมกันเมื่อเปิดใช้ AddressSanitizer (ASan)

ระบบจะไม่สนใจ namespace.name.search.paths เมื่อเปิดใช้ ASan

namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}

ซึ่งหมายความว่าเมื่อเปิดใช้ ASan ตัวแฮนเดิลแบบไดนามิกจะค้นหา /data/asan/system/${LIB} ก่อน แล้วจึงค้นหา /system/${LIB}

namespace.name.permitted.paths

รายการไดเรกทอรีที่คั่นด้วยโคลอน (รวมถึงไดเรกทอรีย่อย) ที่โปรแกรมลิงก์แบบไดนามิกสามารถโหลดไลบรารีที่ใช้ร่วมกันได้ (นอกเหนือจาก search.paths) เมื่อ isolated เป็น true

นอกจากนี้ คุณยังโหลดไลบรารีที่ใช้ร่วมกันที่อยู่ในไดเรกทอรีย่อยของ permitted.paths ได้ด้วย ตัวอย่างเช่น หาก permitted.paths เป็น /system/${LIB} ระบบจะโหลดทั้ง /system/${LIB}/libc.so และ /system/${LIB}/vndk/libutils.so

หาก isolated คือ false ระบบจะละเว้น permitted.paths และแสดงคำเตือน

namespace.default.permitted.paths = /system/${LIB}/hw

ซึ่งหมายความว่าระบบจะโหลดไลบรารีที่ใช้ร่วมกันภายใต้ /system/${LIB}/hw ลงในเนมสเปซ default ที่แยกไว้ได้

ตัวอย่างเช่น หากไม่มี permitted.paths libaudiohal.so จะโหลด /system/${LIB}/hw/audio.a2dp.default.so ลงในเนมสเปซ default ไม่ได้

namespace.name.asan.permitted.paths

รายการไดเรกทอรีที่คั่นด้วยโคลอนซึ่งตัวลิงก์แบบไดนามิกสามารถโหลด ไลบรารีที่แชร์ได้เมื่อเปิดใช้ ASan

ระบบจะไม่สนใจ namespace.name.permitted.paths เมื่อเปิดใช้ ASan

namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

ซึ่งหมายความว่าเมื่อเปิดใช้ ASan ระบบจะโหลดไลบรารีที่แชร์ภายใต้ /data/asan/system/${LIB}/hw หรือ /system/${LIB}/hw ไปยังเนมสเปซ default ที่แยกไว้

namespace.name.visible

ค่าบูลีนซึ่งระบุว่าโปรแกรม (ที่ไม่ใช่ libc) สามารถรับตัวแฮนเดิลเนมสเปซของ linker ด้วย android_get_exported_namespace() และเปิดไลบรารีที่แชร์ในเนมสเปซของ linker โดยการผ่านตัวแฮนเดิลไปยัง android_dlopen_ext() ได้หรือไม่

หาก visible คือ true แล้ว android_get_exported_namespace() จะแสดงผลแฮนเดิลเสมอหากเนมสเปซมีอยู่

หาก visible เป็น false (ค่าเริ่มต้น) android_get_exported_namespace() จะแสดงผลเป็น NULL เสมอไม่ว่าจะมีเนมสเปซหรือไม่ก็ตาม ระบบจะโหลดไลบรารีที่ใช้ร่วมกันลงในเนมสเปซนี้ได้ก็ต่อเมื่อ (1) มีการขอโดยเนมสเปซ linker อื่นซึ่งมีลิงก์สำรองไปยังเนมสเปซนี้ หรือ (2) มีการขอโดยไลบรารีที่ใช้ร่วมกันหรือไฟล์ปฏิบัติการอื่นๆ ในเนมสเปซนี้

namespace.sphal.visible = true

ซึ่งหมายความว่า android_get_exported_namespace("sphal") สามารถแสดงผลแฮนเดิลเนมสเปซของ linker ที่ถูกต้อง

การสร้างเนมสเปซของ linker

ใน Android 11 ระบบจะสร้างการกำหนดค่า linker ขณะรันไทม์ในส่วน /linkerconfig แทนที่จะใช้ไฟล์ข้อความธรรมดาใน ${android-src}/system/core/rootdir/etc ระบบจะสร้างการกำหนดค่าเมื่อบูตตามสภาพแวดล้อมรันไทม์ ซึ่งประกอบด้วยรายการต่อไปนี้

  • หากอุปกรณ์รองรับ VNDK
  • เวอร์ชัน VNDK เป้าหมายของพาร์ติชันผู้ให้บริการ
  • เวอร์ชัน VNDK ของการแบ่งส่วนผลิตภัณฑ์
  • โมดูล APEX ที่ติดตั้ง

การกำหนดค่า linker สร้างขึ้นโดยการแก้ไขการพึ่งพาระหว่างเนมสเปซ linker ตัวอย่างเช่น หากมีการอัปเดตในโมดูล APEX ที่มีอัปเดตทรัพยากร จะมีการสร้างขึ้นเพื่อแสดงการเปลี่ยนแปลงเหล่านี้ ดูรายละเอียดเพิ่มเติมในการสร้างการกำหนดค่า linker ได้ในส่วน ${android-src}/system/linkerconfig

การแยกเนมสเปซของ Linker

การกำหนดค่ามี 3 ประเภท ระบบจะสร้างการกำหนดค่าที่เกี่ยวข้องเมื่อบูต โดยขึ้นอยู่กับค่าของ PRODUCT_TREBLE_LINKER_NAMESPACES และ BOARD_VNDK_VERSION ใน BoardConfig.mk

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
การกำหนดค่าที่เลือก ข้อกําหนด VTS
true current VNDK ต้องระบุสำหรับอุปกรณ์ที่เปิดตัวด้วย Android 9 ขึ้นไป
ว่าง VNDK Lite ต้องระบุสำหรับอุปกรณ์ที่เปิดตัวพร้อมกับ Android 8.x
false ว่าง Legacy สำหรับอุปกรณ์ที่ไม่ใช่ Treble

การกำหนดค่า VNDK Lite จะแยกไลบรารีที่ใช้ร่วมกันของ SP-HAL และ VNDK-SP ใน Android 8.0 ไฟล์นี้ต้องไฟล์การกำหนดค่าสำหรับตัวลิงก์แบบไดนามิกเมื่อ PRODUCT_TREBLE_LINKER_NAMESPACES เป็น true

การกำหนดค่า VNDK จะแยกไลบรารีที่แชร์ของ SP-HAL และ VNDK-SP ด้วย นอกจากนี้ การกำหนดค่านี้ยังแยกตัวลิงก์แบบไดนามิกอย่างเต็มรูปแบบ ซึ่งช่วยให้มั่นใจว่าโมดูลในพาร์ติชันระบบจะไม่ใช้ไลบรารีที่แชร์ในพาร์ติชันของผู้ให้บริการ และในทางกลับกัน

ใน Android 8.1 ขึ้นไป การกําหนดค่า VNDK จะเป็นค่าเริ่มต้น และเราขอแนะนําอย่างยิ่งให้เปิดใช้การแยกตัวลิงก์แบบไดนามิกอย่างเต็มรูปแบบโดยการตั้งค่า BOARD_VNDK_VERSION เป็น current

การกำหนดค่า VNDK

เพื่อใช้ประโยชน์จาก GPU อย่างเต็มที่

การกำหนดค่า VNDK จะแยกการพึ่งพาไลบรารีที่ใช้ร่วมกันระหว่างพาร์ติชันระบบกับพาร์ติชันของผู้ให้บริการ ความแตกต่างเมื่อเทียบกับการกำหนดค่าที่กล่าวถึงในส่วนย่อยก่อนหน้านี้มีดังนี้

  • กระบวนการของเฟรมเวิร์ก

    • ระบบจะสร้างเนมสเปซ default, vndk, sphal และ rs
    • เนมสเปซทั้งหมดจะแยกออกจากกัน
    • ระบบจะโหลดไลบรารีที่ใช้ร่วมกันของระบบลงในเนมสเปซ default
    • ระบบจะโหลด SP-HAL ลงในเนมสเปซ sphal
    • ไลบรารีที่ใช้ร่วมกันของ VNDK-SP ที่โหลดลงในเนมสเปซ vndk
  • กระบวนการของผู้ให้บริการ

    • ระบบจะสร้างเนมสเปซ default, vndk และ system
    • เนมสเปซ default แยกอยู่
    • ระบบจะโหลดไลบรารีที่ใช้ร่วมกันของผู้ให้บริการลงในเนมสเปซ default
    • ระบบจะโหลดไลบรารีที่ใช้ร่วมกันของ VNDK และ VNDK-SP ลงในเนมสเปซ vndk
    • ระบบจะโหลด LL-NDK และทรัพยากร Dependency ลงในเนมสเปซ system

ความสัมพันธ์ระหว่างเนมสเปซของ linker แสดงอยู่ด้านล่าง

กราฟเนมสเปซของ Linker ที่อธิบายไว้ในการกำหนดค่า VNDK

รูปที่ 1 การแยกเนมสเปซของโปรแกรมลิงก์ (การกำหนดค่า VNDK)

ในรูปภาพด้านบน LL-NDK และ VNDK-SP หมายถึงห้องสมุดต่อไปนี้ที่แชร์

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libGLESv3.so
    • libandroid_net.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libneuralnetworks.so
    • libsync.so
    • libvndksupport.so
    • libvulkan.so
  • VNDK-SP
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libRSCpuRef.so
    • libRSDriver.so
    • libRS_internal.so
    • libbase.so
    • libbcinfo.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so
    • libz.so

ดูรายละเอียดเพิ่มเติมได้ใน /linkerconfig/ld.config.txt จากอุปกรณ์

การกำหนดค่า VNDK Lite

ตั้งแต่ Android 8.0 ระบบจะกำหนดค่าตัวลิงก์แบบไดนามิกให้แยกไลบรารีที่ใช้ร่วมกันของ SP-HAL และ VNDK-SP เพื่อให้สัญลักษณ์ของไลบรารีเหล่านั้นไม่ทับซ้อนกับไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กอื่นๆ ความสัมพันธ์ระหว่างเนมสเปซของ linker จะแสดงอยู่ด้านล่าง

กราฟเนมสเปซของ Linker ที่อธิบายในการกําหนดค่า VNDK Lite
รูปที่ 2 การแยกเนมสเปซของโปรแกรมลิงก์ (การกำหนดค่า VNDK Lite)

LL-NDK และ VNDK-SP หมายถึงไลบรารีที่ใช้ร่วมกันต่อไปนี้

  • LL-NDK
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (ไม่ได้อยู่ในการกำหนดค่า)
    • libsync.so
    • libvndksupport.so
    • libz.so (ย้ายไปที่ VNDK-SP ในการกําหนดค่า)
  • VNDK-SP
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libbase.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so

ตารางด้านล่างแสดงการกำหนดค่าเนมสเปซสำหรับกระบวนการเฟรมเวิร์ก ซึ่งคัดมาจากส่วน [system] ในการกําหนดค่า VNDK Lite

เนมสเปซ พร็อพเพอร์ตี้ ค่า
default search.paths /system/${LIB}
/odm/${LIB}
/vendor/${LIB}
/product/${LIB}
isolated false
sphal search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
isolated true
visible true
links default,vndk,rs
link.default.shared_libs LL-NDK
link.vndk.shared_libs VNDK-SP
link.rs.shared_libs libRS_internal.so
vndk (สำหรับ VNDK-SP) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
permitted.paths /odm/${LIB}/hw
/odm/${LIB}/egl
/vendor/${LIB}/hw
/vendor/${LIB}/egl
/system/${LIB}/vndk-sp-${VER}/hw
isolated true
visible true
links default
link.default.shared_libs LL-NDK
rs (สำหรับ RenderScript) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
/odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
/data (สำหรับเคอร์เนล RS ที่คอมไพล์แล้ว)
isolated true
visible true
links default,vndk
link.default.shared_libs LL-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

ตารางด้านล่างแสดงการกำหนดค่าเนมสเปซสำหรับกระบวนการของผู้ให้บริการ ซึ่งคัดมาจากส่วน [vendor] ในการกําหนดค่า VNDK Lite

เนมสเปซ พร็อพเพอร์ตี้ ค่า
default search.paths /odm/${LIB}
/odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
/system/${LIB} (เลิกใช้งานแล้ว)
/product/${LIB} (เลิกใช้งานแล้ว)
isolated false

ดูรายละเอียดเพิ่มเติมได้ใน /linkerconfig/ld.config.txt จากอุปกรณ์

ประวัติเอกสาร

การเปลี่ยนแปลงใน Android 11

  • ใน Android 11 ระบบจะนำไฟล์ ld.config.*.txt แบบคงที่ออกจากโค้ดเบสและ LinkerConfig จะสร้างไฟล์เหล่านั้นในรันไทม์แทน

การเปลี่ยนแปลงใน Android 9

  • ใน Android 9 ระบบจะเพิ่มเนมสเปซ vndk ลงในกระบวนการของผู้ให้บริการ และแยกไลบรารีที่ใช้ร่วมกันของ VNDK ออกจากเนมสเปซของโปรแกรมเชื่อมโยงเริ่มต้น
  • แทนที่ PRODUCT_FULL_TREBLE ด้วย PRODUCT_TREBLE_LINKER_NAMESPACES ที่เฉพาะเจาะจงยิ่งขึ้น
  • Android 9 เปลี่ยนชื่อไฟล์การกำหนดค่าตัวลิงก์แบบไดนามิกต่อไปนี้
    Android 8.x Android 9 คำอธิบาย
    ld.config.txt.in ld.config.txt สําหรับอุปกรณ์ที่มีการแยกเนมสเปซของโปรแกรมลิงก์รันไทม์
    ld.config.txt ld.config.vndk_lite.txt สําหรับอุปกรณ์ที่มีการแยกเนมสเปซของโปรแกรมลิงก์ VNDK-SP
    ld.config.legacy.txt ld.config.legacy.txt สำหรับอุปกรณ์รุ่นเดิมที่ใช้ Android 7.x หรือต่ำกว่า
  • นำ android.hardware.graphics.allocator@2.0.so ออก
  • เพิ่มพาร์ติชัน product และ odm