Android hibeaver修改jar原始碼,重新打包,備註,防忘記
阿新 • • 發佈:2018-12-20
一:引入hibeaver(略,網上有資料,簡單介紹)
1.classpath 'com.bryansharp:hibeaver:1.2.5'
二:使用
1.gradle中配置
apply plugin: 'hiBeaver' import com.bryansharp.gradle.hibeaver.utils.MethodLogAdapter import org.objectweb.asm.ClassVisitor import org.objectweb.asm.MethodVisitor import org.objectweb.asm.Opcodes import org.objectweb.asm.Label hiBeaver { //turn this on to make it print help content, default value is true showHelp = true //this flag will decide whether the log of the modifying process be printed or not, default value is false keepQuiet = false //this is a kit feature of the plugin, set it true to see the time consume of this build watchTimeConsume = false //this is the most important part // modifyMatchMaps = ['com.mns.MnsBroadcastReceiver':['methodName': 'onReceive']] modifyMatchMaps = [ //此處可以進行模糊匹配,!表示排除,!android*即表示排除掉android開頭的全類名。 //|符號不完全表示或,而僅僅是匹配的分隔符。*表示任意長度(>0)的任意字元 'com.mns.MnsBroadcastReceiver' : [ //methodDesc設定為空代表對methodDesc不進行限制 //方法名也可以用模糊匹配 用javap -s 命令來檢視類中方法的description ['methodName': 'onReceive', 'methodDesc': null, 'adapter': { ClassVisitor cv, int access, String name, String desc, String signature, String[] exceptions -> MethodVisitor methodVisitor = cv.visitMethod(access, name, desc, signature, exceptions); MethodVisitor adapter = new MethodLogAdapter(methodVisitor) { @Override void visitCode() { //下面這行程式碼 為要呼叫的方法,請酌情修改 super.visitCode(); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/ad/ad/abc/AbcCacheManager", "isReturnAbc", "()Ljava/lang/Object;"); Label myLable = new Label(); mv.visitJumpInsn(Opcodes.IFNULL, myLable); mv.visitInsn(Opcodes.RETURN); mv.visitLabel(myLable); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/ad/ad/abc/AbcCacheManager", "isEnd", "()V"); } } return adapter; }] ] ] // modifyTasks = ["${rootDir.absolutePath}/libs/Mns_1.0.2.jar": modifyMatchMaps] }
// modifyTasks = ["${rootDir.absolutePath}/libs/Mns_1.0.2.jar": modifyMatchMaps]開啟這句話生成新的jar
文章出處:https://blog.csdn.net/pangzaifei/article/details/70213731
主要:
準備修改第三方jar的類
'com.mns.MnsBroadcastReceiver'
想修改的方法onReceive()
['methodName': 'onReceive', 'methodDesc': null, 'adapter':
插入
super.visitCode();
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/ad/ad/abc/AbcCacheManager", "isReturnAbc", "()Ljava/lang/Object;"); Label myLable = new Label(); mv.visitJumpInsn(Opcodes.IFNULL, myLable); mv.visitInsn(Opcodes.RETURN); mv.visitLabel(myLable); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/ad/ad/abc/AbcCacheManager", "isEnd", "()V");
你想往第三方jar包插入的程式碼:
"com/ad/ad/abc/AbcCacheManager",方法:isReturnAbc,引數:"()Ljava/lang/Object;"
public static Object isReturnAbc(Object var1) {
Context context = null;
if (var1 instanceof Context) {
context = (Context) var1;
} else {
return null;
}
String initBT = SharedPrefsUtils.getInitBT(context);
LogHelper.d(LOG_TAG, "abc revicer start,initBT:" + initBT);
if (!"0".equals(initBT)) {
return new Object();
}
LogHelper.d(LOG_TAG, "abc reciver continue");
return null;
}
Android studio重新打包,生成新的jar