ข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK

ตั้งแต่ Android 9 (ระดับ API 28) เป็นต้นไป แพลตฟอร์มจะจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ที่แอปของคุณใช้ได้ ข้อจำกัดเหล่านี้จะมีผลเมื่อใดก็ตามที่แอปอ้างอิงอินเทอร์เฟซที่ไม่ใช่ SDK หรือพยายามรับแฮนเดิลโดยใช้การสะท้อนหรือ JNI ข้อจำกัดเหล่านี้มีไว้เพื่อช่วยปรับปรุงประสบการณ์ของผู้ใช้และนักพัฒนาแอป รวมถึงลดความเสี่ยงของการขัดข้องสำหรับผู้ใช้และการเปิดตัวฉุกเฉินสำหรับนักพัฒนาแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับการตัดสินใจนี้ได้ที่การปรับปรุงความเสถียรโดยลดการใช้อินเทอร์เฟซที่ไม่ใช่ SDK

แยกความแตกต่างระหว่างอินเทอร์เฟซ SDK และอินเทอร์เฟซที่ไม่ใช่ SDK

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

แอปควรใช้เฉพาะส่วนของคลาสใน SDK ที่มีการบันทึกไว้อย่างเป็นทางการเพื่อหลีกเลี่ยงการขัดข้องและลักษณะการทำงานที่ไม่คาดคิด ซึ่งหมายความว่าคุณไม่ควรเข้าถึงเมธอดหรือฟิลด์ที่ไม่ได้ระบุไว้ใน SDK เมื่อโต้ตอบกับคลาสโดยใช้กลไกต่างๆ เช่น การสะท้อน

รายการ API ที่ไม่ใช่ SDK

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

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

รายการ แท็กโค้ด คำอธิบาย
รายการที่บล็อก
  • blocked
  • เลิกใช้งาน: blacklist
อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งคุณใช้ไม่ได้ ไม่ว่าแอปจะมีระดับ API เป้าหมายใดก็ตาม หากแอปพยายามเข้าถึงอินเทอร์เฟซเหล่านี้ ระบบจะแสดงข้อผิดพลาด
บล็อกแบบมีเงื่อนไข
  • max-target-x
  • เลิกใช้งาน: greylist-max-x

ตั้งแต่ Android 9 (ระดับ API 28) เป็นต้นไป API แต่ละระดับจะมีอินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งถูกจำกัดเมื่อแอปกำหนดเป้าหมายเป็นระดับ API นั้น

รายการเหล่านี้จะมีป้ายกำกับตามระดับ API สูงสุด (max-target-x) ที่แอปสามารถกำหนดเป้าหมายได้ก่อนที่แอปจะไม่สามารถเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ในรายการนั้นได้อีกต่อไป ตัวอย่างเช่น อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งไม่ถูกบล็อกใน Android Pie แต่ถูกบล็อกใน Android 10 จะเป็นส่วนหนึ่งของรายการ max-target-p (greylist-max-p) โดยที่ "p" ย่อมาจาก Pie หรือ Android 9 (ระดับ API 28)

หากแอปพยายามเข้าถึงอินเทอร์เฟซที่ถูกจำกัดสำหรับระดับ API เป้าหมาย ระบบจะทำงานเสมือนว่า API เป็นส่วนหนึ่งของรายการที่บล็อก

ไม่รองรับ
  • unsupported
  • เลิกใช้งาน: greylist
อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งไม่มีข้อจำกัดและแอปของคุณใช้ได้ อย่างไรก็ตาม โปรดทราบว่าอินเทอร์เฟซเหล่านี้ไม่ได้รับการสนับสนุนและอาจมีการเปลี่ยนแปลงโดยไม่ต้องแจ้งให้ทราบล่วงหน้า คาดว่าอินเทอร์เฟซเหล่านี้จะถูกบล็อกแบบมีเงื่อนไขใน Android เวอร์ชันต่อๆ ไปในรายการ max-target-x
SDK
  • ทั้ง public-api และ sdk
  • เลิกใช้งาน: ทั้ง public-api และ whitelist
อินเทอร์เฟซที่ใช้ได้อย่างอิสระและได้รับการรองรับเป็นส่วนหนึ่งของดัชนีแพ็กเกจเฟรมเวิร์ก Android ที่มีเอกสารประกอบอย่างเป็นทางการ
Test API
  • 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  1
adb shell settings put global hidden_api_policy_p_apps 1

หากต้องการรีเซ็ตนโยบายการบังคับใช้ API เป็นการตั้งค่าเริ่มต้น ให้ใช้คำสั่งต่อไปนี้

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps

คุณสามารถตั้งค่าจำนวนเต็มในนโยบายการบังคับใช้ API เป็นค่าใดค่าหนึ่งต่อไปนี้

  • 0: ปิดใช้การตรวจหาอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมด การใช้การตั้งค่านี้จะปิดใช้ข้อความในบันทึกทั้งหมดสำหรับการใช้งานอินเทอร์เฟซที่ไม่ใช่ SDK และทำให้คุณทดสอบแอปโดยใช้ StrictMode API ไม่ได้ เราไม่แนะนำให้ใช้การตั้งค่านี้
  • 1: เปิดใช้การเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมด แต่พิมพ์ข้อความในบันทึกพร้อมคำเตือนสำหรับการใช้งานอินเทอร์เฟซที่ไม่ใช่ SDK การใช้การตั้งค่านี้ยังช่วยให้คุณทดสอบแอปโดยใช้ StrictMode API ได้ด้วย
  • 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)