เนมสเปซของไลบรารีที่มาพร้อมเครื่อง

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

  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 ไม่ว่าจะโดยตรงหรือโดยอ้อมผ่านทรัพยากร 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 แอปที่กำหนดเป้าหมายเป็น 24 ขึ้นไปและใช้ไลบรารีที่ไม่ใช่สาธารณะควรได้รับการอัปเดต ดูรายละเอียดเพิ่มเติมได้ที่ แอป NDK ที่ลิงก์กับไลบรารีแพลตฟอร์ม

อัปเดตแอปสำหรับทรัพยากร Dependency ของไลบรารีแบบเนทีฟ

แอปที่กำหนดเป้าหมายเป็น SDK เวอร์ชัน 31 (Android 12) ขึ้นไปต้อง ระบุทรัพยากร Dependency ของไลบรารีที่ใช้ร่วมกันแบบเนทีฟอย่างชัดเจนโดยใช้แท็ก <uses-native-library>ในไฟล์ Manifest ของแอป หากไม่มีไลบรารีที่ขอในอุปกรณ์ แอปจะไม่ได้รับการติดตั้ง เมื่อติดตั้งแอปแล้ว แอปจะได้รับ เฉพาะ ไลบรารีที่ใช้ร่วมกันแบบเนทีฟที่ขอเท่านั้น ซึ่งหมายความว่าแอปจะเข้าถึงไลบรารีที่ใช้ร่วมกันแบบเนทีฟซึ่งไม่ปรากฏในไฟล์ Manifest ของแอปไม่ได้