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

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

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

โดยทั่วไปแล้ว อินเทอร์เฟซ SDK สาธารณะคืออินเทอร์เฟซที่พบในเอกสารประกอบของ Package Index เฟรมเวิร์ก 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-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) Test API ไม่ได้เป็นส่วนหนึ่งของ SDK ตั้งแต่ Android 11 (API ระดับ 30) เป็นต้นไป API การทดสอบจะรวมอยู่ในรายการที่บล็อก ดังนั้นแอปจึงไม่ได้รับอนุญาตให้ใช้ API ดังกล่าว ไม่ว่าระดับ API เป้าหมายของแอปจะเป็นอย่างไรก็ตาม ระบบไม่รองรับ API การทดสอบทั้งหมดและอาจมีการเปลี่ยนแปลงโดยไม่แจ้งให้ทราบล่วงหน้า ไม่ว่า API ของแพลตฟอร์มจะอยู่ในระดับใดก็ตาม

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

ระบุรายการที่อินเทอร์เฟซอยู่

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

Android 16 (เวอร์ชันตัวอย่างสำหรับนักพัฒนาซอฟต์แวร์)

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

ไฟล์: hiddenapi-flags.csv

ผลรวมตรวจสอบ SHA-256: a22d5c2fa9c24ec0b864f0680208e9794222d1921114abe3245979143ce6d1c6

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ 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 และสแต็กเทรซที่แนบมาจะให้บริบทของการใช้งาน

ทดสอบโดยใช้เครื่องมือ Veridex

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

ข้อจํากัดของเครื่องมือ Veridex มีดังนี้

  • ไม่สามารถตรวจหาการเรียกผ่าน JNI
  • โดยจะตรวจจับได้เฉพาะการเรียกใช้บางส่วนผ่านการสะท้อนเท่านั้น
  • การวิเคราะห์เส้นทางโค้ดที่ไม่ทำงานจะจำกัดอยู่ที่การตรวจสอบระดับ API
  • โดยจะใช้งานได้ในเครื่องที่รองรับคำสั่ง SSE4.2 และ POPCNT เท่านั้น

Windows

ไม่มีไบนารีของ Windows ดั้งเดิม แต่คุณสามารถเรียกใช้เครื่องมือ Veridex ใน Windows ได้โดยเรียกใช้ไบนารีของ Linux โดยใช้ Windows Subsystem for Linux (WSL) ก่อนทำตามขั้นตอนในส่วนนี้ ให้ติดตั้ง WSL และเลือก Ubuntu เป็นระบบปฏิบัติการ Linux

หลังจากติดตั้ง Ubuntu แล้ว ให้เปิดเทอร์มินัล Ubuntu แล้วทำตามขั้นตอนต่อไปนี้

  1. ดาวน์โหลดเครื่องมือ Veridex จากที่เก็บข้อมูลรันไทม์ Android ที่คอมไพล์ไว้ล่วงหน้า
  2. ดึงเนื้อหาของไฟล์ appcompat.tar.gz
  3. ในโฟลเดอร์ที่แตกไฟล์ ให้ค้นหาไฟล์ veridex-linux.zip แล้วแตกไฟล์
  4. ไปที่โฟลเดอร์ที่แตกไฟล์แล้วเรียกใช้คําสั่งต่อไปนี้ โดยที่ your-app.apk คือ APK ที่ต้องการทดสอบ

    ./appcompat.sh --dex-file=your-app.apk
    

macOS

หากต้องการเรียกใช้เครื่องมือ Veridex ใน macOS ให้ทำตามขั้นตอนต่อไปนี้

  1. ดาวน์โหลดเครื่องมือ Veridex จากที่เก็บข้อมูลรันไทม์ Android ที่คอมไพล์ไว้ล่วงหน้า
  2. ดึงเนื้อหาของไฟล์ appcompat.tar.gz
  3. ในโฟลเดอร์ที่แตกไฟล์ ให้ค้นหาไฟล์ veridex-mac.zip แล้วแตกไฟล์
  4. ไปที่โฟลเดอร์ที่แตกไฟล์แล้ว จากนั้นเรียกใช้คำสั่งต่อไปนี้ โดยที่ /path-from-root/your-app.apk คือเส้นทางไปยัง APK ที่ต้องการทดสอบ โดยเริ่มจากไดเรกทอรีรูทของระบบ

    ./appcompat.sh --dex-file=/path-from-root/your-app.apk
    

Linux

