เนมสเปซสำหรับไลบรารีเนทีฟ

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 เป็นต้นไป ห้องสมุดสาธารณะของผู้จำหน่ายจะมีข้อจำกัดเพิ่มเติมและการตั้งค่าที่จำเป็นดังต่อไปนี้

  1. ไลบรารีเนทีฟในผู้จำหน่ายต้องมีป้ายกำกับอย่างถูกต้องเพื่อให้แอปสามารถเข้าถึงได้ หากแอปใดๆ จำเป็นต้องมีการเข้าถึง (รวมถึงแอปของบุคคลที่สาม) ไลบรารีจะต้องติดป้ายกำกับว่า same_process_hal_file ในไฟล์ file_contexts เฉพาะผู้จำหน่ายดังนี้:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    โดยที่ libnative.so เป็นชื่อของไลบรารีดั้งเดิม
  2. ไลบรารี ไม่ว่าจะโดยตรงหรือโดยผ่านการอ้างอิง จะต้องไม่พึ่งพาไลบรารีระบบอื่นที่ไม่ใช่ไลบรารี 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> ในรายการแอป หากไม่มีส่วนใดของไลบรารีที่ร้องขออยู่ในอุปกรณ์ แสดงว่าแอปนั้นไม่ได้รับการติดตั้ง เมื่อติดตั้งแอปแล้ว แอปจะได้รับ เฉพาะ ไลบรารีที่แชร์แบบเนทีฟที่พวกเขาร้องขอเท่านั้น ซึ่งหมายความว่าแอปไม่สามารถเข้าถึงไลบรารีที่ใช้ร่วมกันแบบเนทีฟซึ่งไม่ปรากฏในรายการแอป