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

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

กำหนดว่าอินเทอร์เฟซเป็นของรายการใด

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

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 คุณสามารถรับ Callback สำหรับการใช้งานที่ไม่ใช่ SDK แต่ละครั้ง โดยใช้ penaltyListener ซึ่งคุณสามารถติดตั้งใช้งาน ออบเจ็กต์ Violation ที่ระบุใน Callback มาจาก Throwable และสแต็กเทรซที่แนบมาจะระบุบริบทของการใช้งาน

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

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

ข้อจำกัดของเครื่องมือ veridex มีดังนี้

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

Windows

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

เมื่อคุณให้รายละเอียดเหล่านี้ในคำขอฟีเจอร์ จะเป็นการเพิ่ม ความเป็นไปได้ที่จะมี 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 ที่ไม่ใช่ AOSP ที่ไม่ใช่ SDK CDD ป้องกันการเปลี่ยนแปลงดังกล่าว และการทดสอบ CTS ช่วยให้มั่นใจว่า Android Runtime จะบังคับใช้รายการดังกล่าว

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

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

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

เราไม่มีแผนที่จะจำกัดการเข้าถึงไบนารี dex2oat แต่เรา ไม่ต้องการให้รูปแบบไฟล์ DEX มีความเสถียรหรือเป็นอินเทอร์เฟซสาธารณะ ส่วนที่ระบุแบบสาธารณะในรูปแบบการดำเนินการของ Daalvik Executable เราขอสงวนสิทธิ์ในการแก้ไขหรือกำจัด dex2oat และส่วนที่ไม่ได้ระบุ ของรูปแบบ DEX ได้ทุกเมื่อ และโปรดทราบด้วยว่า ไฟล์ที่ได้มาจาก dex2oat เช่น ODEX (เรียกอีกอย่างว่า OAT), VDEX และ CDEX เป็นรูปแบบที่ไม่ได้ระบุทั้งหมด

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

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

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

ใช่ เรายกเว้นแอปที่ลงนามด้วยคีย์แพลตฟอร์มและรูปภาพระบบบางส่วน แอป โปรดทราบว่าข้อยกเว้นเหล่านี้มีผลเฉพาะกับแอปที่อยู่ในระบบเท่านั้น รูปภาพ (หรือแอปอิมเมจของระบบที่อัปเดตแล้ว) รายการนี้มีไว้สำหรับแอปที่ สร้างร่วมกับ API ของแพลตฟอร์มส่วนตัว แทนที่จะเป็น SDK API (โดย LOCAL_PRIVATE_PLATFORM_APIS := true)