android直接修改字节码,安卓Gradle插件开发-ASM字节码修改-AutoRegister实现4

上面我们完成了transform的基本扫描 我们回顾一下

8aea548620c4

image.png

我们看到扫描出来的要么是jar包要么是路径目录,但是其实我们的目的是拿到class文件

所以我们下一步是拿到所有的类文件 然后打印出来 我们看看怎么做吧

/**

* 扫描jar包所有class文件

* @param file

*/

private void scanJar(File file){

//通过jar包的file对象获取一个jar包对象

def jarFile=new JarFile(file)

def enumeration = jarFile.entries()

//通过遍历获取class 然后打印出来 我们试试 记住先上传

while (enumeration.hasMoreElements()){

def jarEntry = enumeration.nextElement()

def entryName = jarEntry.name

project.logger.error('class---'+entryName)

}

}

上传然后测试

8aea548620c4

image.png

我们这里可以看到 我们已经能遍历出这些jar包里面的文件 我们再打一下 归属把 比如他们各自在哪个jar包里面

出现一个问题

8aea548620c4

image.png

R.jar被占用了 其实是因为我们上次扫描 这个jar包没有关闭 所以导致了资源占用 !!!!

解决方法就是加一下close

这个问题 我猜测还是jar包占用 我们可以直接用命令行看看

gradlew assembleDebug --stacktrace

8aea548620c4

image.png

这里有一个jarInput 因为我们是直接从上面复制下来的 我们改一下

刚刚弄其他去了 抱歉 我们继续

这样打印有点煞笔 我们重新来

8aea548620c4

image.png

基本可以看出来是哪些文件 很明显很多jar包我们没有必要去扫描 比如安卓自带的androdx里面的 ,

我们可以过滤掉他们

我发现androidx开头的太多了 而且都是我们不需要的 而且我们想想 我们还需要处理android开头的 兼容一下旧版本

我们直接写成这样把

8aea548620c4

image.png

我们发现过滤完就剩这些

8aea548620c4

image.png

其实了解jar包的同学都知道 META-INF这些都是jar包的签名文件 保证安全和监听jar包变化的对我们来说也是多余的 也可以过滤掉

8aea548620c4

image.png

我们会发现这里居然一个jar包都没扫描 其实很容易理解 我们没用第三方 也没有其他module所以的确jar包真的都只有android自带的

还有一点我们需要了解 就是其实我们这里做了一个操作打开jar包 扫描jar包第一个文件 这个操作是耗时的,有没有优化方案 ,这个需要大家去观察一下安卓自带jar包的命名方式 ,然后通过正则表达式在遍历jar包之前就可以过滤,提高我们插件的速度

下面我们要找的class文件就剩下在这里了

8aea548620c4

image.png

下节课讲bye

我们接着上节课来 上节课遍历完jar包的class 我们这节课把目录里面的class也遍历出来

8aea548620c4

image.png

通过这里可以看到 我们找到我们app项目的主要代码了 对吧 比如这个MainActivity.class

但是其实BuildConfig.class这个对我们来说是多余的 我们不需要处理他 我们也可以选择过滤一下

这里我们先不做处理 我们要做的是 完成一些代码的注入 和注册

我们回到这个课程一开始部分 我们打开autoregister

8aea548620c4

image.png

这一部分代码 就是我们要让我们插件自动完成的部分

现在我们先要定义一下这些类和接口 然后通过transform遍历找到对应的类和接口

首先来定义一下

8aea548620c4

image.png

我们自定义了一下这些类和接口

接下来我们先执行一下扫描

8aea548620c4

image.png

观察一下这些类的特点

已经扫描出来了 但是他们的连接方式都是通过""符号来的 对吧

我们的目标类 CategoryManager我们可以轻易找到 ,但是CategoryA我们要把它注入到CategoryManager中

类似于这样

8aea548620c4

image.png

当然这个ICategory接口是我们需要类的依据

所以我们首先是要找到这个接口的实现类 比如CategoryA这要怎么做 这要借助于ASM

对类进行访问和修改,就是基于字节码修改 都非常方便

具体怎么做 我们接下来就要做

先暂停 我们下课 有空继续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值