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

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 แอปที่กำหนดเป้าหมายเป็น Android 14 ขึ้นไปและใช้ไลบรารีที่ไม่ใช่แบบสาธารณะควรได้รับการอัปเดต ดูรายละเอียดเพิ่มเติมได้ที่NDK Apps Linking to Platform Libraries

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

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