เนมสเปซตัวเชื่อมโยง

ตัวเชื่อมโยงแบบไดนามิกจัดการกับความท้าทายสองประการในการออกแบบ Treble VNDK:

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

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

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

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

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

มันทำงานอย่างไร?

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

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

รูปแบบไฟล์คอนฟิกูเรชันขึ้นอยู่กับรูปแบบไฟล์ 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}

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

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

ตารางด้านล่างอธิบายความหมายของแต่ละคุณสมบัติโดยละเอียด

คุณสมบัติการแมปส่วนไดเร็กทอรี

คุณสมบัติ คำอธิบาย ตัวอย่าง

dir. name

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

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

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

นี้แสดงให้เห็นว่าการกำหนดค่าที่ระบุไว้ใน [system] ส่วนนำไปใช้กับ executables ที่โหลดจากทั้ง /system/bin หรือ /system/xbin

การกำหนดค่าที่ระบุไว้ใน [vendor] ส่วนนำไปใช้กับ executables ที่โหลดจาก /vendor/bin

คุณสมบัติสัมพันธ์

คุณสมบัติ คำอธิบาย ตัวอย่าง
additional. namespaces

รายการที่คั่นด้วยเครื่องหมายจุลภาค namespaces เพิ่มเติม (นอกเหนือไปจาก default namespace) สำหรับส่วน

additional. namespaces = sphal, vndk

นี้แสดงให้เห็นว่ามีสาม namespaces ( default , sphal และ vndk ) ใน [system] การกำหนดค่า

namespace. name . links

รายการเนมสเปซทางเลือกที่คั่นด้วยจุลภาค

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

namespace. sphal. links = default, vndk

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

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

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

namespace. name . link. other . shared_libs

รายการลำไส้ใหญ่แยกของห้องสมุดสาธารณะที่สามารถค้นหาใน other namespaces เมื่อห้องสมุดผู้ที่ไม่สามารถพบได้ใน name namespace

ที่พักแห่งนี้ไม่สามารถใช้ร่วมกับ namespace. name . link. other . allow_all_shared_libs

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

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

namespace. name . link. other . allow_all_shared_libs

ค่าบูลีนที่บ่งชี้ว่าห้องสมุดสาธารณะที่ทุกคนสามารถที่จะค้นหาใน other namespace เมื่อห้องสมุดผู้ที่ไม่สามารถพบได้ใน name namespace

ที่พักแห่งนี้ไม่สามารถใช้ร่วมกับ namespace. name . link. other . shared_libs

namespace. vndk. link. sphal. allow_all_shared_libs = true

นี้แสดงให้เห็นว่าทุกชื่อไลบรารีสามารถเดินผ่านการเชื่อมโยงทางเลือกจาก vndk เพื่อ sphal namespace

คุณสมบัติเนมสเปซ

คุณสมบัติ คำอธิบาย ตัวอย่าง
namespace. name . isolated

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

หาก isolated เป็น true เท่านั้นที่ห้องสมุดสาธารณะที่อยู่ในหนึ่งใน search.paths ไดเรกทอรี (ไม่รวมไดเรกทอรีย่อย) หรืออยู่ภายใต้หนึ่งใน permitted.paths ไดเรกทอรี (รวมไดเรกทอรีย่อย) สามารถโหลดได้

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

namespace. sphal. isolated = true

นี้แสดงให้เห็นว่ามีเพียงห้องสมุดสาธารณะใน search.paths หรือใต้ permitted.paths สามารถโหลดลงใน sphal namespace

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 ถูกเปิดใช้งานแบบไดนามิก linker ค้นหา /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 namespace

ยกตัวอย่างเช่นโดยไม่ต้อง permitted.paths , libaudiohal.so ไม่สามารถโหลด /system/${LIB}/hw/audio.a2dp.default.so เข้ามา default namespace

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

namespace. name . visible

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

หาก visible เป็น true , android_get_exported_namespace() เสมอกลับจับถ้า namespace ที่มีอยู่

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

namespace. sphal. visible = true

นี้บ่งชี้ว่า android_get_exported_namespace("sphal") สามารถกลับมาที่จับลิงเกอร์ namespace ที่ถูกต้อง

การสร้างเนมสเปซตัวเชื่อมโยง

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

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

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

การแยกเนมสเปซตัวเชื่อมโยง

มีการกำหนดค่าสามประเภท ทั้งนี้ขึ้นอยู่กับมูลค่าของ 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 สำหรับอุปกรณ์ที่ไม่ใช่เสียงแหลม

การกำหนดค่า 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

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

  • กระบวนการกรอบงาน

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

    • default , vndk และ system namespaces จะถูกสร้างขึ้น
    • default namespace จะถูกแยกออก
    • ผู้ขายห้องสมุดสาธารณะจะถูกโหลดเข้าไปใน default namespace
    • VNDK และ VNDK-SP ที่ใช้ร่วมกันห้องสมุดจะโหลดลงใน vndk namespace
    • LL-NDK และการอ้างอิงที่มีการโหลดลงใน system namespace

ความสัมพันธ์ระหว่างเนมสเปซตัวเชื่อมโยงมีภาพประกอบด้านล่าง

กราฟเนมสเปซตัวเชื่อมโยงที่อธิบายไว้ในการกำหนดค่า VNDK
รูปที่ 1 Linker namespace แยก (การกำหนดค่า 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 เพื่อให้สัญลักษณ์ไม่ขัดแย้งกับไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กอื่น ความสัมพันธ์ระหว่างเนมสเปซตัวเชื่อมโยงแสดงอยู่ด้านล่าง

กราฟเนมสเปซตัวเชื่อมโยงที่อธิบายในการกำหนดค่า VNDK Lite
รูปที่ 2 Linker namespace แยก (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

ตารางด้านล่างแสดง namespaces การกำหนดค่าสำหรับกระบวนการกรอบที่คัดลอกมาจาก [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 (สำหรับอาร์เอสคอมไพล์เคอร์เนล)
isolated true
visible true
links default,vndk
link.default.shared_libs LL-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

ตารางด้านล่างของขวัญ namespaces การกำหนดค่าสำหรับกระบวนการของผู้ขายซึ่งคัดลอกมาจาก [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 ไฟล์จะถูกลบออกจาก codebase และ LinkerConfig สร้างพวกเขาในการรันไทม์แทน

Android 9 เปลี่ยนไป

  • ใน Android 9 vndk namespace ลิงเกอร์จะถูกเพิ่มในกระบวนการผู้ขายและ VNDK ที่ใช้ร่วมกันห้องสมุดจะแยกจาก namespace ลิงเกอร์เริ่มต้น
  • แทนที่ 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 พาร์ทิชันที่มีการเพิ่ม