video:?https://www.bilibili.com/video/BV1KT4y1E7Q7?from=search&seid=16580040802900307721
web:http://m.itdecent.cn/u/d0c911043d96
code:https://github.com/jiayuliang1314/PluginAsm.git
安卓Gradle插件開(kāi)發(fā)-ASM字節(jié)碼修改-AutoRegister實(shí)現(xiàn)8
1.基本的asm操作
找到類,位置,插入代碼
安卓Gradle插件開(kāi)發(fā)-ASM字節(jié)碼修改-AutoRegister實(shí)現(xiàn)7
app/build/generated/intermediates/transforms/auto-register
1.transform任務(wù)需要做產(chǎn)物傳遞,啥事產(chǎn)物就是transform的翻譯就是轉(zhuǎn)化,你轉(zhuǎn)化完了要交回給其他transform任務(wù)比如dextransform 和proguardtransform ,他們分別是jar轉(zhuǎn)dex的任務(wù)和混淆任務(wù)
安卓Gradle插件開(kāi)發(fā)-ASM字節(jié)碼修改-AutoRegister實(shí)現(xiàn)6
1.ASMPlugin找到差異
2.
安卓Gradle插件開(kāi)發(fā)-ASM字節(jié)碼修改-AutoRegister實(shí)現(xiàn)5
1.?找到需要插入的類 和需要被插入的類
ScanClassVisitor
首先 我們通過(guò)ClassReader把整個(gè)class文件讀取到內(nèi)存,然后聲明了一個(gè)ClassWriter用于代碼寫(xiě)入,
然后自定義了一個(gè)ScanClassVisitor類訪問(wèn)器來(lái)訪問(wèn)類里面的所有元素,包括屬性和方法
安卓Gradle插件開(kāi)發(fā)-ASM字節(jié)碼修改-AutoRegister實(shí)現(xiàn)4
1.掃描jar包所有class文件,jar 用完close
? ? gradlew assembleDebug --stacktrace
2.目錄里面的class也遍歷出來(lái)
3.過(guò)濾掉比如安卓自帶的androdx里面的,META-INF這些都是jar包的簽名文件 保證安全和監(jiān)聽(tīng)jar包變化的
安卓Gradle插件開(kāi)發(fā)-ASM字節(jié)碼修改-AutoRegister實(shí)現(xiàn)3
1.自定義一個(gè)transform任務(wù) 實(shí)現(xiàn)jar包和目錄掃描
/build.gradle的配置信息AppExtension
def android = project.extensions.getByType(AppExtension)
def transform =new RegisterTransform(project)
android.registerTransform(transform)
2.遍歷jar?
? ? 遍歷文件夾?intermediates\javac\debug\classes
安卓Gradle插件開(kāi)發(fā)-ASM字節(jié)碼修改-AutoRegister實(shí)現(xiàn)2
插件步驟
1.刪除多余目錄
2.建立groovy目錄
3.我們建立一個(gè)Plugin插件的基本文件必須是groovy文件
4.我們忘了一部 需要配置一下插件的buildgradle 我們直接去AutoRegister復(fù)制一份,定義了一個(gè)uploadArchives的Task 定義之后我們可以在gradle側(cè)邊欄找到他,我們編輯完之后點(diǎn)擊uploadArchives這個(gè)任務(wù)
5.配置信息
插件調(diào)試
0.斷點(diǎn)加好
1.一個(gè)remote調(diào)試器?-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
這里vmoptions的這個(gè)暫停要加y就是yes,suspend=y
2.將remote加到一個(gè)任務(wù),點(diǎn)debug
3.將remote也點(diǎn)debug
安卓Gradle插件開(kāi)發(fā)-ASM字節(jié)碼修改-AutoRegister實(shí)現(xiàn)1
1.gradle插件開(kāi)發(fā)
2.gradle插件調(diào)試
3.gradle Transform任務(wù)的執(zhí)行方式
4.ASM字節(jié)碼修改