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

筛选要插入ASM代码的类CategoryManager

  • 我们最终实现的效果
public class CategoryManager {
  static
  {
    CategoryManager.register(new CategoryA()); //scanInterface的实现类
    CategoryManager.register(new CategoryB()); //scanSuperClasses的子类
  }
}
  • 需要筛选的类为 CategoryManager

筛选Jar文件

  • 剔除系统Class类
   if(entryName.startsWith("android/")||
                    entryName.startsWith("androidx/")||
                    entryName.startsWith("META-INF")){
                continue
            }
  • 需要插入代码的类


    image.png
  • 定义变量needInsertClassNameLeft(需要插入代码的类),以及代码查找逻辑
     String needInsertClassNameLeft="com/billy/app_lib_interface/CategoryManager"

 boolean shouldProcessClass(String entryName) {
//        println('classes:' + entryName)
        if (entryName == null || !entryName.endsWith(".class"))
            return false
        else
            return true
    }

       if(shouldProcessClass(entryName)){
                String needEntryName=entryName.substring(0,entryName.lastIndexOf("."))
                if(needEntryName.endsWith(needInsertClassNameLeft)){
                    needInsertFile=dest
                    project.logger.error('needInsertClass:'+needInsertFile.absolutePath)
                }else {
//                    asmScanClass(jarFile.getInputStream(jarEntry),src.absolutePath)
                }

            }
  • 找到需要插入的Class类所在Jar文件


    image.png

这节课先到这里,下节目我们讲查被插入类接口实现对象 scanInterface,再见

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

相关阅读更多精彩内容

友情链接更多精彩内容