แอปพลิเคชัน 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 จะมีการกำหนดมาโครนี้เสมอ