ตั้งแต่ Android 9 (API ระดับ 28) เป็นต้นไป แพลตฟอร์มจะจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ที่แอปของคุณใช้ได้ ข้อจำกัดเหล่านี้จะมีผลทุกครั้งที่แอปอ้างอิง อินเทอร์เฟซที่ไม่ใช่ SDK หรือพยายามรับแฮนเดิลโดยใช้การสะท้อนหรือ JNI เราใช้ข้อจำกัดเหล่านี้เพื่อช่วยปรับปรุงประสบการณ์การใช้งานของผู้ใช้และนักพัฒนาแอป รวมถึงลดความเสี่ยงที่ผู้ใช้จะพบปัญหาแอปขัดข้องและนักพัฒนาแอปต้องเปิดตัวเวอร์ชันใหม่ฉุกเฉิน ดูข้อมูลเพิ่มเติมเกี่ยวกับการตัดสินใจนี้ได้ที่การปรับปรุงความเสถียร ด้วยการลดการใช้อินเทอร์เฟซที่ไม่ได้อยู่ใน SDK
แยกความแตกต่างระหว่างอินเทอร์เฟซ SDK และอินเทอร์เฟซที่ไม่ใช่ SDK
โดยทั่วไปแล้ว อินเทอร์เฟซ SDK สาธารณะคืออินเทอร์เฟซที่พบในเอกสารดัชนีแพ็กเกจของเฟรมเวิร์ก Android การจัดการอินเทอร์เฟซที่ไม่ใช่ SDK เป็น รายละเอียดการใช้งานที่ API แยกออกไป ดังนั้นอินเทอร์เฟซเหล่านี้จึง อาจเปลี่ยนแปลงได้โดยไม่ต้องแจ้งให้ทราบ
แอปควรใช้เฉพาะส่วนของคลาสใน SDK ที่มีการบันทึกอย่างเป็นทางการเพื่อหลีกเลี่ยงข้อขัดข้องและลักษณะการทำงานที่ไม่คาดคิด ซึ่งหมายความว่าคุณไม่ควร เข้าถึงเมธอดหรือฟิลด์ที่ไม่ได้อยู่ใน SDK เมื่อโต้ตอบกับคลาสโดยใช้กลไกต่างๆ เช่น การสะท้อน
รายการ API ที่ไม่ใช่ SDK
Android แต่ละรุ่นจะจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK เพิ่มเติม เราทราบว่าข้อจำกัดเหล่านี้อาจส่งผลต่อเวิร์กโฟลว์การเผยแพร่ของคุณ และต้องการให้คุณมีเครื่องมือในการตรวจหาการใช้อินเทอร์เฟซที่ไม่ใช่ SDK รวมถึงโอกาสในการส่งความคิดเห็นถึงเรา และมีเวลาในการวางแผนและปรับตัวให้เข้ากับนโยบายใหม่
เพื่อลดผลกระทบของการจำกัดที่ไม่ใช่ SDK ต่อเวิร์กโฟลว์การพัฒนาของคุณ เราจึงแบ่ง อินเทอร์เฟซที่ไม่ใช่ SDK ออกเป็นรายการที่กำหนดระดับการจำกัดการใช้งาน โดยขึ้นอยู่กับระดับ API ที่กำหนดเป้าหมาย ตารางต่อไปนี้ อธิบายรายการแต่ละรายการ
รายการ | แท็กรหัส | คำอธิบาย |
---|---|---|
รายการที่บล็อก |
|
อินเทอร์เฟซที่ไม่ใช่ SDK ที่คุณใช้ไม่ได้ไม่ว่าระดับ API เป้าหมายของแอปจะเป็นเท่าใดก็ตาม หากแอปพยายามเข้าถึงอินเทอร์เฟซใดอินเทอร์เฟซหนึ่งเหล่านี้ ระบบจะแสดงข้อผิดพลาด |
ถูกบล็อกแบบมีเงื่อนไข |
|
ตั้งแต่ Android 9 (API ระดับ 28) เป็นต้นไป API แต่ละระดับจะมีอินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งจะถูกจำกัดเมื่อแอปกำหนดเป้าหมายเป็น API ระดับนั้น รายการเหล่านี้มีป้ายกำกับตามระดับ API สูงสุด
( หากแอปพยายามเข้าถึงอินเทอร์เฟซที่ถูกจำกัดสำหรับ ระดับ API เป้าหมาย ระบบจะ ทำงานราวกับว่า API อยู่ใน รายการที่ถูกบล็อก |
ไม่รองรับ |
|
อินเทอร์เฟซที่ไม่ใช่ SDK ที่ไม่มีข้อจำกัดและแอปของคุณใช้ได้ โปรดทราบ
ว่าอินเทอร์เฟซเหล่านี้ไม่รองรับและ
อาจมีการเปลี่ยนแปลงโดยไม่ต้องแจ้งให้ทราบ เราคาดว่าจะบล็อกอินเทอร์เฟซเหล่านี้แบบมีเงื่อนไขใน Android เวอร์ชันต่อๆ ไปในmax-target-x รายการ |
SDK |
|
อินเทอร์เฟซที่ใช้ได้อย่างอิสระและได้รับการรองรับเป็นส่วนหนึ่งของดัชนีแพ็กเกจของเฟรมเวิร์ก Android ที่มีการบันทึกอย่างเป็นทางการ |
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 แล้วทำตามขั้นตอนต่อไปนี้
- ดาวน์โหลดเครื่องมือ veridex จากที่เก็บของ Android Runtime Prebuilts
- แตกเนื้อหาของไฟล์
appcompat.tar.gz
- ในโฟลเดอร์ที่แยกออกมา ให้ค้นหาไฟล์
veridex-linux.zip
แล้วแยกไฟล์ ไปที่โฟลเดอร์ที่คลายซิปแล้ว จากนั้นเรียกใช้คำสั่งต่อไปนี้ โดยที่
your-app.apk
คือ APK ที่คุณต้องการทดสอบ./appcompat.sh --dex-file=your-app.apk
macOS
หากต้องการเรียกใช้เครื่องมือ Veridex ใน macOS ให้ทำตามขั้นตอนต่อไปนี้
- ดาวน์โหลดเครื่องมือ veridex จากที่เก็บของ Android Runtime Prebuilts
- แตกเนื้อหาของไฟล์
appcompat.tar.gz
- ในโฟลเดอร์ที่แยกออกมา ให้ค้นหาไฟล์
veridex-mac.zip
แล้วแยกไฟล์ ไปที่โฟลเดอร์ที่คลายซิปแล้ว จากนั้นเรียกใช้คำสั่งต่อไปนี้ โดยที่
/path-from-root/your-app.apk
คือเส้นทางไปยัง APK ที่ต้องการทดสอบ โดยเริ่มจากไดเรกทอรีรากของระบบ./appcompat.sh --dex-file=/path-from-root/your-app.apk
Linux
หากต้องการเรียกใช้เครื่องมือ Veridex ใน Linux ให้ทำตามขั้นตอนต่อไปนี้
- ดาวน์โหลดเครื่องมือ veridex จากที่เก็บของ Android Runtime Prebuilts
- แตกเนื้อหาของไฟล์
appcompat.tar.gz
- ในโฟลเดอร์ที่แยกออกมา ให้ค้นหาไฟล์
veridex-linux.zip
แล้วแยกไฟล์ ไปที่โฟลเดอร์ที่คลายซิปแล้ว จากนั้นเรียกใช้คำสั่งต่อไปนี้ โดยที่
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
)