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傳送門

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM