非 SDK 介面常見問題 | Android 開發者 FAQ Vol.13

Android_開發者發表於2018-06-19

非 SDK 介面常見問題 | Android 開發者 FAQ Vol.13

常規問題 Q1:

什麼是非 SDK 介面?

A:非 SDK 介面指不在官方 Android SDK 涵蓋範圍內的 Java 欄位和方法。此類介面是 SDK 的內部實現細節,可能隨時會被修改,且不對開發者另行通知。

常規問題 Q2 :

Android P 在非 SDK 介面使用限制方面採取了哪些舉措?

A:谷歌正在逐步限制非 SDK 介面的使用:針對不同介面採取不同形式的限制 (詳情請參照條目 “應用執行時,我應該如何檢測非 SDK 介面的使用?” )。若您正在使用非 SDK 介面進行開發,請特別注意限制對應用行為造成的影響。

常規問題 Q3:

如果我正在使用非 SDK 介面,我應該如何提交請求,申請重新評估該介面?

A:請提交申請並提供需要使用此介面的詳細原因。

常規問題 Q4:

非 SDK 介面都有哪些不同管控名單?且不同名單下介面的限制又有何不同?

A:以下為各名單的具體說明:

  • 白名單:SDK 本身
  • 淺灰名單:仍允許呼叫的非 SDK 方法和欄位
  • 深灰名單
    • 若應用的 target SDK 低於 Android P (即 targetSdkVersion <28):允許呼叫深灰名單中的接
    • 若應用的 target SDK 為 Android P 或更高 (即 targetSdkVersion >= 28):深灰名單與黑名單的限制相同
  • 黑名單:不論 target SDK 版本為多少,所有應用均不允許呼叫黑名單介面。對開發者來說,相當於系統裡不存在這些介面。比如,當應用試圖呼叫此類介面時,系統會丟擲 NoSuchMethodError / NoSuchFieldException 異常,並且在應用獲取特定類的欄位和方法列表時,不在返回列表中包含此類介面。

常規問題 Q5:

我在應用開發過程中引用了不少第三方庫,很難發現它們呼叫了哪些私有 API,請問谷歌能否提供編譯時工具幫助我追蹤這些違規行為?

A:您可嘗試 AOSP 開源專案中的靜態分析工具 “veridex” 及其預編譯可執行程式

常規問題 Q6:

應用執行時,我應該如何檢測非 SDK 介面的使用?

A:這取決於您針對哪個版本的 Android P (開發者預覽版或 Beta 測試版) 進行應用開發。所有違規呼叫情況都會收到 logcat 警告資訊:“Accessing hidden field|method …”。此外:

  • 在開發者預覽版 1 以及 Beta 2 中,當應用試圖呼叫深灰名單中的非 SDK 介面時,系統會在 Activity 啟動時彈出 Toast 警告資訊 “Detected problems with API compatibility” 。
  • 從 Beta 1 開始,開發者可以使用 StrictMode 中的 permitNonSdkApiUsage() 以及 detectNonSdkApiUsage() 方法,在非 SDK 介面被呼叫時會收到回撥,如新增一條日誌。
  • 在 Andrid P 最終版本中:Toast 資訊只在除錯版本的應用中顯示;同時僅在非 SDK 介面呼叫被拒絕的情況下,系統才會列印 logcat 資訊。

常規問題 Q7:

谷歌如何確保通過問題跟蹤器瞭解所有應用需求?

A:起初,我們基於對應用的靜態分析列出名單,並輔以下列方式予以完善:

  • 手動測試對 Play 商店內外的頂級應用;
  • 內部報告;
  • 從內部使用者自動收集資料;
  • 開發者預覽報告;
  • 進行額外靜態分析,在分析中適當增加誤報 (false positive) 資訊。

常規問題 Q8:

我應該如何允許訪問非 SDK API?

A:可以通過使用 adb,在開發裝置上允許訪問非 SDK API。

若您想在 adb logcat 中顯示 API 訪問資訊,您可通過以下命令更改 API 執行策略:

  • adb shell settings put global hidden_api_policy_pre_p_apps 1
  • adb shell settings put global hidden_api_policy_p_apps 1

更改回預設設定:

  • adb shell settings delete global hidden_api_policy_pre_p_apps
  • adb shell settings delete global hidden_api_policy_p_apps

以上命令不需要裝置獲得 Root 許可權。

命令最後的數字分別表示:

非 SDK 介面常見問題 | Android 開發者 FAQ Vol.13

API 名單相關問題 Q1:

在開發者預覽版和 beta 版中,各名單處於何種狀態?

A:在 Android P 開發過程中,我們對各名單進行了不同方式的迭代:

  • 開發者預覽版 1:僅有淺灰和深灰名單。所有我們試圖限制的非 SDK 介面都被列在深灰名單中。
  • Beta 1:僅有淺灰名單和黑名單。在預覽版1的基礎上對淺灰名單進行增補,其餘非 SDK 介面均移至黑名單。
  • Beta 2:淺灰、深灰和黑名單均存在,許多黑名單中的介面被移至深灰名單。

請注意:Beta 2 與最終版 Android P 對非 SDK 介面使用限制基本一致。

API 名單相關問題 Q2:

Android P 中的深灰名單包含哪些內容?

A:深灰名單中包含了在開發階段中未被發現使用的方法和欄位,但我們有可能會有疏漏,所以我們也將一些與公開 SDK 及淺灰名單中的介面密切相關的介面也移入了深灰名單。

API 名單相關問題 Q3:

我應該去哪裡查閱灰名單和黑名單?

