ส่วนขยาย SDK

โมดูลส่วนขยาย 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: ไฟล์นี้อยู่ในบูตไนพแอตที่นำ API ไปแสดงต่อแอปเพื่อค้นหาระดับ SDK ของส่วนขยาย

ดึงข้อมูลระดับ SDK ของส่วนขยาย

โปรแกรม derive_sdk จะอ่านข้อมูลเมตาที่จัดเก็บเป็นไฟล์ protobuf แบบไบนารีในเส้นทางย่อย etc/sdkinfo.binarypb ภายในโมดูล APEX แต่ละรายการ ดูรายละเอียดเกี่ยวกับโครงสร้าง Protobuf ได้ที่ไฟล์ protobuf

อ่านระดับ SDK ของส่วนขยาย

โมดูล SDK Extensions จะแสดงคลาส Java SdkExtensions ในแพ็กเกจ android.os.ext ใช้getExtensionVersion(int)วิธีอ่านเวอร์ชันของส่วนขยาย SDK (เช่น getExtensionVersion(Build.VERSION_CODES.R))

ดึงข้อมูล classpath

บริการ derive_classpath จะอ่านและรวมไฟล์การกำหนดค่าแต่ละรายการใน /system/etc/classpaths/ และ /apex/*/etc/classpaths/ การกำหนดค่าแต่ละรายการจะจัดเก็บข้อความ Protobuf จาก classpaths.proto ในรูปแบบไบนารีของ Proto อัลกอริทึมการผสานที่แน่นอนซึ่งกำหนดลําดับของรายการ classpath อธิบายไว้ใน derive_classpath.cpp และอาจเปลี่ยนแปลงได้เมื่อเวลาผ่านไป