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

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> ในรายการแอป หากไม่มีส่วนใดส่วนหนึ่งของไลบรารีที่ร้องขอบนอุปกรณ์ แสดงว่าไม่ได้ติดตั้งแอป เมื่อติดตั้งแอปแล้ว แอปจะได้รับ เฉพาะ ไลบรารีที่แชร์แบบเนทีฟที่พวกเขาร้องขอเท่านั้น ซึ่งหมายความว่าแอปไม่สามารถเข้าถึงไลบรารีที่แชร์แบบเนทิฟที่ไม่ปรากฏในรายการแอป