上面我們完成了transform的基本掃描 我們回顧一下
我們看到掃描出來的要么是jar包要么是路徑目錄,但是其實(shí)我們的目的是拿到class文件
所以我們下一步是拿到所有的類文件 然后打印出來 我們看看怎么做吧
/**
* 掃描jar包所有class文件
* @param file
*/
private void scanJar(File file){
//通過jar包的file對(duì)象獲取一個(gè)jar包對(duì)象
def jarFile=new JarFile(file)
def enumeration = jarFile.entries()
//通過遍歷獲取class 然后打印出來 我們?cè)囋?記住先上傳
while (enumeration.hasMoreElements()){
def jarEntry = enumeration.nextElement()
def entryName = jarEntry.name
project.logger.error('class---'+entryName)
}
}
上傳然后測(cè)試
我們這里可以看到 我們已經(jīng)能遍歷出這些jar包里面的文件 我們?cè)俅蛞幌?歸屬把 比如他們各自在哪個(gè)jar包里面
出現(xiàn)一個(gè)問題
R.jar被占用了 其實(shí)是因?yàn)槲覀兩洗螔呙?這個(gè)jar包沒有關(guān)閉 所以導(dǎo)致了資源占用 !R┦怼7孟А砚哆!
解決方法就是加一下close
這個(gè)問題 我猜測(cè)還是jar包占用 我們可以直接用命令行看看
gradlew assembleDebug --stacktrace
這里有一個(gè)jarInput 因?yàn)槲覀兪侵苯訌纳厦鎻?fù)制下來的 我們改一下
剛剛弄其他去了 抱歉 我們繼續(xù)
這樣打印有點(diǎn)煞筆 我們重新來
基本可以看出來是哪些文件 很明顯很多jar包我們沒有必要去掃描 比如安卓自帶的androdx里面的 卧惜,
我們可以過濾掉他們
我發(fā)現(xiàn)androidx開頭的太多了 而且都是我們不需要的 而且我們想想 我們還需要處理android開頭的 兼容一下舊版本
我們直接寫成這樣把
我們發(fā)現(xiàn)過濾完就剩這些
其實(shí)了解jar包的同學(xué)都知道 META-INF這些都是jar包的簽名文件 保證安全和監(jiān)聽jar包變化的對(duì)我們來說也是多余的 也可以過濾掉
我們會(huì)發(fā)現(xiàn)這里居然一個(gè)jar包都沒掃描 其實(shí)很容易理解 我們沒用第三方 也沒有其他module所以的確jar包真的都只有android自帶的
還有一點(diǎn)我們需要了解 就是其實(shí)我們這里做了一個(gè)操作打開jar包 掃描jar包第一個(gè)文件 這個(gè)操作是耗時(shí)的尸变,有沒有優(yōu)化方案 蝗罗,這個(gè)需要大家去觀察一下安卓自帶jar包的命名方式 艇棕,然后通過正則表達(dá)式在遍歷jar包之前就可以過濾,提高我們插件的速度
下面我們要找的class文件就剩下在這里了下節(jié)課講bye
我們接著上節(jié)課來 上節(jié)課遍歷完jar包的class 我們這節(jié)課把目錄里面的class也遍歷出來
通過這里可以看到 我們找到我們app項(xiàng)目的主要代碼了 對(duì)吧 比如這個(gè)MainActivity.class
但是其實(shí)BuildConfig.class這個(gè)對(duì)我們來說是多余的 我們不需要處理他 我們也可以選擇過濾一下
這里我們先不做處理 我們要做的是 完成一些代碼的注入 和注冊(cè)
我們回到這個(gè)課程一開始部分 我們打開autoregister
這一部分代碼 就是我們要讓我們插件自動(dòng)完成的部分
現(xiàn)在我們先要定義一下這些類和接口 然后通過transform遍歷找到對(duì)應(yīng)的類和接口
首先來定義一下
我們自定義了一下這些類和接口
接下來我們先執(zhí)行一下掃描
觀察一下這些類的特點(diǎn)
已經(jīng)掃描出來了 但是他們的連接方式都是通過""符號(hào)來的 對(duì)吧
我們的目標(biāo)類 CategoryManager我們可以輕易找到 串塑,但是CategoryA我們要把它注入到CategoryManager中
類似于這樣
當(dāng)然這個(gè)ICategory接口是我們需要類的依據(jù)
所以我們首先是要找到這個(gè)接口的實(shí)現(xiàn)類 比如CategoryA這要怎么做 這要借助于ASM
對(duì)類進(jìn)行訪問和修改沼琉,就是基于字節(jié)碼修改 都非常方便
具體怎么做 我們接下來就要做
先暫停 我們下課 有空繼續(xù)