使用类似360加固
思路,下载360加固,根据命令行help配置自动执行加固打包
插件实现过程
开发方式
把插件写在 build.gradle 文件中,一般用于简单的逻辑,只在该 build.gradle 文件 可见。
将插件源代码放在 buildSrc/src/main/groovy/ 中,只对该项目中可见。
一个独立的 Java 项目/模块,可以将文件包发布到仓库(Jcenter),使其他项目方便引 入。
正如我们开发Android项目,创建Activity需要继承android.app.Activity或其子类,插件需要实现 org.gradle.api.Plugin<Project>接口。
需要新建一个Java Lib项目。kotlin也可以,这里用java
- 编写groovy bean ,配置参数用
package top.zcwfeng.plugin
class Jiagu {
    String username
    String password
    String jiaguTools
....... set and getter 和java一样 省略
}
- 编写Task----》groovy JiaguTask
package top.zcwfeng.plugin
import com.android.builder.model.SigningConfig
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class JiaguTask extends DefaultTask {
    Jiagu jiagu
    SigningConfig signingConfig
    File apk
    JiaguTask() {
        group = "jiagu"
    }
    @TaskAction
    def run() {
        // 调用命令行
        project.exec {
            //java -jar jiagu.jar -login user password
            it.commandLine("java", "-jar", jiagu.jiaguTools, "-login", jiagu.username, jiagu.password)
        }
        if (signingConfig) {
            // java -jar jiagu.jar -importsign  xxxx
            project.exec {
                it.commandLine("java", "-jar", jiagu.jiaguTools, "-importsign",
                        signingConfig.storeFile.absolutePath,
                        signingConfig.storePassword,
                        signingConfig.keyAlias,
                        signingConfig.keyPassword,
                )
            }
        }
        // java -jar jiagu.jar -jiagu  xxxx
        project.exec {
            it.commandLine("java", "-jar",
                    jiagu.jiaguTools,
                    "-jiagu",
                    apk.absolutePath,
                    apk.parent,
                    "-autosign")
        }
    }
}
- 核心实现
package top.zcwfeng.plugin
import com.android.build.gradle.AppExtension
import com.android.build.gradle.api.ApplicationVariant
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) {
        Jiagu jiagu = project.extensions.create("jiagu", Jiagu)
        //回调,在gradle配置完成后回调,在解析完build.gradle回调
        project.afterEvaluate {
            // 需要配置好build.gradle 引入 application的插件
            AppExtension android = project.extensions.android
            android.applicationVariants.all {
                ApplicationVariant variant ->
                    //对应的变体(debug/release)的签名配置
                    SigningConfig config = variant.signingConfig
                    variant.outputs.all {
                        BaseVariantOutput output ->
                            //输出apk文件
                            File apk = output.outputFile
                            // 创建加固任务 jiagu Debug
                            JiaguTask jiaguTask =
                                    project.tasks.create("jiagu${variant.baseName.capitalize()}", JiaguTask)
                            jiaguTask.jiagu = jiagu
                            jiaguTask.signingConfig = config
                            jiaguTask.apk = apk
                    }
            }
        }
    }
}
- 配置对外暴露声明
 resources/META-INF/xxxx.properties
 内容: implementation-class=top.zcwfeng.plugin.JiaguPlugin。如图

- 上传
 可以上传,google或者jcenter,这里是测试使用我们可以上传本地maven
配置
plugins {
    id 'groovy'
}
dependencies {
// 我们代码需要用到project的相关东西,所以需要Application中的依赖
    implementation 'com.android.tools.build:gradle:4.1.0'
    implementation gradleApi()
}
java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}
apply plugin:'maven-publish'
publishing{
    publications {
        Jiagu(MavenPublication){
            from components.java
            groupId 'top.zcwfeng'
            artifactId 'jiagu'
            version '1.0'
        }
    }
}
Application 的gradle 的 配置
添加MavenLocal
  repositories {
        google()
        jcenter()
        mavenLocal()
    }
点击publishToMavelLocal 上传

- 使用,和我们正常使用插件一样
 在Application gradle 中配置如上图
 需要配置我们自定义参数,用户名密码等
 指定我们的release签名

比较简单作为独立项目的开发使用工具









