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