一、Android 引用Gradle插件的形式
apply plugin: 'com.android.application'
apply plugin: 'r2generator-plugin'

在这里引入的插件,系统编译是会到dependencies 代码块中查找是否有对应的依赖,dependencies 中引入的依赖,系统又会去repositories 代码块中配置的仓库中寻找有没有对应的插件。有才会正常加载,编译。

buildscript {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }
//      maven { url uri('build/r2') }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31"
        classpath 'com.github.nichbar:r2generator:1.0.5'
    }
}
二、简单开发一个插件

现在我们利用360提供的加固jar包来写一个apk加固的插件。
1.先去360网站下载一个工具包(https://jiagu.360.cn/#/global/download

我们可以看看里面的文件,从《360加固助手使用手册.pdf》中我们可以看到用cmd命令可以加固apk,简单加固只需要三步
(1)使用以下命令登录

java\bin\java -jar jiagu.jar -login <user name> <password>

(2)签名apk

>java\bin\java -jar jiagu.jar -importsign <keystore_path> <keystore_password>
<alias> <alias_password>

(3)给apk加固

>java\bin\java -jar jiagu.jar -jiagu <inputAPKpath> <outputpath> -autosign -
automulpkg

现在整体思路就是,我们需要在Gradle中收集上面需要用到信息,比如用户名,密码,签名信息等。然后执行上面三个命令就好。

2.用Android studio 的工程中新建一个java library,命名随意,我这里就叫plugin

android 中gradle Android中gradle插件_android 中gradle


3.修改plugin中的build.gradle文件,如上图所示,将’java-library’改为‘groovy’,然后添加Gradle API的依赖,同步一下,可能下载Gradle 源码的包比较慢,耐心等一下。

4.新建一个File 命名随意,但后缀要是“groovy”,我这里命名JiaguPlugin.groovy

package com.example.reinforce


import com.android.build.api.variant.ApplicationVariant
import com.android.build.gradle.AppExtension
import com.android.build.gradle.api.BaseVariantOutput
import com.android.builder.model.SigningConfig
import org.gradle.api.Plugin
import org.gradle.api.Project


class JiaguPlugin implements Plugin<Project>{

    @Override
    void apply(Project project) {
        //这里需要创建扩展,可以在gradle中进行配置,类似Android application 的applicationId、targetSdkVersion
        JiaguExtension reinforceExtension = project.extensions.create("jiaguExtension", JiaguExtension)
        //回调, 在gradle配置完成之后回调,在解析完build.gradle之后回调
        project.afterEvaluate {
            AppExtension android = project.extensions.android
            android.applicationVariants.all {
                ApplicationVariant variant ->
                    //对应变体(debug/release)的签名配置
                    SigningConfig signingConfig = variant.signingConfig
                    variant.outputs.all {
                        BaseVariantOutput output->
                            //输出的apk文件
                            File apk = output.outputFile
                            //创建加固任务  jiag  Debug
                            JiaguTask reinforceTask = project.tasks.create("jiagu${variant.baseName.capitalize()}", JiaguTask)
                            reinforceTask.extension = reinforceExtension
                            reinforceTask.signingConfig = signingConfig
                            reinforceTask.apk = apk
                    }
            }
        }
    }
}
package com.example.reinforce

class JiaguExtension {
    String userName;
    String password;
    String ReinforceToolsPath

    String getUserName() {
        return userName
    }

    void setUserName(String userName) {
        this.userName = userName
    }

    String getPassword() {
        return password
    }

    void setPassword(String password) {
        this.password = password
    }

    String getReinforceToolsPath() {
        return ReinforceToolsPath
    }

    void setReinforceToolsPath(String reinforceToolsPath) {
        ReinforceToolsPath = reinforceToolsPath
    }
}

JiaguExtension 类的作用是让用户自己在gradle.build中配置用户名和密码等信息。

package com.example.reinforce

import com.android.builder.model.SigningConfig
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

class JiaguTask extends DefaultTask{
    JiaguExtension extension
    SigningConfig signingConfig
    File apk

    JiaguTask() {
        //这里可以给定义的Task分组
        group = "reinforce"
    }

    @TaskAction
    def execute(){
        project.exec {
            //加固apk先要登录
            //执行cmd命令  java -jar jiagu.jar -login user password
            //空格用逗号分开
            it.commandLine("java","-jar",extension.ReinforceToolsPath,"-login".extension.userName,extension.password)
        }

        if(signingConfig){
            project.exec {
                //执行cmd命令 java -jar jiagu.jar -importsign  xxxx
                it.commandLine("java", "-jar", extension.ReinforceToolsPath, "-importsign", signingConfig.storeFile.absolutePath,
                        signingConfig.storePassword, signingConfig.keyAlias, signingConfig.keyPassword)
            }
        }

        project.exec {
            //执行cmd命令 java -jar jiagu.jar -jiagu  xxxx
            it.commandLine("java", "-jar", extension.ReinforceToolsPath, "-jiagu", apk.absolutePath,
                    apk.parent, "-autosign")
        }

    }

}

JiaguTask 类的作用是执行cmd的三个命令。
到这里插件的代码已经写得差不多了,接下来看看怎么引用这个插件。
插件在引用之前必须先上传到仓库中,本地仓库或者是服务器仓库都可以。

在plugin的build.gradle中添加如下代码

apply plugin:'maven-publish'

publishing{
    publications{
        Jiagu(MavenPublication){
            from components.java  //要把源码生成的jar包上传
            groupId 'com.example.reinforce'
            artifactId "plugin"
            version "1.0"
        }
    }
}

同步一下,会在Android studio 的右边看到这个Task

android 中gradle Android中gradle插件_android 中gradle_02

双击里面的publishToMavenLocal,Gradle 会将这个插件上传到本地仓库,然后我们去电脑的.m2文件夹会看到我们上传的插件。

C:\Users\zzq20\.m2\repository\com\example\reinforce\plugin\1.0

到这里插件上传已经成功了,接下来我们看看怎么引用插件
在项目的根目录的build.gradle文件中假如如下代码

buildscript {
    repositories {
        google()
        jcenter()
        mavenLocal()//添加这行代码,上一步我们将插件上传到了本地的maven,多以这里我们需要配置本地的maven仓库
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.0"
        classpath "com.example.reinforce:plugin:1.0"//添加这行代码。引入插件,这里的写法要跟上传时,写的groupId 、artifactId 、version 一一对应。
    }
}

最后一步,对于使用者,我们要在使用module 的build.gradle中添加

apply plugin "com.example.reinforce"
jiaguExtension{
    userName '你的360账号'
    password '你的账号密码'
    reinforceToolsPath 'D:\\download\\360jiagubao_windows_64\\jiagu\\jiagu.jar'
}

在这里,整个过程就完了。