ข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ 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 ที่ถูกบล็อกแบบมีเงื่อนไข (darkgrey list) จะได้มาในเวลาที่สร้าง

สร้างรายการจาก 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 และ Stack Trace ที่แนบมาจะระบุบริบทของการใช้งาน

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

นอกจากนี้ คุณยังเรียกใช้เครื่องมือวิเคราะห์แบบคงที่ Veridex ใน APK ได้ด้วย เครื่องมือ Veridex จะสแกนทั้ง Codebase ของ 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 Runtime Prebuilts
  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 Runtime Prebuilts
  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 Runtime Prebuilts
  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 ในอิมเมจระบบได้จากที่ใด

โดยจะมีการเข้ารหัสในบิตแฟล็กการเข้าถึงฟิลด์และเมธอดในไฟล์ 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 ของบุคคลที่สามที่สำคัญ (เช่น Obfuscator) หลีกเลี่ยงการใช้อินเทอร์เฟซที่ไม่ใช่ SDK ไม่ได้ แต่สัญญาว่าจะรักษาความเข้ากันได้กับ Android เวอร์ชันในอนาคต Android จะยกเว้นข้อกำหนดด้านความเข้ากันได้ในกรณีนี้ได้ไหม

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

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

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