剛剛有同學(xué)問(wèn)我柒竞,不太了解 “非SDK接口” 是什么意思政供?android9.0有什么限制 ?apache的http也有限制 朽基?
而且現(xiàn)在的大部分系統(tǒng)都升級(jí)上來(lái)了布隔,黑名單、灰名單和白名單 也是必須要了解一下的稼虎,這里參考Google開(kāi)發(fā)者網(wǎng)站給大家整理一下衅檀。
首先,公共 SDK 接口是在 Android 框架軟件包索引 中記錄的那些接口霎俩,什么是框架軟件包哀军?
鏈接地址:https://developer.android.google.cn/reference/packages.html
而 非 SDK 接口 的處理是 API 抽象出來(lái)的實(shí)現(xiàn)細(xì)節(jié),因此這些接口可能會(huì)在不另行通知的情況下隨時(shí)發(fā)生更改打却。
黑名單 | 無(wú)論應(yīng)用的目標(biāo) API 級(jí)別是什么杉适,都無(wú)法使用此列表中的非 SDK 接口。如果您的應(yīng)用嘗試訪問(wèn)其中任何一個(gè)接口柳击,系統(tǒng)就會(huì)拋出錯(cuò)誤猿推。 |
灰名單 | 從 Android 9(API 級(jí)別 28)開(kāi)始,在每個(gè) API 級(jí)別分別會(huì)限制某些非 SDK 接口捌肴。如果應(yīng)用的目標(biāo) API 級(jí)別較低蹬叭,您可以訪問(wèn)灰名單中的受限 API,但如果您的應(yīng)用嘗試訪問(wèn)在您的目標(biāo) API 級(jí)別受限的非 SDK 接口哭靖,系統(tǒng)就會(huì)假定此 API 已列入黑名單具垫。說(shuō)白了,就是只要在您應(yīng)用的目標(biāo) API 級(jí)別不限制此列表中的非 SDK 接口试幽,您就可以使用它們筝蚕。 |
白名單 | 此列表中的接口已在 Android 框架軟件包索引中正式記錄卦碾,它們是受支持的接口,您可以自由使用起宽。 |
有的同學(xué)聽(tīng)完還是比較郁悶……
那換個(gè)說(shuō)法吧洲胖,比如應(yīng)用在通過(guò)反射等機(jī)制與類互動(dòng)時(shí)(WebView、HTTP等)坯沪,android9.0之后就不應(yīng)訪問(wèn) SDK 中未列出的方法或字段绿映,否則會(huì)提示報(bào)錯(cuò),應(yīng)用老老實(shí)實(shí)的用谷歌大佬提供的API就好了腐晾。
來(lái)看谷歌大佬的回應(yīng):
盡管您目前仍可以使用灰名單中的某些非 SDK 接口(取決于您應(yīng)用的目標(biāo) API 級(jí)別)叉弦,但是如果您使用任何非 SDK 方法或字段,終歸存在很可能會(huì)損壞應(yīng)用的風(fēng)險(xiǎn)藻糖。
如果您的應(yīng)用依賴于非 SDK 接口淹冰,則應(yīng)該開(kāi)始計(jì)劃遷移到 SDK 接口或其他替代方案。如果您無(wú)法為應(yīng)用中的功能找到使用非 SDK 接口的替代方案巨柒,則應(yīng)該請(qǐng)求新的公共 API樱拴。
盡管還是可以使用,但后果自負(fù)洋满。
有frameworks的同學(xué)可以看這個(gè)路徑晶乔,此文本包含已列入灰名單的非受限 API 的列表。
如果非常想使用此接口又找不到替代方案牺勾?
如果非常想使用此接口又找不到替代方案時(shí)怎么辦正罢?可以找Google提需求,如下圖禽最。
其它的說(shuō)明都可以忽略腺怯,主要是確認(rèn)自己的SDK接口到底是不是屬于非SDK接口。
應(yīng)用調(diào)試時(shí)進(jìn)行測(cè)試
先建議開(kāi)啟lintOptions川无,檢測(cè)一下其他問(wèn)題呛占。
另外在搭載 Android 9(API 級(jí)別 28)或更高版本的設(shè)備或模擬器上構(gòu)建和運(yùn)行可調(diào)試應(yīng)用來(lái)測(cè)試該應(yīng)用是否使用非 SDK 接口。
在您的應(yīng)用上運(yùn)行測(cè)試時(shí)懦趋,如果該應(yīng)用訪問(wèn)了某些非 SDK 接口晾虑,系統(tǒng)就會(huì)輸出一條日志消息。
您可以檢查應(yīng)用的日志消息仅叫,查找以下詳細(xì)信息:
- 聲明的類帜篇、名稱和類型(采用 Android 運(yùn)行時(shí)所使用的格式)。
- 訪問(wèn)方式:鏈接诫咱、反射或 JNI
- 所訪問(wèn)的非 SDK 接口屬于哪個(gè)列表笙隙。
我們可以使用 adb logcat 來(lái)查看這些日志消息,這些消息顯示在所運(yùn)行應(yīng)用的 PID 下坎缭,不過(guò)日志消息看起來(lái)很痛苦……
舉例而言竟痰,日志中可能包含如下條目:
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
我們也可以使用 StrictMode API 進(jìn)行測(cè)試的
記得在主方法里面開(kāi)啟 StrictMode
签钩,用 StrictMode API 來(lái)測(cè)試應(yīng)用是否使用 非 SDK 接口 ,怎么開(kāi)啟坏快?打開(kāi) detectNonSdkApiUsage
方法 铅檩,然后使用 penaltyListener
來(lái)接收每次使用 非 SDK 接口的行為所對(duì)應(yīng)的回調(diào),并且可以在其中實(shí)現(xiàn)自定義處理莽鸿。
回調(diào)中提供的 Violation 對(duì)象派生
自 Throwable昧旨,并且封閉式堆棧軌跡會(huì)提供相應(yīng)使用行為的上下文。
當(dāng)然祥得,我們也可以使用 veridex 工具進(jìn)行測(cè)試的
您還可以在 APK 上運(yùn)行靜態(tài)分析工具 veridex兔沃。veridex 工具 會(huì)掃描 APK 的整個(gè)代碼庫(kù)(包括所有第三方庫(kù)),并報(bào)告發(fā)現(xiàn)的所有使用非 SDK 接口的行為啃沪。
不過(guò) veridex
工具存在以下局限性:
- 它無(wú)法檢測(cè)到通過(guò) JNI 實(shí)現(xiàn)的調(diào)用粘拾。
- 它只能檢測(cè)到一部分通過(guò)反射實(shí)現(xiàn)的調(diào)用窄锅。
- 它對(duì)非活動(dòng)代碼路徑的分析僅限于 API 級(jí)別的檢查创千。
有的人會(huì)好奇,它對(duì)原生代碼中的非 NDK 接口是否有限制入偷?Google大佬回應(yīng)追驴,Android SDK 包含 Java 接口。Android 平臺(tái)從 Android 7(API 級(jí)別 26)開(kāi)始就已經(jīng)限制訪問(wèn)原生 C/C++ 代碼中的非 NDK 的接口了疏之。
作者:奧特曼超人Dujinyang
來(lái)源:CSDN
原文:dujinyang.blog.csdn.net/
版權(quán)聲明:本文為博主杜錦陽(yáng)原創(chuàng)文章殿雪,轉(zhuǎn)載請(qǐng)附上博文鏈接!