Android 7.0 ได้เปิดตัวเนมสเปซสำหรับไลบรารีแบบเนทีฟเพื่อจำกัดการมองเห็น API ภายใน และแก้ไขสถานการณ์ที่แอปใช้ไลบรารีแพลตฟอร์ม โดยไม่ตั้งใจแทนที่จะใช้ไลบรารีของตัวเอง ดูการเปลี่ยนแปลงเฉพาะแอปได้ในบล็อกโพสต์ของนักพัฒนาแอป Android การปรับปรุงความเสถียรด้วยข้อจำกัดของสัญลักษณ์ C/C++ ส่วนตัวใน Android 7.0
สถาปัตยกรรม
ใน Android 7.0 ขึ้นไป ไลบรารีของระบบจะแยกออกจากไลบรารีของแอป

รูปที่ 1 เนมสเปซสำหรับไลบรารีที่มาพร้อมเครื่อง
เนมสเปซสำหรับไลบรารีเนทีฟจะป้องกันไม่ให้แอปใช้ API เนทีฟของแพลตฟอร์มส่วนตัว (เช่นเดียวกับที่ทำกับ OpenSSL) นอกจากนี้ ยังช่วยหลีกเลี่ยงสถานการณ์ที่แอปใช้ไลบรารีของแพลตฟอร์มโดยไม่ตั้งใจแทนที่จะใช้ไลบรารีของตนเอง (ดังที่เห็นใน libpng
) และทำให้ไลบรารีของแอปใช้ไลบรารีของระบบภายในโดยไม่ตั้งใจได้ยาก (และในทางกลับกัน)
เพิ่มไลบรารีเนทีฟเพิ่มเติม
นอกจากไลบรารีเนทีฟสาธารณะมาตรฐานแล้ว ผู้จำหน่ายซิลิคอน (ตั้งแต่ Android 7.0) และ ผู้ผลิตอุปกรณ์ (ตั้งแต่ Android 9) อาจเลือกที่จะจัดหาไลบรารีเนทีฟเพิ่มเติม ที่แอปเข้าถึงได้โดยการวางไว้ในโฟลเดอร์ไลบรารีที่เกี่ยวข้องและระบุไว้อย่างชัดเจน ในไฟล์ .txt
โฟลเดอร์ไลบรารีมีดังนี้
/vendor/lib
(สำหรับ 32 บิต) และ/vendor/lib64
(สำหรับ 64 บิต) สำหรับไลบรารีจากผู้จำหน่ายซิลิคอน/system/lib
(สำหรับ 32 บิต) และ/system/lib64
(สำหรับ 64 บิต) สำหรับไลบรารีจากผู้ผลิตอุปกรณ์
ไฟล์ .txt คือ
/vendor/etc/public.libraries.txt
สำหรับไลบรารีจากผู้จำหน่ายซิลิคอน/system/etc/public.libraries-COMPANYNAME.txt
สำหรับไลบรารีจากผู้ผลิตอุปกรณ์ โดยCOMPANYNAME
หมายถึงชื่อของผู้ผลิต (เช่นawesome.company
)COMPANYNAME
ต้องตรงกับ[A-Za-z0-9_.-]+
อักขระที่เป็นตัวอักษรและตัวเลข _ . (จุด) และ - คุณสามารถมีไฟล์ .txt ดังกล่าวหลายไฟล์ในอุปกรณ์ได้หากไลบรารีบางรายการมาจากผู้ให้บริการโซลูชันภายนอก
ไลบรารีที่มาพร้อมเครื่องในพาร์ติชัน system
ที่ผู้ผลิตอุปกรณ์ตั้งค่าเป็นสาธารณะ
ต้องตั้งชื่อเป็น lib*COMPANYNAME.so
เช่น libFoo.awesome.company.so
กล่าวคือ libFoo.so
ที่ไม่มีคำต่อท้ายชื่อบริษัทต้องไม่ได้รับการเผยแพร่ต่อสาธารณะ
COMPANYNAME
ในชื่อไฟล์ไลบรารีต้องตรงกับ COMPANYNAME
ในชื่อไฟล์
txt ที่ระบุชื่อไลบรารี
ห้ามเผยแพร่ไลบรารีแบบเนทีฟที่เป็นส่วนหนึ่งของ AOSP (ยกเว้นไลบรารีแบบเนทีฟสาธารณะมาตรฐานซึ่งเป็นแบบสาธารณะโดยค่าเริ่มต้น) แอปจะเข้าถึงได้เฉพาะไลบรารีเพิ่มเติมที่ผู้จำหน่ายซิลิคอนหรือผู้ผลิตอุปกรณ์เพิ่มเท่านั้น
ตั้งแต่ Android 8.0 เป็นต้นไป ไลบรารีสาธารณะของผู้ให้บริการจะมีข้อจำกัดเพิ่มเติมและการตั้งค่าที่จำเป็นดังต่อไปนี้
- ไลบรารีแบบเนทีฟในผู้ให้บริการต้องมีป้ายกำกับที่เหมาะสมเพื่อให้แอปเข้าถึงได้
หากแอปใดก็ตาม (รวมถึงแอปของบุคคลที่สาม) ต้องเข้าถึงไลบรารี คุณต้องติดป้ายกำกับไลบรารีเป็น
same_process_hal_file
ในไฟล์file_contexts
ที่เฉพาะเจาะจงของผู้ให้บริการดังนี้ โดยที่/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
libnative.so
คือชื่อของไลบรารีเนทีฟ - ไลบรารีต้องไม่ขึ้นอยู่กับไลบรารีของระบบอื่นที่ไม่ใช่ไลบรารี VNDK-SP และ LLNDK ไม่ว่าจะโดยตรงหรือโดยอ้อมผ่านทรัพยากร Dependency ค้นหารายการไลบรารี VNDK-SP และ LLNDK ที่
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv
ตั้งแต่ Android 15 เป็นต้นไป คุณจะใส่ไลบรารีสาธารณะของผู้ให้บริการไว้ใน APEX ของผู้ให้บริการ ได้ เมื่อจัดแพ็กเกจใน APEX ของผู้ให้บริการ ให้แสดงรายการไลบรารี
ในพร็อพเพอร์ตี้ provideNativeLibs
ในไฟล์ Manifest ของ APEX
อัปเดตแอปเพื่อไม่ให้ใช้ไลบรารีแบบเนทีฟที่ไม่ใช่แบบสาธารณะ
ฟีเจอร์นี้จะเปิดใช้เฉพาะกับแอปที่กำหนดเป้าหมายเป็น SDK เวอร์ชัน 24 ขึ้นไป ดูความเข้ากันได้แบบย้อนหลังได้ในตาราง ที่ 1 สิ่งที่ควรทราบหากแอปของคุณลิงก์กับไลบรารีแบบเนทีฟส่วนตัว รายการไลบรารีแบบเนทีฟของ Android ที่แอปเข้าถึงได้ (หรือที่เรียกว่าไลบรารีแบบเนทีฟสาธารณะ) แสดงอยู่ในส่วน 3.1.1 ของ CDD แอปที่กำหนดเป้าหมายเป็น Android 14 ขึ้นไปและใช้ไลบรารีที่ไม่ใช่แบบสาธารณะควรได้รับการอัปเดต ดูรายละเอียดเพิ่มเติมได้ที่NDK Apps Linking to Platform Libraries
อัปเดตแอปสำหรับทรัพยากร Dependency ของไลบรารีแบบเนทีฟ
แอปที่กำหนดเป้าหมายเป็น SDK เวอร์ชัน 31 (Android 12) ขึ้นไปต้องระบุอย่างชัดเจนถึงทรัพยากร Dependency ของไลบรารีที่ใช้ร่วมกันแบบเนทีฟโดยใช้แท็ก
<uses-native-library>
ในไฟล์ Manifest ของแอป หากไม่มีส่วนใดส่วนหนึ่งของไลบรารีที่ขอในอุปกรณ์ ระบบจะไม่ติดตั้งแอป เมื่อติดตั้งแอปแล้ว ระบบจะจัดหาเฉพาะไลบรารีที่ใช้ร่วมกันแบบเนทีฟที่แอปขอมาให้ ซึ่งหมายความว่า
แอปจะเข้าถึงไลบรารีที่แชร์แบบเนทีฟซึ่งไม่ปรากฏในไฟล์ Manifest ของแอปไม่ได้