แอปพลิเคชัน Android สามารถตั้งค่าพร็อพเพอร์ตี้เวอร์ชัน SDK ต่างๆ ใน
build.gradle
ไฟล์ เอกสารประกอบของ Android build.gradle
อธิบายสิ่งที่
พร็อพเพอร์ตี้เหล่านั้นหมายถึง
การใช้งานโดยทั่วไป เอกสารนี้จะอธิบายวิธี
คุณสมบัติเหล่านั้นจะส่งผลต่อบิลด์ NDK
เวอร์ชัน CompileSdk
พร็อพเพอร์ตี้นี้ไม่มีผลต่อบิลด์ NDK ความพร้อมใช้งาน API สำหรับ NDK คือ
อยู่ในบังคับของ minSdkVersion
แทน เพราะสัญลักษณ์ C++ จะแสดงขึ้นมาอย่างใจจดใจจ่อ
แก้ไขที่เวลาโหลดของไลบรารีแทนที่จะแก้ไขแบบ Lazy Loading เมื่อมีการเรียกใช้ครั้งแรก (เป็น
อยู่ใน Java) การใช้สัญลักษณ์ที่ไม่มีอยู่ใน
minSdkVersion
จะทำให้ไลบรารีโหลดไม่สำเร็จในเวอร์ชันระบบปฏิบัติการที่มี
ไม่มี API ที่ใหม่กว่า ไม่ว่าจะเรียกใช้ API เหล่านั้นหรือไม่ก็ตาม
สำหรับแอปใหม่ ให้เลือกเวอร์ชันใหม่ล่าสุดที่มีอยู่ สำหรับแอปที่มีอยู่ ให้อัปเดต ให้เป็นเวอร์ชันล่าสุดเมื่อสะดวก
targetSdkVersion
targetSdkVersion
ของแอปเปลี่ยนรันไทม์ได้เช่นเดียวกับ Java
การทำงานของโค้ดเนทีฟ การเปลี่ยนแปลงพฤติกรรมในระบบเมื่อเป็นไปได้ จะมีเฉพาะ
ใช้กับแอปที่มี 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();
เวอร์ชัน maxSdk
พร็อพเพอร์ตี้นี้ไม่มีผลต่อบิลด์ NDK
เวอร์ชัน minSdk
minSdkVersion
ที่ตั้งค่าไว้ในไฟล์ build.gradle
จะเป็นตัวกำหนด API
พร้อมใช้งานในเวลาบิลด์ (ดู compileSdkVersion เพื่อทำความเข้าใจว่าเหตุใดความแตกต่างนี้
จากบิลด์ของ Java) และกำหนดเวอร์ชันระบบปฏิบัติการขั้นต่ำที่โค้ดของคุณ
ที่จะทำงานร่วมกันได้ด้วย
NDK จะใช้ minSdkVersion
เพื่อพิจารณาว่าจะใช้ฟีเจอร์ใดได้บ้าง
เมื่อคอมไพล์โค้ด เช่น พร็อพเพอร์ตี้นี้จะเป็นตัวกำหนด FORTIFY
ต่างๆ ใช้งานใน libc และอาจช่วยปรับปรุงประสิทธิภาพหรือขนาดด้วย
(เช่น แฮชของ GNU หรือ RELR) สำหรับไบนารีของคุณที่เข้ากันไม่ได้
Android เวอร์ชันเก่า แม้ว่าคุณจะไม่ได้ใช้ API ใหม่ใดๆ พร็อพเพอร์ตี้นี้
ยังคงควบคุมเวอร์ชันระบบปฏิบัติการขั้นต่ำที่สนับสนุนของโค้ดของคุณ
สำหรับแอปใหม่ ดูข้อมูลการเผยแพร่ของผู้ใช้ในโปรเจ็กต์ใหม่ของ Android Studio
Wizard หรือใน apilevels.com เลือกยอดคงเหลือระหว่าง
ส่วนแบ่งการตลาดและค่าใช้จ่ายในการบำรุงรักษาที่อาจเกิดขึ้น ยิ่งminSdkVersion
ต่ำลง
คุณก็ยิ่งต้องเสียเวลาไปกับการแก้ไขข้อบกพร่องเก่าๆ และเพิ่มพฤติกรรมการใช้วิดีโอสำรองมากขึ้น
สำหรับฟีเจอร์ที่ยังไม่ได้ใช้งาน
สำหรับแอปที่มีอยู่ ให้เพิ่ม minSdkVersion
เมื่อใดก็ตามที่ระดับ API เดิมยังอยู่
คุ้มค่ากับค่าใช้จ่ายในการบำรุงรักษานานกว่า หรือลดลงถ้าผู้ใช้ต้องการใช้
คุ้มค่ากับค่าใช้จ่ายในการบำรุงรักษาใหม่ Play Console มีเมตริกเฉพาะ
การเผยแพร่แอปของผู้ใช้
minSdkVersion
ของแอปพลิเคชันพร้อมให้คุณใช้งานสำหรับผู้ประมวลผลข้อมูลล่วงหน้าแล้ว
ผ่านมาโคร __ANDROID_MIN_SDK_VERSION__
(__ANDROID_API__
เดิมคือ
เหมือนกัน แต่ชอบแบบแรกมากกว่าเพราะความหมายชัดเจนกว่า) มาโครนี้
Clang จะกำหนดโดยอัตโนมัติ ดังนั้นจึงไม่จำเป็นต้องใส่ส่วนหัวเพื่อใช้งาน สำหรับ
บิลด์ NDK มาโครนี้จะได้รับการกำหนดเสมอ