Android 7.0 ได้แนะนำเนมสเปซสำหรับไลบรารีดั้งเดิมเพื่อจำกัดการมองเห็น API ภายในและแก้ไขสถานการณ์ที่แอพใช้ไลบรารีแพลตฟอร์มแทนโดยไม่ได้ตั้งใจ ดูการ ปรับปรุงความเสถียรด้วยข้อจำกัดสัญลักษณ์ C/C++ ส่วนตัวในบล็อกโพสต์ Android 7.0 Android Developers สำหรับการเปลี่ยนแปลงเฉพาะแอปพลิเคชัน
สถาปัตยกรรม
ใน 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 ค้นหารายการไลบรารี VNDK-SP และ LLNDK ที่
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv
กำลังอัปเดตแอปเพื่อไม่ให้ใช้ไลบรารีดั้งเดิมที่ไม่ใช่แบบสาธารณะ
คุณลักษณะนี้เปิดใช้งานเฉพาะสำหรับแอปพลิเคชันที่กำหนดเป้าหมายเป็น SDK เวอร์ชัน 24 หรือใหม่กว่า สำหรับความเข้ากันได้แบบย้อนหลัง โปรดดู ตารางที่ 1 สิ่งที่จะเกิดขึ้นหากแอปของคุณลิงก์กับไลบรารีเนทีฟส่วนตัว รายการไลบรารีเนทีฟของ Android ที่แอปสามารถเข้าถึงได้ (หรือที่เรียกว่าไลบรารีเนทีฟสาธารณะ) แสดงอยู่ในส่วน CDD 3.1.1 แอปที่กำหนดเป้าหมายเป็น 24 หรือใหม่กว่าและใช้ไลบรารีที่ไม่ใช่สาธารณะควรได้รับการอัปเดต ดู แอป NDK ที่ลิงก์ไปยังไลบรารีของแพลตฟอร์ม สำหรับรายละเอียดเพิ่มเติม
กำลังอัปเดตแอพสำหรับการพึ่งพาไลบรารีดั้งเดิม
แอปพลิเคชันที่กำหนดเป้าหมายเป็น SDK เวอร์ชัน 31 (Android 12) หรือสูงกว่าต้อง ระบุ การพึ่งพาไลบรารีที่ใช้ร่วมกันแบบเนทีฟอย่างชัดเจนโดยใช้แท็ก <uses-native-library>
ในรายการแอป หากไม่มีส่วนใดของไลบรารีที่ร้องขออยู่ในอุปกรณ์ แสดงว่าแอปนั้นไม่ได้รับการติดตั้ง เมื่อติดตั้งแอปแล้ว แอปจะได้รับ เฉพาะ ไลบรารีที่แชร์แบบเนทีฟที่พวกเขาร้องขอเท่านั้น ซึ่งหมายความว่าแอปไม่สามารถเข้าถึงไลบรารีที่ใช้ร่วมกันแบบเนทีฟซึ่งไม่ปรากฏในรายการแอป