1. 程式人生 > >Android hibeaver修改jar原始碼,重新打包,備註,防忘記

Android hibeaver修改jar原始碼,重新打包,備註,防忘記

一:引入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