Androi P以後Google可能會禁止使用反射來獲取隱藏方法的調用,雖然在preview版本中只會以log的形式提示,但後續的版本可能會在使用反射時直接拋出錯誤。 這裏提供其中一種破解反射禁止的方法,不過這種方法也有侷限,就是隻能用於原本已是public或者static的隱藏方法。 對於這種類型的隱藏方法,咱們以前的解決途徑是經過反射來獲取,由於雖然是public,可是方法被@hidden註解過,因此無法直接調用。 但雖然不能用反射,直接調用倒是能夠的。這就是具體的思路。java
咱們知道在Android源碼中有部分代碼是不容許開發者使用的,這裏要分兩種狀況。 · 沒有打包進android.jar的類和方法,這部分不是隱藏的 · 打包進android.jar裏的隱藏類和方法android
若是查看源碼,會發現有不少代碼其實沒有打進android.jar,好比internal包下的類,其中就有WindowManagerService。 這部分類之因此不打進android.jar,目的是這些類是隻給android內部使用的,不但願開發者使用。程序員
今天只說明對於沒有打包進 android.jar的類,在不用反射的狀況下的使用方法。bash
在gradle項目裏,能夠用provided的方式引入 java library,這樣引入的library不會被打包進最終的apk裏。 在gradle中這麼寫,架構
dependencies {
provided project(':libhookandroid')
}
複製代碼
舉個例子,比方這時候要用 ActivityThread,這裏面有個 public方法 currentActivityThread(),咱們要調用它,那麼能夠在lib項目下按報名建一個類ide
public class ActivityThread{
public static ActivityThread currentActivityThread(){
return null;
}
}
複製代碼
爲什麼能夠return null呢? 由於它不會最終編譯進apk,運行時調用的仍然是Android裏的ActivityThread,那裏有真正的實現邏輯,咱們這裏只是作了個殼用來保證編譯時不會有問題。 寫完lib後在主工程裏就能夠直接調用了,學習
ActivityThread thread = ActivityThread.currentActivityThread();
複製代碼
由於是public方法,因此也不須要反射。gradle
對於Android裏沒有被打進 android.jar包中的類,能夠經過 provided library的方式提供調用, 雖然P禁用了反射,可是直接調用是能夠的。 然而缺點也是很明顯,它不能用到 protected或者 private的方法。 對於其餘的狀況,咱們能夠經過修改apk的class loader改爲 BootStrapClassLoader來實現繞過這個限制。 看過以前文章的朋友應該知道 BootStrapClassLoader是終極 ClassLoader,之後咱們會介紹經過它來繞過限制的方法。ui
同時我通過多年的收藏目前也算收集到了一套完整的學習資料以及高清詳細的Android架構進階學習導圖及筆記免費分享給你們,但願對想成爲架構師的朋友有必定的參考和幫助。 **下面是部分資料截圖,誠意滿滿:特別適合有開發經驗的Android程序員們學習。spa
資料免費領取方式:如今關注我而且加入羣聊 羣號:1018342383 或者是點擊連接加入羣聊【Android開發交流】:jq.qq.com/?_wv=1027&a…