*本篇文章已授权微信公众号 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')) } } }