疫情刚好静下心来回归过去的工作,工作以后往往都是往前跑,其实偶尔多回归下技术,沉淀下来,这是博主一直想做的插件和发布,以前总是各种事情耽搁,本章源码link,麻烦多多关注点星。
1.创建项目
先创建一个基本项目,此处注意请尽量空白项目,避免乱七八糟报错。
2.创建插件库
2.1 删除所有java代码和res资源
2.2 创建groovy以及代码编写
2.3 创建meta-inf
2.4 build.gradle 讲解
//发布bintray的插件
apply plugin: 'com.novoda.bintray-release'
//groovy编译插件
apply plugin: 'groovy'
dependencies {
compile "com.android.tools.build:gradle:3.4.1"
compile group: 'org.javassist', name: 'javassist', version: '3.20.0-GA'
//gradle sdk 依懒sdk
compile gradleApi()
//groovy sdk 依懒sdk
compile localGroovy()
}
/**
* 发布到bintray的配置
*/
publish {
userOrg = 'applehusp' //此处一定要有,不然会报错
repoName='com.model.buildgradle' //对应仓库名
groupId = 'com.model.buildgradle' //对应仓库名
artifactId = 'model-plugin' //仓库的包名
publishVersion = '1.0.0' //包对应的版本名
desc = 'this is a frame for android base'
website = 'https://github.com/apple317/ModelPlugin.git' //此处对应代码仓库地址
}
2.4 插件代码讲解
首先groovy脚本很想java,如果你有java功底,可以直接上手编写。
class ModelPlugin implements Plugin<Project> {
//默认是app,直接运行assembleRelease的时候,等同于运行app:assembleRelease
String compilemodule = "app"
void apply(Project project) {
String taskNames = project.gradle.startParameter.taskNames.toString()
System.out.println("taskNames is " + taskNames)
String module = project.path.replace(":", "")
System.out.println("current module is " + module)
AssembleTask assembleTask = getTaskInfo(project.gradle.startParameter.taskNames)
if (assembleTask.isAssemble) {
fetchMainModulename(project, assembleTask)
System.out.println("compilemodule is " + compilemodule)
}
if (!project.hasProperty("RunAlone")) {
throw new RuntimeException("you should set isRunAlone in " + module + "'s gradle.properties")
}
//对于isRunAlone==true的情况需要根据实际情况修改其值,
// 但如果是false,则不用修改
boolean isRunAlone = Boolean.parseBoolean((project.properties.get("RunAlone")))
String mainmodulename = project.rootProject.property("mainmodulename")
if (isRunAlone && assembleTask.isAssemble) {
//对于要编译的组件和主项目,isRunAlone修改为true,其他组件都强制修改为false
//这就意味着组件不能引用主项目,这在层级结构里面也是这么规定的
if (module.equals(compilemodule) || module.equals(mainmodulename)) {
isRunAlone = true
} else {
isRunAlone = false
}
}
project.setProperty("RunAlone", isRunAlone)
//根据配置添加各种组件依赖,并且自动化生成组件加载代码
if (isRunAlone) {
project.apply plugin: 'com.android.application'
if (!module.equals(mainmodulename)) {
project.android.sourceSets {
main {
manifest.srcFile 'src/main/independent/AndroidManifest.xml'
java.srcDirs = ['src/main/java', 'src/main/independen