ตั้งแต่ Android 9 (ระดับ API 28) เป็นต้นไป แพลตฟอร์มจะจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ที่แอปของคุณใช้ได้ ข้อจำกัดเหล่านี้จะมีผลเมื่อใดก็ตามที่แอปอ้างอิงอินเทอร์เฟซที่ไม่ใช่ SDK หรือพยายามรับแฮนเดิลโดยใช้การสะท้อนหรือ JNI ข้อจำกัดเหล่านี้มีไว้เพื่อช่วยปรับปรุงประสบการณ์ของผู้ใช้และนักพัฒนาแอป รวมถึงลดความเสี่ยงของการขัดข้องสำหรับผู้ใช้และการเปิดตัวฉุกเฉินสำหรับนักพัฒนาแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับการตัดสินใจนี้ได้ที่การปรับปรุงความเสถียรโดยลดการใช้อินเทอร์เฟซที่ไม่ใช่ SDK
แยกความแตกต่างระหว่างอินเทอร์เฟซ SDK และอินเทอร์เฟซที่ไม่ใช่ SDK
โดยทั่วไปแล้ว อินเทอร์เฟซ SDK สาธารณะคืออินเทอร์เฟซที่พบในเอกสารประกอบของดัชนีแพ็กเกจเฟรมเวิร์ก Android การจัดการอินเทอร์เฟซที่ไม่ใช่ SDK เป็นรายละเอียดการใช้งานที่ API แยกออกมา ดังนั้นอินเทอร์เฟซเหล่านี้จึงอาจมีการเปลี่ยนแปลงโดยไม่ต้องแจ้งให้ทราบล่วงหน้า
แอปควรใช้เฉพาะส่วนของคลาสใน SDK ที่มีการบันทึกไว้อย่างเป็นทางการเพื่อหลีกเลี่ยงการขัดข้องและลักษณะการทำงานที่ไม่คาดคิด ซึ่งหมายความว่าคุณไม่ควรเข้าถึงเมธอดหรือฟิลด์ที่ไม่ได้ระบุไว้ใน SDK เมื่อโต้ตอบกับคลาสโดยใช้กลไกต่างๆ เช่น การสะท้อน
รายการ API ที่ไม่ใช่ SDK
Android แต่ละรุ่นจะจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK เพิ่มเติม เราทราบดีว่าข้อจำกัดเหล่านี้อาจส่งผลต่อเวิร์กโฟลว์การเผยแพร่ของคุณ และเราต้องการให้คุณมีเครื่องมือในการตรวจหาการใช้อินเทอร์เฟซที่ไม่ใช่ SDK, มีโอกาสแสดงความคิดเห็น และมีเวลาวางแผนและปรับตัวให้เข้ากับนโยบายใหม่
เพื่อลดผลกระทบของข้อจำกัดที่ไม่ใช่ SDK ในเวิร์กโฟลว์การพัฒนา อินเทอร์เฟซที่ไม่ใช่ SDK จะแบ่งออกเป็นรายการที่กำหนดความเข้มงวดในการจำกัดการใช้งาน โดยขึ้นอยู่กับระดับ API ที่กำหนดเป้าหมาย ตารางต่อไปนี้จะอธิบายรายการแต่ละรายการ
| รายการ | แท็กโค้ด | คำอธิบาย |
|---|---|---|
| รายการที่บล็อก |
|
อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งคุณใช้ไม่ได้ ไม่ว่าแอปจะมีระดับ API เป้าหมายใดก็ตาม หากแอปพยายามเข้าถึงอินเทอร์เฟซเหล่านี้ ระบบจะแสดงข้อผิดพลาด |
| บล็อกแบบมีเงื่อนไข |
|
ตั้งแต่ Android 9 (ระดับ API 28) เป็นต้นไป API แต่ละระดับจะมีอินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งถูกจำกัดเมื่อแอปกำหนดเป้าหมายเป็นระดับ API นั้น รายการเหล่านี้จะมีป้ายกำกับตามระดับ API สูงสุด ( หากแอปพยายามเข้าถึงอินเทอร์เฟซที่ถูกจำกัดสำหรับระดับ API เป้าหมาย ระบบจะทำงานเสมือนว่า API เป็นส่วนหนึ่งของรายการที่บล็อก |
| ไม่รองรับ |
|
อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งไม่มีข้อจำกัดและแอปของคุณใช้ได้ อย่างไรก็ตาม โปรดทราบว่าอินเทอร์เฟซเหล่านี้ไม่ได้รับการสนับสนุนและอาจมีการเปลี่ยนแปลงโดยไม่ต้องแจ้งให้ทราบล่วงหน้า คาดว่าอินเทอร์เฟซเหล่านี้จะถูกบล็อกแบบมีเงื่อนไขใน Android เวอร์ชันต่อๆ ไปในรายการ max-target-x |
| SDK |
|
อินเทอร์เฟซที่ใช้ได้อย่างอิสระและได้รับการรองรับเป็นส่วนหนึ่งของดัชนีแพ็กเกจเฟรมเวิร์ก Android ที่มีเอกสารประกอบอย่างเป็นทางการ |
| Test API |
|
อินเทอร์เฟซที่ใช้สำหรับการทดสอบระบบภายใน เช่น API ที่อำนวยความสะดวกในการทดสอบผ่านชุดเครื่องมือทดสอบความเข้ากันได้ (CTS) API ทดสอบไม่ได้เป็นส่วนหนึ่งของ SDK ตั้งแต่ Android 11 (API ระดับ 30) เป็นต้นไป API ทดสอบจะรวมอยู่ในรายการที่บล็อก ดังนั้นแอปจึงไม่ได้รับอนุญาตให้ใช้ API ทดสอบไม่ว่าจะมีระดับ API เป้าหมายใดก็ตาม ระบบไม่รองรับ API ทดสอบทั้งหมดและอาจมีการเปลี่ยนแปลงโดยไม่ต้องแจ้งให้ทราบล่วงหน้า ไม่ว่า API ของแพลตฟอร์มจะอยู่ในระดับใดก็ตาม |
แม้ว่าคุณจะใช้อินเทอร์เฟซที่ไม่ใช่ SDK บางรายการได้ (ขึ้นอยู่กับระดับ API เป้าหมายของแอป) แต่การใช้เมธอดหรือฟิลด์ที่ไม่ใช่ SDK ใดๆ ก็มีความเสี่ยงสูงที่จะทำให้แอปขัดข้องเสมอ หากแอปของคุณใช้อินเทอร์เฟซที่ไม่ใช่ SDK คุณควรเริ่มวางแผนย้ายไปใช้อินเทอร์เฟซ SDK หรือทางเลือกอื่นๆ หากไม่พบวิธีอื่นแทนการใช้อินเทอร์เฟซที่ไม่ใช่ SDK สำหรับฟีเจอร์ในแอป คุณควรขอ API สาธารณะใหม่
ระบุว่าอินเทอร์เฟซอยู่ในรายการใด
รายการอินเทอร์เฟซที่ไม่ใช่ SDK สร้างขึ้นเป็นส่วนหนึ่งของแพลตฟอร์ม ดูข้อมูลเกี่ยวกับ Android แต่ละรุ่นได้ในส่วนต่อไปนี้
Android 16
สำหรับ Android 16 (API ระดับ 36) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
การตรวจสอบข้อผิดพลาดด้วย SHA-256:
9102af02fe6ab68b92464bdff5e5b09f3bd62c65d1130aaf85d3296f17d38074
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 16 ได้ที่การอัปเดตข้อจำกัดของอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 16
Android 15
สำหรับ Android 15 (API ระดับ 35) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
การตรวจสอบข้อผิดพลาดด้วย SHA-256:
40134e205e58922a708c453726b279a296e6a1f34a988abd90cec0f3432ea5a9
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 15 ได้ที่การอัปเดตข้อจำกัดของอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 15
Android 14
สำหรับ Android 14 (API ระดับ 34) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
การตรวจสอบข้อผิดพลาดด้วย SHA-256:
7e00db074cbe51c51ff4b411f7b48e98692951395c5c17d069c822cc1d0eae0f
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 14 ได้ที่การอัปเดตข้อจำกัดของอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 14
Android 13
สำหรับ Android 13 (API ระดับ 33) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
การตรวจสอบข้อผิดพลาดด้วย SHA-256:
233a277aa8ac475b6df61bffd95665d86aac6eb2ad187b90bf42a98f5f2a11a3
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 13 รวมถึง API สาธารณะทางเลือกที่แนะนำสำหรับ API ที่ถูกบล็อกแบบมีเงื่อนไขใน Android 13 ได้ที่การอัปเดตข้อจำกัดของอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 13
Android 12
สำหรับ Android 12 (API ระดับ 31) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
การตรวจสอบข้อผิดพลาดด้วย SHA-256:
40674ff4291eb268f86561bf687e69dbd013df9ec9531a460404532a4ac9a761
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 12 รวมถึง API สาธารณะทางเลือกที่แนะนำสำหรับ API ที่ถูกบล็อกแบบมีเงื่อนไขใน Android 12 ได้ที่การเปลี่ยนแปลงรายการสำหรับ Android 12
Android 11
สำหรับ Android 11 (API ระดับ 30) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
การตรวจสอบข้อผิดพลาดด้วย SHA-256:
a19d839f4f61dc9c94960ae977b2e0f3eb30f880ba1ffe5108e790010b477a56
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 11 รวมถึง API สาธารณะทางเลือกที่แนะนำสำหรับ API ที่ถูกบล็อกแบบมีเงื่อนไขใน Android 11 ได้ที่การเปลี่ยนแปลงรายการสำหรับ Android 11
Android 10
สำหรับ Android 10 (API ระดับ 29) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
การตรวจสอบข้อผิดพลาดด้วย SHA-256:
f22a59c215e752777a114bd9b07b0b6b4aedfc8e49e6efca0f99681771c5bfeb
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 10 รวมถึง API สาธารณะทางเลือกที่แนะนำสำหรับ API ที่ถูกบล็อกแบบมีเงื่อนไขใน Android 10 ได้ที่การเปลี่ยนแปลงรายการสำหรับ Android 10
Android 9
สำหรับ Android 9 (API ระดับ 28) ไฟล์ข้อความต่อไปนี้มีรายการ API ที่ไม่ใช่ SDK ซึ่งไม่ถูกจำกัด (อยู่ในรายการที่ต้องสงสัย)
hiddenapi-light-greylist.txt
รายการที่บล็อก (blacklist) และรายการ API ที่ถูกบล็อกแบบมีเงื่อนไข (รายการสีเทาเข้ม) จะได้มา ณ เวลาบิลด์
สร้างรายการจาก AOSP
เมื่อทำงานกับ AOSP คุณสามารถสร้างไฟล์ hiddenapi-flags.csv ที่มีอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้องได้ โดยดาวน์โหลดแหล่งที่มาของ AOSP แล้วเรียกใช้คำสั่งต่อไปนี้
m out/soong/hiddenapi/hiddenapi-flags.csv
จากนั้นคุณจะเห็นไฟล์ในตำแหน่งต่อไปนี้
out/soong/hiddenapi/hiddenapi-flags.csv
ลักษณะการทำงานที่คาดไว้เมื่อมีการเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ที่ถูกจำกัด
ตารางต่อไปนี้อธิบายลักษณะการทำงานที่คาดว่าจะเกิดขึ้นหากแอปพยายามเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งอยู่ในรายการที่บล็อก
| วิธีการเข้าถึง | ผลลัพธ์ |
|---|---|
| คำสั่ง Dalvik ที่อ้างอิงฟิลด์ | ปา NoSuchFieldError แล้ว |
| คำสั่ง Dalvik ที่อ้างอิงเมธอด | ปา NoSuchMethodError แล้ว |
การสะท้อนโดยใช้ Class.getDeclaredField() หรือ Class.getField() |
ปา NoSuchFieldException แล้ว |
การสะท้อนโดยใช้ Class.getDeclaredMethod(), Class.getMethod() |
ปา NoSuchMethodException แล้ว |
การสะท้อนโดยใช้ Class.getDeclaredFields(), Class.getFields() |
สมาชิกที่ไม่ใช่ SDK จะไม่อยู่ในผลลัพธ์ |
การสะท้อนโดยใช้ Class.getDeclaredMethods(), Class.getMethods() |
สมาชิกที่ไม่ใช่ SDK จะไม่อยู่ในผลลัพธ์ |
JNI โดยใช้ env->GetFieldID() |
ส่งคืน NULL ครั้ง ขว้าง NoSuchFieldError ครั้ง |
JNI โดยใช้ env->GetMethodID() |
ส่งคืน NULL ครั้ง ขว้าง NoSuchMethodError ครั้ง |
ทดสอบแอปเพื่อหาอินเทอร์เฟซที่ไม่ใช่ SDK
คุณสามารถใช้วิธีการต่างๆ เพื่อทดสอบอินเทอร์เฟซที่ไม่ใช่ SDK ในแอปได้
ทดสอบโดยใช้แอปที่แก้ไขข้อบกพร่องได้
คุณทดสอบอินเทอร์เฟซที่ไม่ใช่ SDK ได้โดยการสร้างและเรียกใช้แอปที่แก้ไขข้อบกพร่องได้ในอุปกรณ์หรือโปรแกรมจำลองที่ใช้ Android 9 (ระดับ API 28) ขึ้นไป ตรวจสอบว่าอุปกรณ์หรือโปรแกรมจำลองที่คุณใช้ตรงกับระดับ API เป้าหมายของแอป
ขณะทำการทดสอบในแอป ระบบจะพิมพ์ข้อความในบันทึกหากแอปเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK บางรายการ คุณตรวจสอบข้อความในบันทึกของแอปเพื่อดูรายละเอียดต่อไปนี้ได้
- คลาส ชื่อ และประเภทที่ประกาศ (ในรูปแบบที่ Android Runtime ใช้)
- วิธีการเข้าถึง: การลิงก์ การใช้การสะท้อน หรือการใช้ JNI
- รายการที่อินเทอร์เฟซที่ไม่ใช่ SDK นั้นอยู่
คุณสามารถใช้ adb logcat เพื่อเข้าถึงข้อความในบันทึกเหล่านี้ ซึ่งจะปรากฏใต้ PID ของแอปที่ทำงานอยู่ ตัวอย่างเช่น รายการในบันทึกอาจมีลักษณะดังนี้
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
ทดสอบโดยใช้ StrictMode API
นอกจากนี้ คุณยังทดสอบอินเทอร์เฟซที่ไม่ใช่ SDK ได้โดยใช้ API StrictMode ใช้เมธอด detectNonSdkApiUsage เพื่อเปิดใช้ฟีเจอร์นี้ หลังจากเปิดใช้ StrictMode API คุณจะรับ Callback สำหรับการใช้อินเทอร์เฟซที่ไม่ใช่ SDK แต่ละครั้งได้โดยใช้ penaltyListener ซึ่งคุณสามารถใช้การจัดการที่กำหนดเองได้ ออบเจ็กต์ Violation ที่ระบุใน Callback มาจาก Throwable และสแต็กเทรซที่แนบมาจะให้บริบทของการใช้งาน
ทดสอบโดยใช้เครื่องมือ Lint ของ Android Studio
เมื่อใดก็ตามที่คุณสร้างแอปใน Android Studio เครื่องมือ Lint จะตรวจสอบโค้ดเพื่อหาปัญหาที่อาจเกิดขึ้น หากแอปใช้อินเทอร์เฟซที่ไม่ใช่ SDK คุณอาจเห็นข้อผิดพลาดหรือคำเตือนเกี่ยวกับบิลด์ ทั้งนี้ขึ้นอยู่กับว่าอินเทอร์เฟซเหล่านั้นอยู่ในรายการใด
นอกจากนี้ คุณยังเรียกใช้เครื่องมือ Lint จากบรรทัดคำสั่งหรือเรียกใช้การตรวจสอบด้วยตนเองในโปรเจ็กต์ โฟลเดอร์ หรือไฟล์ที่เฉพาะเจาะจงได้ด้วย
ทดสอบโดยใช้ Play Console
เมื่อคุณอัปโหลดแอปไปยังแทร็กทดสอบใน Play Console ระบบจะทดสอบแอปเพื่อหาปัญหาที่อาจเกิดขึ้นโดยอัตโนมัติและสร้างรายงานก่อนการเปิดตัว หากแอปใช้อินเทอร์เฟซที่ไม่ใช่ SDK ข้อผิดพลาดหรือคำเตือนจะแสดงในรายงานก่อนการเปิดตัว โดยขึ้นอยู่กับว่าอินเทอร์เฟซเหล่านั้นอยู่ในรายการใด
ดูข้อมูลเพิ่มเติมได้ที่ส่วนความเข้ากันได้ของ Android ในหัวข้อใช้รายงานก่อนการเปิดตัวเพื่อระบุปัญหา
ขอ API สาธารณะใหม่
หากไม่พบวิธีอื่นแทนการใช้อินเทอร์เฟซที่ไม่ใช่ SDK สำหรับฟีเจอร์ในแอป คุณสามารถขอ API สาธารณะใหม่ได้โดยสร้างคำขอฟีเจอร์ใน Issue Tracker
เมื่อสร้างคำขอฟีเจอร์ ให้ระบุข้อมูลต่อไปนี้
- API ที่ไม่รองรับที่คุณใช้อยู่ รวมถึงข้อบ่งชี้แบบเต็มที่เห็นในข้อความ logcat
Accessing hidden ... - เหตุผลที่คุณต้องใช้ API เหล่านี้ รวมถึงรายละเอียดเกี่ยวกับฟีเจอร์ระดับสูงที่จำเป็นต้องใช้ API ไม่ใช่แค่รายละเอียดระดับต่ำ
- เหตุใด API ของ SDK สาธารณะที่เกี่ยวข้องจึงไม่เพียงพอสำหรับวัตถุประสงค์ของคุณ
- ทางเลือกอื่นๆ ที่คุณได้ลองใช้และเหตุผลที่ทางเลือกเหล่านั้นไม่ได้ผล
การระบุรายละเอียดเหล่านี้ในคำขอฟีเจอร์จะเพิ่มโอกาสที่ API สาธารณะใหม่จะได้รับอนุมัติ
คำถามอื่นๆ
ส่วนนี้ประกอบด้วยคำตอบสำหรับคำถามอื่นๆ ที่นักพัฒนาแอปมักถามบ่อยๆ ดังนี้
คำถามทั่วไป
Google จะแน่ใจได้อย่างไรว่าจะสามารถรวบรวมความต้องการของแอปทั้งหมดผ่านเครื่องมือติดตามปัญหา
เราสร้างรายการเริ่มต้นสำหรับ Android 9 (API ระดับ 28) ผ่านการวิเคราะห์แบบคงที่ของแอปซึ่งเสริมด้วยวิธีการต่อไปนี้
- การทดสอบแอปยอดนิยมทั้งใน Play และนอก Play ด้วยตนเอง
- รายงานภายใน
- การเก็บรวบรวมข้อมูลโดยอัตโนมัติจากผู้ใช้ภายใน
- รายงานเวอร์ชันตัวอย่างสำหรับนักพัฒนาซอฟต์แวร์
- การวิเคราะห์แบบคงที่เพิ่มเติมซึ่งออกแบบมาเพื่อรวมผลบวกลวงมากขึ้นอย่างระมัดระวัง
ขณะประเมินรายการสำหรับแต่ละรุ่นใหม่ เราจะพิจารณาการใช้งาน API รวมถึงความคิดเห็นของนักพัฒนาแอปผ่าน Issue Tracker
ฉันจะเปิดใช้การเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ได้อย่างไร
คุณเปิดใช้การเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ในอุปกรณ์สำหรับการพัฒนาได้โดยใช้คำสั่ง adb เพื่อเปลี่ยนนโยบายการบังคับใช้ API คำสั่งที่คุณใช้จะแตกต่างกันไป ขึ้นอยู่กับระดับ API คำสั่งเหล่านี้ไม่จำเป็นต้องใช้อุปกรณ์ที่รูท
- Android 10 (ระดับ API 29) ขึ้นไป
หากต้องการเปิดใช้สิทธิ์เข้าถึง ให้ใช้ adb ต่อไปนี้
คำสั่ง:
adb shell settings put global hidden_api_policy 1
หากต้องการรีเซ็ตนโยบายการบังคับใช้ API เป็นการตั้งค่าเริ่มต้น ให้ใช้คำสั่งต่อไปนี้
adb shell settings delete global hidden_api_policy
- Android 9 (API ระดับ 28)
หากต้องการเปิดใช้สิทธิ์เข้าถึง ให้ใช้คำสั่ง adb ต่อไปนี้
adb shell settings put global hidden_api_policy_pre_p_apps 1adb shell settings put global hidden_api_policy_p_apps 1หากต้องการรีเซ็ตนโยบายการบังคับใช้ API เป็นการตั้งค่าเริ่มต้น ให้ใช้คำสั่งต่อไปนี้
adb shell settings delete global hidden_api_policy_pre_p_appsadb shell settings delete global hidden_api_policy_p_apps
คุณสามารถตั้งค่าจำนวนเต็มในนโยบายการบังคับใช้ API เป็นค่าใดค่าหนึ่งต่อไปนี้
- 0: ปิดใช้การตรวจหาอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมด การใช้การตั้งค่านี้จะปิดใช้ข้อความในบันทึกทั้งหมดสำหรับการใช้งานอินเทอร์เฟซที่ไม่ใช่ SDK และทำให้คุณทดสอบแอปโดยใช้
StrictModeAPI ไม่ได้ เราไม่แนะนำให้ใช้การตั้งค่านี้ - 1: เปิดใช้การเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมด แต่พิมพ์ข้อความในบันทึกพร้อมคำเตือนสำหรับการใช้งานอินเทอร์เฟซที่ไม่ใช่ SDK การใช้การตั้งค่านี้ยังช่วยให้คุณทดสอบแอปโดยใช้
StrictModeAPI ได้ด้วย - 2: ไม่อนุญาตให้ใช้อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งอยู่ในรายการที่บล็อกหรือถูกบล็อกแบบมีเงื่อนไขสำหรับระดับ API เป้าหมายของคุณ
คำถามเกี่ยวกับรายการอินเทอร์เฟซที่ไม่ใช่ SDK
ฉันจะดูรายการ API ที่ไม่ใช่ SDK ในอิมเมจระบบได้จากที่ใด
โดยจะเข้ารหัสในบิตแฟล็กการเข้าถึงฟิลด์และเมธอดในไฟล์ dex ของแพลตฟอร์ม ไม่มีไฟล์แยกต่างหากในอิมเมจระบบที่มีรายการเหล่านี้
รายการ API ที่ไม่ใช่ SDK ในอุปกรณ์ OEM ต่างๆ ที่ใช้ Android เวอร์ชันเดียวกันเหมือนกันไหม
OEM สามารถเพิ่มอินเทอร์เฟซของตนเองลงในรายการที่บล็อก (รายการที่ไม่อนุญาต) ได้ แต่จะนำอินเทอร์เฟซออกจากรายการ API ที่ไม่ใช่ SDK ของ AOSP ไม่ได้ CDD จะป้องกันการเปลี่ยนแปลงดังกล่าว และการทดสอบ CTS จะช่วยให้มั่นใจว่า Android Runtime บังคับใช้รายการนี้
คำถามเกี่ยวกับความเข้ากันได้ของแอปที่เกี่ยวข้อง
มีข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ NDK ในโค้ดแบบเนทีฟไหม
Android SDK มีอินเทอร์เฟซ Java แพลตฟอร์มเริ่มจำกัดการเข้าถึงอินเทอร์เฟซที่ไม่ใช่ NDK สำหรับโค้ด C/C++ แบบเนทีฟใน Android 7 (ระดับ API 26) ดูข้อมูลเพิ่มเติมได้ที่การปรับปรุงความเสถียรด้วยข้อจำกัดสัญลักษณ์ C/C++ ส่วนตัวใน Android N
มีแผนที่จะจำกัด dex2oat หรือการจัดการไฟล์ DEX ไหม
เราไม่มีแผนที่จะจำกัดการเข้าถึงไบนารี dex2oat แต่เราไม่ได้ตั้งใจให้รูปแบบไฟล์ DEX มีความเสถียรหรือเป็นอินเทอร์เฟซสาธารณะนอกเหนือจากส่วนที่ระบุไว้แบบสาธารณะในรูปแบบ Dalvik Executable เราขอสงวนสิทธิ์ในการแก้ไขหรือกำจัด dex2oat และส่วนที่ไม่ได้ระบุไว้ของรูปแบบ DEX ได้ทุกเมื่อ นอกจากนี้ โปรดทราบว่าไฟล์ที่ได้จาก dex2oat เช่น ODEX (หรือที่เรียกว่า OAT), VDEX และ CDEX ล้วนเป็นรูปแบบที่ไม่ได้ระบุ
จะเกิดอะไรขึ้นหาก SDK ของบุคคลที่สามที่สำคัญ (เช่น เครื่องมือสร้างความสับสน) หลีกเลี่ยงการใช้อินเทอร์เฟซที่ไม่ใช่ SDK ไม่ได้ แต่ก็มุ่งมั่นที่จะรักษาความเข้ากันได้กับ Android เวอร์ชันในอนาคต Android จะยกเว้นข้อกำหนดด้านความเข้ากันได้ในกรณีนี้ได้ไหม
เราไม่มีแผนที่จะยกเว้นข้อกำหนดด้านความเข้ากันได้เป็นราย SDK หากนักพัฒนา SDK สามารถรักษาความเข้ากันได้โดยอาศัยอินเทอร์เฟซในรายการที่ไม่รองรับ (เดิมคือรายการสีเทา) เท่านั้น นักพัฒนาควรเริ่มวางแผนย้ายข้อมูลไปยังอินเทอร์เฟซ SDK หรือทางเลือกอื่นๆ และขอ API สาธารณะใหม่เมื่อไม่พบทางเลือกอื่นนอกเหนือจากการใช้อินเทอร์เฟซที่ไม่ใช่ SDK
ข้อจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK มีผลกับแอปทั้งหมด รวมถึงแอประบบและแอปของบุคคลที่หนึ่ง ไม่ใช่แค่แอปของบุคคลที่สามใช่ไหม
ใช่ อย่างไรก็ตาม เรายกเว้นแอปที่รับรองด้วยคีย์แพลตฟอร์มและแอปอิมเมจระบบบางแอป โปรดทราบว่าข้อยกเว้นเหล่านี้มีผลกับแอปที่เป็นส่วนหนึ่งของอิมเมจระบบ (หรือแอปอิมเมจระบบที่อัปเดตแล้ว) เท่านั้น รายการนี้มีไว้สำหรับแอปที่สร้างโดยใช้ API แพลตฟอร์มส่วนตัวเท่านั้น ไม่ใช่ API ของ SDK (ซึ่ง LOCAL_PRIVATE_PLATFORM_APIS := true)