A:它們都被編譯進 Android 平臺中。您可前往以下地址查詢編譯前的條目:

  • platform/prebuilts/runtime/appcompat/hiddenapi-light-greylist.txt: AOSP 原始碼中的淺灰名單介面 (名單 1)
  • platform/prebuilts/runtime/appcompat/hiddenapi-dark-greylist.txt: AOSP 原始碼中的深灰名單介面 (名單 2)

此外,您可前往該地址檢視 SDK 28 中的淺灰名單介面 (名單 3)。

黑名單與深灰名單是在平臺編譯時按照一定規則自動生成的。我們也新增了一條編譯規則在 AOSP 開源專案中生成這些名單。請注意:這裡生成的黑名單與 Android P 中的黑名單不相同,但差別不大。開發者可下載 AOSP 開源專案,然後通過以下命令生成黑名單:make hiddenapi-aosp-blacklist

生成檔案的路徑為:out/target/common/obj/PACKAGING/hiddenapi-aosp-blacklist.txt

API 名單相關問題 Q4:

每個名單中約多少條目?

A:在 Beta 2 版本中:

  • 白名單 (即 SDK 本身):約 74,000 個方法和欄位;
  • 淺灰名單:約 11,000 個方法和欄位;
  • 深灰名單:約 121,000 個方法和欄位;
  • 黑名單:約 9,000 個方法和欄位。

API 名單相關問題 Q5:

如何在開發者預覽版系統映像檔案中找到黑名單和灰名單?

A:這些名單被編碼在平臺 dex 檔案中的欄位和方法的訪問標誌中。系統映像中沒有包含這些名單的單獨檔案。

API 名單相關問題 Q6:

搭載同一版本的不同裝置是否共同一套黑名單 (或灰名單)?

A:是的。OEM 廠商可以在黑名單中新增自己的 API,但是不允許從原始 / AOSP 黑名單 (或灰名單) 中移除專案。相容性標準文件 (CDD) 禁止此類更改,且相容性測試 (CES) 會確保 Android 執行時 (ART) 檢查該名單。

API 名單相關問題 Q7:

在非 SDK 介面限制方面,開發者預覽版和最終版本的行為是否相同?

A:僅開發者預覽版會顯示 Toast 資訊,最終版本將不再顯示此類資訊。此外:

  • 開發者預覽版 1 無黑名單,僅有淺灰和深灰名單警告;
  • Beta 1 將所有深灰名單條目移至黑名單;
  • Beta 2 將大部分黑名單中的介面移至深灰名單。Beta 2 的限制名單和最終版應該十分接近,不過依舊會根據收到的反饋進行一定修改。

相關應用相容性問題 Q1:

原生程式碼中是否存在非 NDK 介面的限制?

A:SDK 針對 Java 語言。關於針對 C 或 C++ 程式碼的 NDK,我們已經在 Android Nougat 中做出了限制: Android N 限制使用私有 C/C++ 符號, 提升系統穩定性

相關應用相容性問題 Q2:

谷歌是否計劃限制 dex2oat 或 dex 檔案操作?

A:我們暫時不會限制開發者訪問 dex2oat 二進位制檔案,但是在開發文件《Dalvik 可執行檔案格式》指定的 dex 公開格式以外,我們不保證其它 dex 檔案格式及其介面的穩定性。我們保留隨時更改或移除 dex2oat 檔案和未指定格式的 dex 檔案的權利。請注意,通過 dex2oat 轉換的檔案格式,如 odex (即 oat)、vdex、cdex 等,均為未指定格式。

相關應用相容性問題 Q3:

如果關鍵第三方 SDK(尤其是,加固工具)必須呼叫非 SDK 介面,而第三方開發者也承諾該介面會相容未來 Android 版本,Android 能否取消對該介面的警告?

A:我們不會因為單獨 SDK 用例就放寬相容性要求。如果 SDK 合作伙伴無法保證相容現行的白名單和灰名單介面,他們可以提交需求,申請使用某個非 SDK 介面。

在 Android P 中,我們暫時不會對 Android 應用或 SDK 當前已使用的非 SDK 介面加以限制,但在今後,若相關介面有合適的 SDK 替代選項,我們計劃引入 target SDK 限制。注意:如果呼叫了非 SDK 或非 NDK 介面,這些介面中的大部分每年都會出現相容問題,需要不斷進行適配。

相關應用相容性問題 Q4:

非 SDK 介面限制是否適用於所有應用 (包括系統應用和第一方應用),而不僅僅是第三方應用?

A:是的。但是由平臺金鑰簽名的應用不受限制,同時我們還為一些系統映像中的應用提供了軟體包級別的白名單。請注意:此類豁免僅適用於系統映像中的應用(或更新後在系統映像中的應用)。

該名單僅限於使用平臺中的私有介面進行開發的應用,而非呼叫 SDK 中的私有介面 (即 LOCAL_PRIVATE_PLATFORM_APIS := true) 的應用。

相關應用相容性問題 Q5:

某些開發者已經發表文章,公佈了私有 API 限制的執行機制以及突破方法,谷歌方面對此有何看法?是否會加強管控?

A:我們知道會有潛在的方法來幫助開發者繞過限制。不過,好在大部分應用堅持使用公開 API。我們會加大呼叫非 SDK 介面的難度,確保應用相容性,與此同時找到一個比較好的平衡點,方便執行時的除錯。我們將繼續開展具體實現的評估工作,與開發者保持積極合作。

如果您仍然有關於系統及相容性等問題,歡迎給我們留言,我們會繼續收集有代表性的問題,請我們的工程師做出解答,並將答案儘量及時地回覆給大家。同時,也請關注下一期的 “Android 開發者 FAQ” 專題文章,希望可以幫助您補充相關知識技能。

點選檢視《對於非 SDK 介面的限制》文件瞭解詳細資訊.

非 SDK 介面常見問題 | Android 開發者 FAQ Vol.13

相關文章