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