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

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