โมดูลส่วนขยาย SDK จะตัดสินใจระดับ SDK ส่วนขยายของอุปกรณ์ และจัดเตรียม API สำหรับแอปต่างๆ เพื่อสืบค้นระดับ SDK ส่วนขยาย โมดูลนี้สามารถอัปเดตได้ ซึ่งหมายความว่าสามารถรับอัปเดตฟังก์ชันการทำงานนอกรอบการเปิดตัว Android ปกติได้
ส่วนขยาย SDK มีหน้าที่รับผิดชอบสำหรับ:
- การตัดสินใจระดับ SDK ส่วนขยายของอุปกรณ์
- การจัดหา API สำหรับแอปเพื่อค้นหาระดับส่วนขยาย SDK
- (เริ่มต้น Android 12) การกำหนดค่าสำหรับตัวแปรสภาพแวดล้อม
BOOTCLASSPATH
,DEX2OATBOOTCLASSPATH
และSYSTEMSERVERCLASSPATH
รูปแบบของโมดูล
โมดูลส่วนขยาย SDK ( com.android.sdkext
) อยู่ในรูปแบบ APEX และพร้อมใช้งานสำหรับอุปกรณ์ที่ใช้ Android 11 ขึ้นไป
รูปแบบแพ็คเกจ
โมดูลส่วนขยาย SDK ( com.google.android.sdkext
) อยู่ในรูปแบบ APEX และมีส่วนประกอบต่อไปนี้:
(เริ่มต้น Android 12)
bin/derive_classpath
: ไบนารีดั้งเดิมที่ทำงานตั้งแต่เนิ่นๆ ในกระบวนการบู๊ตอุปกรณ์ โดยจะอ่านไฟล์คอนฟิก classpath แต่ละไฟล์จากระบบและโมดูลอื่นๆ รวมเข้าด้วยกัน และกำหนดคำจำกัดความของตัวแปรสภาพแวดล้อมCLASSPATH
bin/derive_sdk
: ไบนารีดั้งเดิมที่ทำงานตั้งแต่เนิ่นๆ ในกระบวนการบูตอุปกรณ์ และอ่านข้อมูลเมตาของโมดูลอื่นๆ เพื่อตั้งค่าคุณสมบัติระบบที่เกี่ยวข้องกับ SDK ส่วนขยาย (เช่นbuild.version.extensions.r
)javalib/framework-sdkextension.jar
: ไฟล์นี้อยู่บน bootclasspath ที่แสดง API ให้กับแอปเพื่อสืบค้นระดับ SDK ส่วนขยาย
การรับระดับส่วนขยาย SDK
โปรแกรม derive_sdk
อ่านข้อมูลเมตาที่จัดเก็บเป็นไฟล์ protobuf ไบนารีในเส้นทางย่อย etc/sdkinfo.binarypb
ภายในแต่ละโมดูล APEX สำหรับรายละเอียดเกี่ยวกับโครงสร้าง protobuf โปรดดูไฟล์ protobuf
การอ่านระดับส่วนขยาย SDK
โมดูลส่วนขยาย SDK เปิดเผยคลาส Java SdkExtensions
ในแพ็คเกจ android.os.ext
ใช้เมธอด getExtensionVersion(int)
เพื่ออ่านเวอร์ชันของส่วนขยาย SDK (เช่น getExtensionVersion(Build.VERSION_CODES.R)
)
การได้มาซึ่งคลาสพาธ
บริการ derive_classpath
อ่านและรวมไฟล์ปรับแต่งแต่ละไฟล์ใน /system/etc/classpaths/
และ /apex/*/etc/classpaths/
แต่ละการกำหนดค่าจะจัดเก็บข้อความ protobuf จาก classpaths.proto
ในรูปแบบไบนารีของโปรโต อัลกอริธึมการรวมที่แน่นอนซึ่งกำหนดลำดับของรายการ classpath มีอธิบายไว้ใน derive_classpath.cpp
และอาจเปลี่ยนแปลงเมื่อเวลาผ่านไป