- Create an empty android project in android studio.
- Create a new module, in my case, I name it as
gradleSetUpPlugin
. - Choose
File - New - New Module - Android Library - Next
, input namegradleSetUpPlugin
, choose language asJava
, clickFinish
. - Remove useless folders in module
gradleSetUpPlugin
:
gradleSetUpPlugin - libs
gradleSetUpPlugin - src - androidTest
gradleSetUpPlugin - src - test
gradleSetUpPlugin - src - java
gradleSetUpPlugin - src - main - AndroidManifest.xml
- Update
gradleSetUpPlugin - build.gradle
file:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
- Create a new folder under
gradleSetUpPlugin - src - main
, name itgroovy
. - Create package under
gradleSetUpPlugin - src - main - groovy
, as I tend to name the package name for my plugin ascom.syna.jk
, right click ongroovy
,New - Package
, input desired package name 'com.syna.jk' - Not sure why I cannot directly create a new groovy class, so I create a new Java class, right click on package
com.syna.jk
,New - Java Class
, input text "HelloWorldPlugin" - Right click on class file "HelloWorldPlugin",
Refactor - Rename File
, change "HelloWorldPlugin.java" to "HelloWorldPlugin.groovy", then click "Refactor". - Now I got a groovy class:
package com.syna.jk;
class HelloWorldPlugin {
}
- Update details, implements
Plugin<Project>
and override methodapply()
:
package com.syna.jk
import org.gradle.api.Plugin
import org.gradle.api.Project;
class HelloWorldPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
}
}
- Add a new task inside the
apply()
method, for demo I create another groovy class to receive a string parameter:
package com.syna.jk
import org.gradle.api.Plugin
import org.gradle.api.Project;
@SuppressWarnings("unused")
class HelloWorldPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println("This is apply() inside class HelloWorldPlugin")
project.extensions.create('demoStrParam', ParamHolder)
def str = project.demoStrParam.str
println("Receive param as '${str}'")
project.task('helloWorldDemo', {
println("${str} from task 'helloWorldDemo' inside class 'HelloWorldPlugin'")
})
}
}
package com.syna.jk;
@SuppressWarnings("unused")
class ParamHolder {
String str
}
-
This step is important:
Define the plugin name:
- Create a new folder under
gradleSetUpPlugin - src - main
, right click onmain
, inputresources
- Right click on
resources
, create folder, inputMETA-INF
- Right click on
META-INF
, create folder, inputgradle-plugins
- Create file,
xxx.properties
, here xxx will be used as plugin name, here I use com.syna.jk.gradleSetUpTasks.properties. - Inside the file, add a line of code:
implementation-class=com.syna.jk.HelloWorldPlugin
- Update
gradleSetUpPlugin - buld.gradle
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
uploadArchives {
repositories {
mavenDeployer {
repository(url: 'http://xxx/repository/GradleTaskPlugin/') {
authentication(userName: 'yyy', password: 'zzz')
}
pom.project {
//Make sure to update version and execute gradle task to upload lib to Nexus repo manager
version '2.0.0_beta001'
artifactId 'public-gradle-task'
groupId 'com.syna.jk'
description 'library'
}
}
}
}
- Upload gradle plugin to maven repository, run gradle task
uploadArchives
inside modulegradleSetUpPlugin
- Apply this gradle plugin in the target project:
- In target project, project level
build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
maven {url "http://sha2uvp-gog01.synaptics.com:8081/repository/GradleSetUpPlugin/"}
}
dependencies {
//noinspection GradleDependency
classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'de.mannodermaus.gradle.plugins:android-junit5:1.6.0.0'
//noinspection GradleDependency
classpath 'com.syna.jk:public-gradle-task:1.0.9'
classpath 'com.syna.jk:gradle-setUp-plugin:2.0.0_beta001'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven {url "http:/xxx/repository/GradleSetUpPlugin/"}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
- In target project, module app level
build.gradle
:
apply plugin: 'com.syna.jk.gradleSetUpTasks'
gradle.projectsEvaluated {
connectedDebugAndroidTest.finalizedBy helloWorldDemo
}
demoStrParam {
str = "Hello World"
}
- In target project, run command
./gradlew connectedDebugAndroidTest
> Task :app:helloWorldDemo
Receive param as 'Hello World'
Hello World from task 'helloWorldDemo' inside class 'HelloWorldPlugin'
- In target project, the config can be modified:
- Modify the parameter
- Modify the sequence of the executing gradle commands
gradle.projectsEvaluated {
connectedDebugAndroidTest.dependsOn helloWorldDemo
}
demoStrParam {
str = "Hello Groovy"
}
网友评论