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

Android 7.0 เปิดตัวเนมสเปซสำหรับไลบรารีแบบเนทีฟเพื่อจำกัด API ภายใน การมองเห็นและแก้ไขสถานการณ์ที่แอปใช้แพลตฟอร์มโดยไม่ได้ตั้งใจ แทนห้องสมุดแต่ละแห่ง ดูการปรับปรุง ความเสถียรที่มีข้อจำกัดด้านสัญลักษณ์ C/C++ แบบส่วนตัวใน Android 7.0 Android บล็อกโพสต์ของนักพัฒนาซอฟต์แวร์เกี่ยวกับการเปลี่ยนแปลงเฉพาะแอป

สถาปัตยกรรม

ใน Android 7.0 ขึ้นไป ไลบรารีระบบจะแยกออกจากไลบรารีของแอป

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

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

เนมสเปซสำหรับไลบรารีแบบเนทีฟป้องกันไม่ให้แอปใช้โฆษณาเนทีฟบนแพลตฟอร์มส่วนตัว 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 เป็นต้นไป ข้อจำกัดและการตั้งค่าที่จำเป็น

  1. ไลบรารีเนทีฟในผู้ให้บริการ ต้องติดป้ายกำกับอย่างถูกต้องเพื่อให้สามารถ เข้าถึงแอปต่างๆ ได้ ในกรณีที่แอปใดก็ตามจำเป็นต้องเข้าถึง (รวมถึง แอปปาร์ตี้) ไลบรารีต้องมีป้ายกำกับเป็น same_process_hal_file ในไฟล์ file_contexts เฉพาะผู้ให้บริการ ดังนี้
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    โดยที่ libnative.so คือชื่อของไลบรารีเนทีฟ
  2. ไลบรารีไม่ว่าจะโดยตรงหรือโดยอ้อมผ่านทรัพยากร Dependency ต้องไม่ ขึ้นอยู่กับไลบรารีระบบอื่นๆ ที่ไม่ใช่ไลบรารี VNDK-SP และ LLNDK ค้นหารายการของ ห้องสมุด VNDK-SP และ LLNDK ที่ development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv

ตั้งแต่ Android 15 (เวอร์ชันทดลอง AOSP) คุณสามารถใส่ไลบรารีสาธารณะของผู้ให้บริการใน 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 ของแอป