一.背景
? ? 1.非 SDK 接口限制
????????????非SDK接口限制在Android P中就已提出奢啥,但是在Q中宪祥,被限制的接口的分類有較大變化裹芝。
? ??????????針對(duì)非 SDK 接口的限制官網(wǎng)說明
? ? 2.非SDK接口介紹
? ? ? ? ? ? 為了確保應(yīng)用穩(wěn)定性和兼容性刻坊,Android 平臺(tái)開始限制您的應(yīng)用可在 Android 9(API 級(jí)別 28)中使用哪些非 SDK 接口。Android Q包含更新后的受限非 SDK 接口列表(基于Android 開發(fā)者之間的協(xié)作以及最新的內(nèi)部測(cè)試)醋虏。
? ? ? ? ? ?非SDK接口限制就是某些SDK中的私用方法寻咒,如private方法,你通過Java反射等方法獲取并調(diào)用了颈嚼。那么這些調(diào)用將在target>=P或target>=Q的設(shè)備上被限制使用毛秘,當(dāng)你使用了這些方法后,會(huì)報(bào)錯(cuò):
非SDK接口查找
如果您不確定自己的應(yīng)用是否使用了非 SDK 接口粘舟,則可以測(cè)試該應(yīng)用進(jìn)行確認(rèn)熔脂。
當(dāng)你調(diào)用了非SDK接口時(shí),會(huì)有類似Accessing hidden XXX的日志:
Accessing hidden field Landroid/os/Message;->flags:I(light greylist,JNI)
但是一個(gè)大項(xiàng)目到底哪里使用了這些方法柑肴,靠review代碼和看日志肯定是不現(xiàn)實(shí)的霞揉,谷歌官方也提供了官方檢查器veridex用來檢測(cè)一個(gè)apk中哪里使用了非SDK接口。也就是本次要介紹的veridex的使用
二.veridex的下載
? ? 1.官網(wǎng)下載地址:veridex
? ? 2.官網(wǎng)下載需要梯子,這里提供百度云下載地址,如果鏈接失效,請(qǐng)?jiān)谙掳l(fā)評(píng)論區(qū)留言
????????????百度網(wǎng)盤下載地址? ????????????????????提取碼:2tow
由于veridex現(xiàn)在沒有window的版本,所以我們只能window系統(tǒng)的只能自己下載Linux系統(tǒng)進(jìn)行使用,下面介紹window 1-安裝Linux子系統(tǒng) ubuntu
三.Windows10安裝Linux子系統(tǒng)Ubuntu
? ??1晰骑、開啟開發(fā)者模式
????順序:打開 系統(tǒng)設(shè)置 --- 更新和安全 --- 針對(duì)開發(fā)人員---選擇開發(fā)者模式
????點(diǎn)擊后會(huì)自動(dòng)安裝環(huán)境
????2适秩、安裝 Windows 10 的 Linux 子系統(tǒng)組件
????順序: 打開 系統(tǒng)設(shè)置 --- 應(yīng)用 --- 右側(cè)的程序和功能 --- 啟動(dòng)或關(guān)閉windows功能 ---勾選適用于 Linux 的 Windows 子系統(tǒng)
????確定后,重啟電腦硕舆,系統(tǒng)更新配置
????3秽荞、安裝 Linux 子系統(tǒng)
????打開 Windows 應(yīng)用市場(chǎng),輸入 linux 搜索抚官,選擇你自己想要的系統(tǒng)版本扬跋,我選擇的是 Ubuntu ,然后下載安裝凌节,微軟的下載速度還是挺快的钦听,很快就下載完了。
????然后點(diǎn)擊啟動(dòng)倍奢,第一次會(huì)進(jìn)行初始化安裝朴上。
????安裝時(shí)注意 Win10 有個(gè)存在好久一直沒修復(fù)很煩人的 BUG ,就是 CMD 總是會(huì)遇到不會(huì)自動(dòng)刷新輸出內(nèi)容卡在那兒不動(dòng)卒煞,一直顯示安裝中痪宰,實(shí)際初始化是很快的,按下回車鍵發(fā)現(xiàn)已經(jīng)安裝好了只是沒輸出而已畔裕。
????初始化安裝完成衣撬,現(xiàn)在設(shè)置帳號(hào)密碼,就搞定了
????參考文檔:Windows10安裝Linux子系統(tǒng)Ubuntu
四.veridex的使用
? ? 下載好veridex后解壓文件,選擇veridex-linux文件解壓,并打開Ubuntu進(jìn)入到該文件夾目錄,選擇要檢測(cè)的安裝包apk文件復(fù)制到相同文件夾目錄下,然后使用下面的命令執(zhí)行(test.apk為你的apk文件名):
./appcompat.sh --dex-file=test.apk
????掃描結(jié)果分為兩部分,一部分為被調(diào)用的非SDK接口的位置柴钻,另一部分為非SDK接口數(shù)量統(tǒng)計(jì):
? ? ? ? 1.greylist: 灰名單淮韭,即當(dāng)前版本仍能使用的非SDK接口,但在下一版本中可能變成被限制的非SDK接口
? ? ? ? 2.blacklist:黑名單贴届,使用了就會(huì)報(bào)錯(cuò)靠粪。也是我們項(xiàng)目中必須解決的非SDK接口
? ? ? ? 3.greylist-max-o:在targetSDK<=O中能使用,但是在targetSDK>=P中被限制的非SDK接口
? ? ? ? 4.greylist-max-p:在targetSDK<=P中能使用毫蚓,但是在targetSDK>=Q中被限制的非SDK接口
? ? 所以從適配Q的角度出發(fā)占键,除了greylist我們可以暫時(shí)不解決以外,其余三種類型的非SDK接口需要我們進(jìn)行適配元潘。
五.非SDK接口適配
????????如果您的應(yīng)用依賴于非 SDK 接口畔乙,則應(yīng)該開始計(jì)劃遷移到 SDK 替代方案。如果您無法為應(yīng)用中的某項(xiàng)功能找到使用非 SDK 接口的替代方案翩概,則應(yīng)該請(qǐng)求新的公共 API牲距。
????????官方要求targetSDK>=P的應(yīng)用不使用這些方法返咱,并尋找其他的公共API去替代這些非SDK接口,如果找不到牍鞠,則可以向谷歌申請(qǐng)咖摹,請(qǐng)求一個(gè)新的公共API?https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces#feature-request?(一般不需要)。
項(xiàng)目中使用非SDK接口大概率有以下兩種情況:
? ? 1.在自定義View的過程中為了方便难述,使用反射修改某個(gè)參數(shù)萤晴。
? ? 2.三方SDK中使用了非SDK接口(這種情況比較多)。
第一種是好解決的胁后,畢竟是我們自己寫的代碼店读。
第二種就頭疼了,只能更新到最新的三方SDK版本攀芯,或者提工單屯断、換庫(也是整個(gè)適配過程中工作量最龐大的部分)。