1. 程式人生 > >Android9.0對非 SDK 介面的限制

Android9.0對非 SDK 介面的限制

 

在 Android 9.0 版本中,谷歌加入了非 SDK 介面使用限制,無論是通過呼叫、反射還是JNI等方式,開發者都無法對非 SDK 介面進行訪問,此介面的濫用將會帶來嚴重的系統相容性問題。 在開發過程中,開發者如果呼叫了非 SDK 介面,會導致應用出現crash,無法啟動;或在執行過程中出現崩潰、閃退等現象;也可能導致應用功能不可用等嚴重相容性問題,其影響範圍波及所有呼叫此介面的應用。 

 目的:通過減少對非SDK 介面的呼叫,提升應用的穩定性。

區分 SDK 介面和非 SDK 介面

SDK 介面是指在 Android 框架軟體包索引API中記錄的介面。

非 SDK 介面是 API 抽象化的實現細節,它們是不屬於官方 Android SDK 的 Java 欄位和函式;其會隨時更改,不另行通知,如:private修飾的方法.

用於限制非 SDK 介面的不同名單

 測試非 SDK 介面

通過 Android 9 對您的應用進行測試。系統將列印日誌,如果您的應用訪問某些“列入灰名單的”非 SDK 介面,系統還可能顯示 toast。 如果您的應用呼叫“列入黑名單的”非 SDK 介面,系統將引發錯誤。

注意 toast,它會提醒您注意被建議禁用的介面。 此外,確保檢查應用的日誌訊息,其中包含關於應用所訪問的非 SDK 介面的更多詳細資訊,包括以 Android 執行時所使用的格式列出的宣告類、名稱和型別。 日誌訊息還說明了訪問方法:直接、通過反射或者通過 JNI。 最後,日誌訊息顯示呼叫的非 SDK 介面屬於灰名單還是黑名單。

方法1:動態執行,通過日誌分析掃描

通過自動化或人工測試,遍歷應用每一個介面和所有功能,抓取日誌分析呼叫的所有非 SDK 介面。

關鍵日誌

*Accessinghidden field Landroid/os/Message;->flags:I (light greylist, JNI)
*Accessing hidden method
*Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread;(dark greylist, reflection)
*Accessing hidden method
*Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread;(blacklist, reflection)

 方法2:靜態掃描,通過谷歌提供的 Veridex 掃描工具掃描

  • 工具路徑:art/tools/veridex/

  • 工具編譯:make appcompat

  • 工具執行:appcompat.sh –dex-file=test.apk

  • 工具執行(帶引數,掃描的結果更全面,但可能存在誤報的情況):  appcompat.sh –dex-file=test.apk –imprecise

  • 備註:已經加固的應用,需要使用加固前的 APK進行掃描

  • 工具下載:Veridex下載1

  • 具體使用請參閱: veridex工具掃描非 SDK 介面

 非SDK介面整改

淺灰名單中的非SDK介面若不整改,仍可以正常使用。開發者需要重點關注的是深灰名單和黑名單中的非 SDK 介面,找到可替代的 SDK 介面進行適配。如果呼叫的介面在深灰名單或者黑名單中,且無法找到可替代的SDK介面,可向谷歌提供必需使用此介面的詳細原因,申請重新評估該介面。連結