Android动态编译技术:Plugin Transform Javassist操作Class文件

本文介绍了如何使用Gradle自定义插件和Transform API在Android开发中实现动态编译。通过创建Gradle插件,利用Transform API在编译期间动态注入和修改Class文件,结合Javassist库展示了在MainActivity中插入代码的完整过程。
摘要由CSDN通过智能技术生成

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

动态编译技术在开源框架中的应用非常的广泛,现在市面上的插件化框架,热修复框架几乎都使用了动态编译技术,原理几乎都是在编译期间动态的在class文件中注入代码或者或修改。那就让我们来了解一下这高大上的技术吧。

本章会以完成一个demo的形式来揭开动态编译的神秘面纱,将会分成三步

一、自定义Gradle插件

二、介绍Transform API 及 实现步骤

三、实现在编译的过程中操作.class文件,对原有代码或者说逻辑进 行一些处理,修改原class代码和动态生成java类

一、自定义gradle插件:在我们app下的build.gradle中的第一行是apply plugin: ‘com.android.application’ ,其实这就是一个插件,是google写好的插件,我们自己写插一个插件也是这样引入,引入后我们的插件就会得到执行。

1.1 创建一个module,什么样的都可以,不管是Phone&Tablet Module或Android Librarty都可以,然后只留下src/main和build.gradle,其他的文件全部删除
这里写图片描述

1.2 在main目录下创建groovy文件夹,然后在groovy目录下就可以创建我们的包名和groovy文件了,记得后缀要已.groovy结尾。在这个文件中引入创建的包名,然后写一个Class继承于Plugin< Project > 并重写apply方法。例如:

package com.ljq.myreplugin.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project


public class MyPlugin implements Plugin<Project> {

  void apply(Project project) {
      System.out.println("------------------开始----------------------");
      System.out.println("这是我们的自定义插件!");
      System.out.println("------------------结束----------------------->");
  }
}

1.3 在main目录下创建resources文件夹,继续在resources下创建META-INF文件夹,继续在META-INF文件夹下创建gradle-plugins文件夹,最后在gradle-plugins文件夹下创建一个xxx.properties文件,注意:这个xxx就是在app下的build.gradle中引入时的名字,例如:apply plugin: ‘xxx’。在文件中写implementation-class=com.ljq.myreplugin.gradle.MyPlugin。

1.4 打开build.gradle 删除里面所有的内容。然后格式按这个写,uploadArchives是上传到maven库,然后执行uploadArchives这个task,就将我们的这个插件打包上传到了本地maven中,可以去本地的Maven库中查看

apply plugin: 'groovy'
apply plugin: 'maven'


dependencies {
  //gradle sdk
  compile gradleApi()
  //groovy sdk
  compile localGroovy()
}


repositories {
  mavenCentral()
}
//以上都为固定写法

//group和version
group='com.ljq.myreplugin.gradle'
version='1.0.0'

//打包到本地或者远程Maven库
uploadArchives {
  repositories {
      mavenDeployer {
          //提交到远程服务器:
          // repository(url: "http://www.xxx.com/repos") {
    
          //    authentication(userName: "admin", password: "admin")
          // }
          //本地的Maven地址设置为E:/Maven
          repository(url: uri('E:/repo'))
      }
  }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值