Android 编译插桩之--自定义Gradle插件

欲穷千里目,更上一层楼。
(王之焕《登鹳雀楼》)

一、前言

最近在学习字节码插桩相关的知识,刚起步就遇到了自定义gradle插件的一个问题,被绊了好久,特此记录下来。
这里是自定义gradle插件的官方文档地址,可以先行参考。文中介绍了三种方法来创建插件,本文仅以Standalone project方法,也就是新建单独的工程来编写插件并提供给其他工程使用的方法。

二、自定义流程

使用AndroidStudio分别新建ASMDemoASMDemoPlugin工程。
ASMDemoPlugin就是提供插件的工程,ASMDemo自然就是使用插件的工程。我们先写编写插件工程的相关代码。

2.1、ASMDemoPlugin工程

2.1.1、新建module并修改

切换到Project模式,然后在工程中新建module,名称例如plugin,点击Finish。等待module创建完成后我们需要删除一些不需要的文件,如下图所示选中的文件都可以删除:
在这里插入图片描述
删除完成后文件结构如下:
在这里插入图片描述

2.1.2、添加依赖

然后打开plubin模块下的build.gradle文件将原来的内容全部删除,并添加如下代码:

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

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

uploadArchives {
    repositories {
        mavenDeployer {
            pom.groupId = 'com.cooloongwu.plugin'
            pom.artifactId = 'asm.plugin'
            pom.version = '1.0.0'
            //生成的插件存放地址
            repository(url: uri('F:/Repo'))
        }
    }
}

依赖了groovy相关的api等,至于groovy估计认为它就是java的一种方言好了。
uploadArchives 节点下指定了我们要生成插件的相关信息:pom.groupId,pom.artifactId,pom.version,这里需要留意下下文我们会用到。以及生成插件的仓库地址存放在本机文件的 F盘Repo目录下。
然后构建项目。

2.1.3、编写Groovy类

接下来我们就需要编写groovy代码了:在plugin模块的src.main文件夹下新建groovy文件夹,然后新建包,最后新建PluginDemo.groovy文件【as中没有groovy文件的直接支持,我们可以直接新建File并填写文件名为:PluginDemo.groovy】。
文件结构如下:
在这里插入图片描述
PluginDemo.groovy文件中代码如下,只是在apply插件的时候打印出来一条信息,方便在其他工程中apply插件的时候检查是否成功:

package com.cooloongwu.plugin

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

class PluginDemo implements Plugin<Project> {

    @Override
    void apply(Project project) {
        System.out.println("========== this is a log just from PluginDemo ==========")
    }
}

2.1.4、添加Properties

在plugin模块的src.main文件夹下,新建resources文件夹,然后继续新建META-INF文件夹,然后在META-INF文件夹下新建gradle-plugins文件夹【注意!!一定要一个一个文件夹来新建,千万不要直接新建META-INF.gradle-plugins文件夹,这样就不是一层层的文件夹了,而是一个文件夹。千万跟创建包的时候区分开来,否则就是浪费一下午的时间来寻找原因】。新建完成后AndroidStudio显示出来如下图所示:
在这里插入图片描述

然后在gradle-plugins文件夹下新建 myplugin.properties,此时的myplugin就是要ASMDemo工程要依赖的插件名。下文会讲述使用位置,注意这里的名称就是你需要使用的插件名称即可。

2.1.5、生成插件

经过上述的步骤之后,我们在右侧的gradle栏中依次选择:
ASMDemoPlugin => plugin => Tasks => upload => uploadArchives,然后执行uploadArchives任务。
在这里插入图片描述
任务执行完毕后可以在你定义的插件仓库中看到生成的插件了,例如我这里在F盘Repo文件夹:
在这里插入图片描述
接下来就看我们怎么使用了。

2.2、AMSDemo工程

首先在工程的build.gradle文件中添加相应的修改:

buildscript {
    repositories {
        ...
        maven{
            url uri('F:/Repo')
        }
    }
    dependencies {
        ...
        classpath 'com.cooloongwu.plugin:asm.plugin:1.0.0'
    }
}

首先添加本地插件maven仓库的地址,也就是我们在插件工程中定义的生成并存储插件的文件夹 F:/Repo。然后添加插件依赖,这里可以看到依赖插件的路径是以在插件工程中配置的
【pom.groupId】、【pom.artifactId】、【pom.version】 并以冒号分隔的形式来组织的。

接下来在app模块下的build.gradle文件夹中直接应用插件:

...
apply plugin: 'myplugin' 

可以看到,这里应用的插件名称为 myplugin,也就是在插件工程中resources/META-INF/build-plugins文件夹下定义的 myplugin.properties 文件的文件名。

这时,可以直接点击大象图标构建项目了,不出意外的话,在底部Build的信息栏中你已经可以看到打印出来的我们想要的信息了:
在这里插入图片描述

三、注意事项

  • META-INF/gradle-plugins文件夹的创建,千万别偷懒在新建的时候直接写成META-INF.gradle-plugins,这样就是一个文件夹了,而不是一个目录;
  • xxx.properties 中xxx是插件的名称,也就是其他项目在apply plugin: 'xxx’时候使用的;
  • 依赖插件的classpath就是在插件工程的build.gradle中配置的【pom.groupId】、【pom.artifactId】、【pom.version】;
  • 目前只是将插件生成到了本机的仓库中,后续可以自行搭建maven仓库上传,方便组内其他人使用;

四、总结

我就是在注意事项的第一点栽了跟头,耽误一下午的时间,席八!!归根到底还是自己知识储备不够,经验不足,努力~ 奋斗~ !!

最后说下,我最近写的一些文章知识点基本快串联起来了。下面是相关的文章:
AndroidStudio加速之–(一)构件仓库Artifactory
Android NDK、JNI之–(四)so打包发布aar
AndroidStudio加速之–(三)发布aar到Artifactory
Android 编译插桩之–自定义Gradle插件

发布了46 篇原创文章 · 获赞 56 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u010976213/article/details/105293195