พร็อพเพอร์ตี้เวอร์ชัน Android SDK

แอปพลิเคชัน Android สามารถตั้งค่าพร็อพเพอร์ตี้เวอร์ชัน SDK ได้หลายรายการในไฟล์ build.gradle เอกสารประกอบของ Android build.gradle อธิบายความหมายของพร็อพเพอร์ตี้เหล่านั้นสำหรับแอปพลิเคชันโดยทั่วไป เอกสารนี้อธิบายว่าพร็อพเพอร์ตีเหล่านั้นส่งผลต่อการสร้าง NDK อย่างไร

compileSdkVersion

พร็อพเพอร์ตี้นี้ไม่มีผลต่อบิลด์ NDK ความพร้อมใช้งานของ API สำหรับ NDK จะอยู่ภายใต้การควบคุมของ minSdkVersion แทน เนื่องจากสัญลักษณ์ C++ จะได้รับการแก้ไขอย่างรวดเร็ว เมื่อโหลดไลบรารี ไม่ใช่ได้รับการแก้ไขอย่างช้าๆ เมื่อมีการเรียกใช้ครั้งแรก (เหมือนกับใน Java) การใช้สัญลักษณ์ที่ไม่มีใน minSdkVersionจะทำให้โหลดไลบรารีในเวอร์ชันของระบบปฏิบัติการที่ไม่มี API ใหม่กว่าไม่สำเร็จ ไม่ว่าจะมีการเรียกใช้ API เหล่านั้นหรือไม่ก็ตาม

สำหรับแอปใหม่ ให้เลือกเวอร์ชันล่าสุดที่มี สำหรับแอปที่มีอยู่ ให้อัปเดต เป็นเวอร์ชันล่าสุดเมื่อสะดวก

targetSdkVersion

เช่นเดียวกับ Java targetSdkVersion ของแอปสามารถเปลี่ยนลักษณะการทำงานของโค้ดที่มาพร้อมเครื่องในรันไทม์ได้ การเปลี่ยนแปลงลักษณะการทำงานในระบบจะใช้กับแอปที่มี targetSdkVersion มากกว่าหรือเท่ากับเวอร์ชันของระบบปฏิบัติการ ที่เปิดตัวการเปลี่ยนแปลงนั้นๆ เท่านั้น หากเป็นไปได้

สำหรับแอปใหม่ ให้เลือกเวอร์ชันล่าสุดที่มี สำหรับแอปที่มีอยู่ ให้อัปเดต เป็นเวอร์ชันล่าสุดเมื่อสะดวก (หลังจากอัปเดต compileSdkVersion)

แม้ว่าโดยทั่วไปแล้วนักพัฒนาแอปพลิเคชันจะทราบ targetSdkVersion ของแอป แต่ API นี้มีประโยชน์สำหรับนักพัฒนาไลบรารีที่ไม่สามารถทราบว่าผู้ใช้จะเลือก targetSdkVersion ใด

ในรันไทม์ คุณจะรับ targetSdkVersion ที่แอปพลิเคชันใช้ได้โดยการเรียกใช้ android_get_application_target_sdk_version() API นี้พร้อมใช้งานใน API ระดับ 24 ขึ้นไป ฟังก์ชันนี้มีลายเซ็นต่อไปนี้

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

การเปลี่ยนแปลงลักษณะการทำงานอื่นๆ อาจขึ้นอยู่กับระดับ API ของอุปกรณ์ คุณสามารถรับ API ระดับของอุปกรณ์ที่แอปพลิเคชันทำงานอยู่ได้โดยการเรียกใช้ android_get_device_api_level() ฟังก์ชันนี้มีลายเซ็นต่อไปนี้

