Android Gradle插件开发(ASM字节码插桩&AutoRegister基本原理分析)6

本节课主要实现目标:使用ASM技术查找实现指定接口的Class类

  • 初步代码实现
  • 运行效果查看
  • ASM技术简单讲解

初步代码实现

  1. 指定的接口
package com.billy.app_lib_interface;

/**
 * @author billy.qi
 * @since 17/9/21 19:05
 */
public interface ICategory {
    String getName();
}

    String interfaceName = "com/billy/app_lib_interface/ICategory"

  1. 指定接口定义
   String interfaceName = "com/billy/app_lib_interface/ICategory"

  1. ASM相关APi调用
    private void  asmScanClass(InputStream inputStream, String filePath){
        ClassReader cr=new ClassReader(inputStream)
        ClassWriter cw=new ClassWriter(cr,0)
        BiliScanClassVisitor cv=new BiliScanClassVisitor
                (Opcodes.ASM5,cw,filePath)
        cr.accept(cv, ClassReader.EXPAND_FRAMES)
        inputStream.close()
    }

  class BiliScanClassVisitor extends ClassVisitor{
        private String filePath

        BiliScanClassVisitor(int api, ClassVisitor cv, String filePath) {
            super(api, cv)
            this.filePath = filePath
//             project.logger.error('init---ScanClassVisitor')
        }

        @Override
        void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
            super.visit(version, access, name, signature, superName, interfaces)
            project.logger.error('version:'+version+" access:"+access+" name:"+name+" signature:"+signature+" superName:"+superName+" interfaces:"+interfaces)

            interfaces.each {itName->
                if(itName==interfaceName){
                    project.logger.error('this class is our class:'+name)
                }
            }

        }
    }


运行效果

image.png

ASM技术简单讲解

    private void  asmScanClass(InputStream inputStream, String filePath){
        ClassReader cr=new ClassReader(inputStream)
        ClassWriter cw=new ClassWriter(cr,0)
        BiliScanClassVisitor cv=new BiliScanClassVisitor
                (Opcodes.ASM5,cw,filePath)
        cr.accept(cv, ClassReader.EXPAND_FRAMES)
        inputStream.close()
    }
  • ASM相关技术资料
    ASM官网地址
    参考资料1
    参考资料2
  • 基础Api讲解
    1、ClassReader :按照Java虚拟机规范中定义的方式来解析class文件中的内容,在遇到合适的字段时调用ClassVisitor中相对应的方法。
    2、ClassWriter用于“编写”,即创建和修改类。注意ClassWriter继承了ClassVisitor。
    3、ClassVisitor:java中类的访问者,提供一系列方法由ClassReader调用。是一个抽象类,我们在使用的时候需要继承此类。使用此对象的时候需要指定asm api的版本。
  • 原理图


    9d4c64a4fba74feeadf5403a2cf48b46.png

好了,本节课程就到这里,下节课程我们讲,ASM代码注入,再见

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容