เนมสเปซสำหรับไลบรารีดั้งเดิม

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

สถาปัตยกรรม

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

เนมสเปซสำหรับไลบรารีดั้งเดิม

รูปที่ 1 Namespaces สำหรับห้องสมุดพื้นเมือง

เนมสเปซสำหรับไลบรารีเนทีฟป้องกันไม่ให้แอปใช้ API ดั้งเดิมของแพลตฟอร์มส่วนตัว (เช่นเดียวกับ OpenSSL) มันยังเอาสถานการณ์ที่ปพลิเคชันโดยไม่ได้ตั้งใจใช้ห้องสมุดแพลตฟอร์มแทนของพวกเขาเอง (เป็นสักขีพยานกับ libpng ) เป็นการยากสำหรับไลบรารีของแอปที่จะใช้ไลบรารีระบบภายในโดยบังเอิญ (และในทางกลับกัน)

การเพิ่มไลบรารีเนทีฟเพิ่มเติม

นอกเหนือจากไลบรารีเนทีฟสาธารณะแบบมาตรฐานแล้ว ผู้จำหน่ายซิลิคอน (เริ่มจาก Android 7.0) และผู้ผลิตอุปกรณ์ (เริ่มจาก Android 9) อาจเลือกที่จะจัดหาไลบรารีเนทีฟเพิ่มเติมที่แอปสามารถเข้าถึงได้โดยวางไว้ใต้โฟลเดอร์ไลบรารีที่เกี่ยวข้องและแสดงรายการไว้อย่างชัดเจนใน .txt ไฟล์.

โฟลเดอร์ไลบรารีคือ:

  • /vendor/lib (32 บิต) และ /vendor/lib64 (64-bit) สำหรับห้องสมุดจากผู้ผลิตซิลิกอน
  • /system/lib (32 บิต) และ /system/lib64 (64-bit) สำหรับห้องสมุดจากผู้ผลิตอุปกรณ์

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