/**
 * Returns the API level of the device we're actually running on, or -1 on failure.
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

การรับระดับ API ของอุปกรณ์ช่วยให้โค้ด NDK รับรู้การเปลี่ยนแปลงลักษณะการทำงานในแพลตฟอร์มแบบไดนามิกได้ เนื่องจากระดับ API ย่อยไม่ได้เชื่อมโยงกับการเปลี่ยนแปลงลักษณะการทำงาน และเรายังไม่มีแผนที่จะเพิ่มฟังก์ชันการทำงานใหม่ของ NDK ในระดับ API ย่อย จึงไม่มีวิธีรับระดับ API ของอุปกรณ์แบบเต็มโดยตรงจากการเรียก NDK

คุณใช้การอ้างอิง API ที่dlopen()/dlsym() หรือการอ้างอิง API ที่ไม่เข้มงวดเพื่อเรียกใช้ API ที่ใหม่กว่าที่ minSdkVersion ระบุได้

maxSdkVersion

พร็อพเพอร์ตี้นี้ไม่มีผลต่อบิลด์ NDK

minSdkVersion

minSdkVersion ที่ตั้งค่าไว้ในไฟล์ build.gradle จะกำหนดว่า API ใดบ้างที่พร้อมใช้งานในเวลาบิลด์ (ดู compileSdkVersion เพื่อทำความเข้าใจว่าเหตุใดจึงแตกต่างจากการบิลด์ Java) และกำหนดเวอร์ชันขั้นต่ำของระบบปฏิบัติการที่โค้ดของคุณจะเข้ากันได้

NDK ใช้ minSdkVersion เพื่อพิจารณาว่าฟีเจอร์ใดที่อาจใช้ เมื่อคอมไพล์โค้ด เช่น พร็อพเพอร์ตี้นี้จะกำหนดว่าฟีเจอร์ FORTIFY ใดที่จะใช้ใน libc และอาจเปิดใช้การปรับปรุงประสิทธิภาพหรือขนาด (เช่น GNU hashes หรือ RELR) สำหรับไบนารีที่ไม่เข้ากันกับ Android เวอร์ชันเก่ากว่า แม้ว่าคุณจะไม่ได้ใช้ API ใหม่ใดๆ แต่พร็อพเพอร์ตี้นี้ ก็ยังคงควบคุมเวอร์ชันระบบปฏิบัติการขั้นต่ำที่รองรับของโค้ด

สำหรับแอปใหม่ ให้ดูข้อมูลการกระจายผู้ใช้ในวิซาร์ดโปรเจ็กต์ใหม่ของ Android Studio หรือใน apilevels.com เลือกความสมดุลระหว่าง ส่วนแบ่งการตลาดที่เป็นไปได้กับค่าใช้จ่ายในการบำรุงรักษา minSdkVersion ยิ่งต่ำ คุณก็ยิ่งต้องเสียเวลาในการแก้ไขข้อบกพร่องเก่าๆ และเพิ่มลักษณะการทำงานสำรอง สำหรับฟีเจอร์ที่ยังไม่ได้ใช้งาน

สำหรับแอปที่มีอยู่ ให้เพิ่ม minSdkVersion เมื่อใดก็ตามที่ระดับ API เก่าไม่คุ้มค่ากับต้นทุนการบำรุงรักษาอีกต่อไป หรือลดระดับ API หากผู้ใช้ต้องการและคุ้มค่ากับต้นทุนการบำรุงรักษาใหม่ Play Console มีเมตริกที่เฉพาะเจาะจงกับการกระจายผู้ใช้ของแอป

minSdkVersionของแอปพลิเคชันจะพร้อมใช้งานกับตัวประมวลผลล่วงหน้า ผ่านมาโคร __ANDROID_MIN_SDK_VERSION__ (__ANDROID_API__ เดิม จะเหมือนกัน แต่เราขอแนะนำให้ใช้มาโครแรกเนื่องจากมีความหมายชัดเจนกว่า) มาโครนี้กำหนดโดย Clang โดยอัตโนมัติ จึงไม่จำเป็นต้องรวมส่วนหัวเพื่อใช้งาน สำหรับบิลด์ NDK จะมีการกำหนดมาโครนี้เสมอ