หากต้องการเรียกใช้เครื่องมือ Veridex ใน Linux ให้ทำตามขั้นตอนต่อไปนี้

  1. ดาวน์โหลดเครื่องมือ Veridex จากที่เก็บข้อมูลรันไทม์ Android ที่คอมไพล์ไว้ล่วงหน้า
  2. ดึงเนื้อหาของไฟล์ appcompat.tar.gz
  3. ในโฟลเดอร์ที่แตกไฟล์ ให้ค้นหาไฟล์ veridex-linux.zip แล้วแตกไฟล์
  4. ไปที่โฟลเดอร์ที่แตกไฟล์แล้วเรียกใช้คําสั่งต่อไปนี้ โดยที่ your-app.apk คือ APK ที่ต้องการทดสอบ

    ./appcompat.sh --dex-file=your-app.apk
    

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

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

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

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

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

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

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

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

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

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

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

คำถามอื่นๆ

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

คำถามทั่วไป

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

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

  • การทดสอบแอปยอดนิยมใน Play และแอปที่ไม่ใช่ของ 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 เป็นค่าใดค่าหนึ่งต่อไปนี้

  • 0: ปิดใช้การตรวจหาอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมด การใช้การตั้งค่านี้จะปิดใช้ข้อความบันทึกทั้งหมดสําหรับการใช้อินเทอร์เฟซที่ไม่ใช่ SDK และทําให้คุณไม่สามารถทดสอบแอปโดยใช้ StrictMode API เราไม่แนะนำให้ใช้การตั้งค่านี้
  • 1: เปิดใช้การเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมด แต่พิมพ์ข้อความบันทึกพร้อมคําเตือนสําหรับการใช้อินเทอร์เฟซที่ไม่ใช่ SDK การใช้การตั้งค่านี้ยังช่วยให้คุณทดสอบแอปโดยใช้ StrictMode API ได้ด้วย
  • 2: ไม่อนุญาตให้ใช้อินเทอร์เฟซที่ไม่ใช่ SDK ที่อยู่ในรายการที่บล็อกหรือถูกบล็อกแบบมีเงื่อนไขสำหรับระดับ API เป้าหมาย

คำถามเกี่ยวกับรายการอินเทอร์เฟซที่ไม่ใช่ SDK

ฉันจะดูรายการ API ที่ไม่ใช่ SDK ในอิมเมจระบบได้จากที่ใด

โดยระบบจะเข้ารหัสไว้ในบิต Flag การเข้าถึงฟิลด์และเมธอดในไฟล์ dex ของแพลตฟอร์ม ไม่มีไฟล์แยกต่างหากในอิมเมจระบบที่มีรายการเหล่านี้

รายการ API ที่ไม่ใช่ SDK จะเหมือนกันในอุปกรณ์ OEM ต่างๆ ที่มีเวอร์ชัน Android เดียวกันไหม

OEM สามารถเพิ่มอินเทอร์เฟซของตนเองลงในรายการที่บล็อก (รายการที่อนุญาต) แต่ไม่สามารถนําอินเทอร์เฟซออกจากรายการ API ที่ไม่ใช่ SDK ของ AOSP CDD ป้องกันการเปลี่ยนแปลงดังกล่าว และการทดสอบ CTS ช่วยให้มั่นใจว่ารันไทม์ Android บังคับใช้รายการดังกล่าว

อินเทอร์เฟซที่ไม่ใช่ NDK ในโค้ดเนทีฟมีข้อจำกัดไหม

Android SDK มีอินเทอร์เฟซ Java แพลตฟอร์มเริ่มจำกัดการเข้าถึงอินเทอร์เฟซที่ไม่ใช่ NDK สําหรับโค้ด C/C++ เดิมใน Android 7 (API ระดับ 26) ดูข้อมูลเพิ่มเติมได้ที่การปรับปรุงความเสถียรด้วยข้อจำกัดสัญลักษณ์ C/C++ ส่วนตัวใน Android N

มีแผนที่จะจำกัด dex2oat หรือการดัดแปลงไฟล์ DEX ไหม

เราไม่มีแผนที่จะจำกัดการเข้าถึงไฟล์ไบนารี dex2oat แต่ไม่ได้ตั้งใจให้รูปแบบไฟล์ DEX มีความเสถียรหรือเป็นอินเทอร์เฟซสาธารณะนอกเหนือจากส่วนที่ระบุไว้แบบสาธารณะในรูปแบบไฟล์ที่ปฏิบัติการได้ของ Dalvik เราขอสงวนสิทธิ์ในการแก้ไขหรือนำ 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)