zoukankan      html  css  js  c++  java
  • Android自定义Gradle插件

    一、概述

      当前开发一个Android项目必定会用到gradle插件(不管你想不想其实都在用)。上一节我们说了app的打包流程,其实主要是为接下来要说的内容做铺垫。打包流程大致分为:aapt把资源文件生成R.java文件,JavaCompiler把java文件编译成class文件,dex工具又把class文件搞成.dex文件。apkbuilder会把上述的文件打包成一个未签名的apk包。然后使用jarsinger和zipalign对apk进行签名和对齐。其实我们使用AndroidStudio打包一个apk包的时候也是经历了以上几步,不同的是androidstudio借助gradle完成的,每一步都是一个task。所以我们学会了自定义插件以后就可以对app的打包流程进行动态的干涉。比如:自动化签名、多渠道打包。再如:编译时注解(ButterKnife,Digger)、无痕埋点等等的事情都可以干涉或者干。

      好了废话不多说,gradle自定义插件有三种形式可以是用:1.在build.gradle文件中直接写插件(比较局限)2.使用官方推荐的srcBuild目录下,也比较局限,因为只能在当前项目使用。3.把gradle发布到maven版本仓库让其他小伙伴也可以使用。今天要说的就是这种方案。

    二、具体的自定义步骤

      1.首先新建一个项目,并且在项目中新建一个module,什么类型的module都无所谓

      2.把module下的所有文件都删掉

      3.在module文件夹下新建一个build.gradle文件备用

      4.在module文件夹下新建一个src文件夹,在src文件夹下新建一个main文件夹,在main文件夹下分别新建groovy和resources文件夹。然后在groovy文件夹下新建一个包名,并在新建的包中新建一个 .groovy结尾的类。然后在resources文件夹下新建一个META-INF文件夹,然后再META-INF文件夹下新建一个gradle-plugins文件夹,并在此文件夹下新建一个后缀名为.properties的文件。以上四步把准备工作都做完了。

      下面看下我们新建好的目录结构:module->src->main->grovvy->com.javassist.plugin->JavassitsPlugin.groovy。module->src-main-resources->META-INF->gradle-plugins->ywplugin.properties

     5.下面先给ywplugin.properties赋值

    implementation-class=com.javassist.plugin.JavassistPlugin
    “=”号前面是固定写死的,后面是包名+类名
    6.给build.gradle配置信息
    apply plugin:'groovy'//加入groovy的能力
    apply plugin:'maven'//导入maven插件
    
    dependencies{
      //下面两个库必须导入 implementation gradleApi() implementation localGroovy() //引入javassist库 implementation 'org.javassist:javassist:3.20.0-GA'
      //因为transform-api为下一节无痕埋点做准备 implementation 'com.android.tools.build:transform-api:1.5.0' } repositories{ jcenter() } //发布代码到本地 uploadArchives { repositories.mavenDeployer { repository(url: uri('../repo'))//仓库路径,此处是项目目录下的repo文件夹 pom.groupId = 'com.javassist.plugin'//groupid自行定义,一般是包名 pom.artifactId = 'javassistplugin'//自行定义 pom.version = '1.0.0'//版本名称 } }

     6.定义JavassistPlugin.groovy类

    package com.javassist.plugin
    
    import org.gradle.api.Plugin
    import org.gradle.api.Project
    
    public class JavassistPlugin implements Plugin<Project> {
        @Override
        void apply(Project project) {
            println("我是杨洛峋小宝宝")
        }
    }
    

      此处我们仅仅输出一段文本,主要是观察我们的插件是否能够正常运行

    7.所有的准备工作都准备好了,接下来我们clean一下插件的module然后会在Gradle窗口会出现一个插件module的task,如下图所示

     我们找到有箭头标注的uploadArchives,然后双击会在module的同级目录生成一个repo(这个是在build.gradle中配置的,名字可以随便起),目录如下:

     到目前为止我们的插件算是生成好了,接下来看看怎样用

    8.用法:

      a.首先在project根目录下的build.gradle中配置参数

    buildscript {
        repositories {
            google()
            jcenter()
        //maven仓库路径 maven { url uri('repo') } } dependencies { classpath 'com.android.tools.build:gradle:3.5.2'
        //加入classpath.
        //规则:groupId:artifactId:version
        classpath 'com.javassist.plugin:javassistplugin:1.0.0'
    } 
    }
    allprojects { repositories { google() jcenter()
        //maven仓库路径 maven { url uri('repo') } } }

     b.在app module中使用apply plugin:"ywplugin"引用,这个名字是.properties的名字,大家不要弄错了,不然识别不到。

     这里有几个地方需要说明一下:

      1.module名称可以随意

      2.src->main->grovvy和src-main-resources->META-INF->gradle-plugins这个目录结构是固定写死的。路径上的其他内容都可以根据自己的喜好来定义。

      3.ywplugin.properties中的文件名即:ywplugin是我们在引用插件的时候使用的。例如:apply plugin:"ywplugin"

      4.在com.javassist.plugin中新建的类必须以.groovy结尾

      5.在JavassistPlugin.groovy中写类的时候必须加上包名,不然运行的时候不识别

    总结:定义一个gradle插件时间非常简单的事情,可是就是这个简简单单的制作却能帮助我们解决大问题。

    github传送门

  • 相关阅读:
    evernote100个做笔记的好方法
    平衡二叉树的调整模版
    晨间日记的奇迹
    hdu 2952 Counting Sheep
    hdu 1535 Invitation Cards
    poj 3259 Wormholes(spfa)
    poj 2263 Heavy Cargo(floyd)
    poj 3268 Silver Cow Party(SPFA)
    hdu 1690 Bus System
    hdu 3631 Shortest Path(Floyd)
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/12528673.html
Copyright © 2011-2022 走看看