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

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

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

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

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

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

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

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

รายการ แท็กโค้ด คำอธิบาย
รายการที่บล็อก
  • 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-pgreylist-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 ที่บันทึกไว้เป็นทางการ ดัชนีแพ็กเกจ
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 ใช้)
  • วิธีการเข้าถึง: การลิงก์ การใช้การทบทวน หรือการใช้ JNI
  • อินเทอร์เฟซที่ไม่ใช่ SDK อยู่ในรายการใด

คุณสามารถใช้ adb logcat เพื่อเข้าถึงข้อความในบันทึกเหล่านี้ ซึ่งจะปรากฏภายใต้ PID ของแอปที่กำลังทำงานอยู่ ตัวอย่างเช่น รายการในบันทึกอาจมีลักษณะดังนี้

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

ทดสอบโดยใช้ StrictMode API

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

ทดสอบโดยใช้เครื่องมือ Lint ของ Android Studio

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

นอกจากนี้ คุณยังเรียกใช้เครื่องมือ Lint จากบรรทัดคำสั่ง หรือเรียกใช้การตรวจสอบ ด้วยตนเองในโปรเจ็กต์ โฟลเดอร์ หรือไฟล์ที่เฉพาะเจาะจงได้ด้วย

ทดสอบโดยใช้ Play Console

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

ดูข้อมูลเพิ่มเติมได้ที่ส่วนความเข้ากันได้ของ Android ในหัวข้อใช้รายงานก่อนการเปิดตัว เพื่อระบุปัญหา

ขอ API สาธารณะใหม่

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

เมื่อสร้างคำขอฟีเจอร์ โปรดระบุข้อมูลต่อไปนี้

  • API ที่ไม่รองรับที่คุณใช้ รวมถึงตัวอธิบายแบบเต็มที่เห็นในข้อความ Logcat Accessing hidden ...
  • เหตุผลที่คุณต้องใช้ API เหล่านี้ รวมถึงรายละเอียดเกี่ยวกับฟีเจอร์ระดับสูงที่จำเป็นต้องใช้ API ไม่ใช่แค่รายละเอียดระดับต่ำ
  • เหตุผลที่ API SDK สาธารณะที่เกี่ยวข้องไม่เพียงพอต่อวัตถุประสงค์ของคุณ
  • ทางเลือกอื่นๆ ที่คุณลองใช้และเหตุผลที่ทางเลือกเหล่านั้นไม่ได้ผล

เมื่อระบุรายละเอียดเหล่านี้ในคำขอฟีเจอร์ คุณจะเพิ่มโอกาสที่จะได้รับ API สาธารณะใหม่

คำถามอื่นๆ

ส่วนนี้มีคำตอบสำหรับคำถามอื่นๆ ที่นักพัฒนาแอปถามเข้ามาบ่อยๆ

คำถามทั่วไป

Google จะมั่นใจได้อย่างไรว่าสามารถตอบสนองความต้องการของแอปทั้งหมดผ่านเครื่องมือติดตามปัญหา

เราสร้างรายการเริ่มต้นสำหรับ Android 9 (API ระดับ 28) ผ่านการวิเคราะห์แบบคงที่ของแอป ซึ่งเสริมด้วยวิธีต่อไปนี้

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

เมื่อประเมินรายการสำหรับการเปิดตัวเวอร์ชันใหม่แต่ละเวอร์ชัน เราจะพิจารณาการใช้ API รวมถึงความคิดเห็นของนักพัฒนาแอปผ่านเครื่องมือติดตามปัญหา

ฉันจะเปิดใช้การเข้าถึงอินเทอร์เฟซที่ไม่ใช่ 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 เป็นค่าใดค่าหนึ่งต่อไปนี้

คำถามเกี่ยวกับรายการอินเทอร์เฟซที่ไม่ใช่ 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)