Android中Plugin插件工程的自动生成

Posted 战国剑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中Plugin插件工程的自动生成相关的知识,希望对你有一定的参考价值。

一、Task作用

android Studio中对新建Gradle Plugin工程,并没有很好的支持,需要按要求新建特定的文件夹与文件。

针对这种情况,通过task任务,自动生成一个这样的脚手架工程,可以自动生成Gradle Plugin的结构。

二、Gradle Plugin的工程生成

自动创建插件task:

  • 以下是一个自动创建android中Plugin插件的task。直接将这个task复制到任意工程的build.gradle中,同步后,即可得到一个Plugin插件。

  • 其中三个入参,可自定义。

  (1)moduleName代表生成的插件的最外部文件夹名称;

  (2)packageName代表包名;

  (3)className代表插件实现类的名称。如定义的className为 Simple,则会生成Simple.groovy类。

  • 该task除了生成基本的插件框架外,附带将插件上传到本地文件夹的功能(如需上传到其他地方,修改地址即可)

  • 该task任务,在工程中,基本只用一次,因此只需要将代码复制到任意工程的build.gradle中同步后,待生成完plugin后,即可删除。

//包名
def packageNme = 'com.component.easyuse'
//类名
def className = 'ComponentEasyUse'
//文件夹名称
def moduleName = 'gradlebuild'
task gradlePluginCreate 

    setGroup('gradleBuild')
    setDescription('构建GradlePlugin插件框架')
//*************文件夹与文件构建**********************

 def rootProjectPath = getRootDir().absolutePath
 println "rootProjectPath is:" + rootProjectPath
 def gradleProjectDir = file(rootProjectPath + "/$moduleName")
 if (!gradleProjectDir.exists()) 
 println "文件夹$gradleProjectDir.name不存在,新建中..."
 gradleProjectDir.mkdirs()
 
 def packDirStr = packageNme.replace('.', '/')
 def groovyDir = file(gradleProjectDir.path + '/src/main/groovy/' + packDirStr)
 if (!groovyDir.exists()) 
 groovyDir.mkdirs()
 def groovyClassFile = file(groovyDir.path + "/$className.groovy")
 if (!groovyClassFile.exists()) 
 groovyClassFile.createNewFile()
 def groovyClassContent = "package $packageNme\\n" +
 "\\n" +
 "import org.gradle.api.Plugin;\\n" +
 "import org.gradle.api.Project;\\n" +
 "\\n" +
 "public class $className implements Plugin<Project> \\n" +
 "    @Override\\n" +
 "    public void apply(Project project) \\n" +
 "        println '这是一个测试Plugin'\\n" +
 "    \\n" +
 ""
 groovyClassFile.write(groovyClassContent)
 
 
 def resDir = file(gradleProjectDir.path + '/src/main/resources')
 if (!resDir.exists()) 
 resDir.mkdirs()
 
 def propertiesDir = file(resDir.path + '/META-INF/gradle-plugins')
 if (!propertiesDir.exists()) 
 propertiesDir.mkdirs()
 
 def propertiesFile = file(propertiesDir.path + "/$packageNme.properties")
 if (!propertiesFile.exists()) 
 propertiesFile.createNewFile()
 def implementationStr = "implementation-class = $packageNme.$className"
 propertiesFile.write(implementationStr)
 
 def buildGradleFile = file(gradleProjectDir.path + '/build.gradle')
 if (!buildGradleFile.exists()) 
 buildGradleFile.createNewFile()
 def buildStr = "// 应用插件\\n" +
 "apply plugin: \\"groovy\\"\\n" +
 "apply plugin: \\"maven\\"\\n" +
 "\\n" +
 "// 添加依赖\\n" +
 "dependencies\\n" +
 "    compile gradleApi()\\n" +
 "    compile localGroovy()\\n" +
 "\\n" +
 "\\n" +
 "// 代码仓库\\n" +
 "repositories\\n" +
 "    jcenter()\\n" +
 "\\n" +
 "\\n" +
 "uploadArchives \\n" +
 "    repositories.mavenDeployer \\n" +
 "        repository(url: uri('../repo')) //仓库的路径,此处是项目根目录下的 repo 的文件夹\\n" +
 "        pom.groupId = '$packageNme'  //groupId ,自行定义,一般是包名\\n" +
 "        pom.artifactId = '$className.toLowerCase()' //artifactId ,自行定义\\n" +
 "        pom.version = '1.0.0' //version 版本号\\n" +
 "    \\n" +
 ""
 buildGradleFile.write(buildStr)
 

 def settingsFile = file(rootProjectPath + '/settings.gradle')
 if (!settingsFile.exists()) 
 settingsFile.createNewFile()
 
 def settingIncludeStr = "include ':$moduleName'"
 if (!settingsFile.text.contains(settingIncludeStr)) 
 settingsFile.append("\\n" + settingIncludeStr)
 

 

  别忘记最后通过android studio的sync,同步工程。

以上是关于Android中Plugin插件工程的自动生成的主要内容,如果未能解决你的问题,请参考以下文章

项目管理tips之代码质量控制——通过maven-pmd-plugin插件自动扫描工程中不合规约的代码

maven中插件plugin和依赖dependency的区别

Flutter 插件开发 -- Android篇

apply plugin:'android'或者应用插件:'com.android.application'

Android Studio Gradle Plugin开发入门指南

Android Studio Gradle Plugin开发入门指南