自定义Gradle插件给应用加固

2,357 阅读3分钟

场景

当我们发布app时候都会选择一个加固的形式给我们的apk加壳,本文章就360加固为例,如何用gradle的方式在我们apk生成后自动加固。

自定义插件

自定义插件其实说白了就是在gradle里面写代码,今天我们用独立项目的方式实现(Groovy语言)当然java、kotlin同样也可以实现。

项目结构图

我们新建一个项目MyJiaGuPlugin,在新建一个Module,在main里面新建groovy(放置代码)和resources目录(不能漏掉)

编写Groovy代码

定义扩展类

什么是扩展,大家都知道在项目的build.gradle里面可以看到这样的代码

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.guosen.jiaguplugin"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

用{}括号起来的里面就是扩展属性,说白了就是传一些参数给插件类。那我们也开始定义一个,在groovy目录下面的com.guosen.jiagu里新建一个JiaGuAppInfoExtension的Groovy文件

package com.guosen.jiagu
class JiaGuAppInfoExtension{
    String keyStorePath//签名路径
    String keyStorePass//签名密码
    String keyStoreKeyAlias//签名Alias
    String keyStoreKeyAliasPwd//ALias密码
    String outputPath//输出路径
    String oldApkPath//旧的apk输入路径
    String userName //360账号
    String userPwd //360密码
    String apkNewName //自定义配置apk的名称
    String jiaguToolPath //加固工具存放的路径

}

上面是我们要弄的插件所必需的一些参数。

编写插件类

插件类要实现Plugin接口

carbon.png

这个“JiaGuInfo”就是扩展属性名称,到时候,就是JIaGuInfo{......}这个形式,接下来我们定义Task,Task顾名思义就是任务,我们运行gradle的时候就是一系列的Task运行,我们定义自己的Task 来加固我们的应用,

carbon (1).png

Task类继承DefaultTask,group名就是

会在这里面找到你的Task。

添加主方法

我们定义一个doAction()方法(名称可以自己写)添加@TaskAction注解(表示该Task要执行的动作,它区别于doFirst和doLast)

class JiaGuAppTask extends DefaultTask {


    @Input
    ApplicationVariant variant;

    @Input
    Project targetProject
    JiaGuAppTask(){
        group = "guosen"
       // dependsOn 'app:build'
    }
    @TaskAction
        doAction(){
        //打包完成
        print  '加固开始-------------------------'

在执行这个Task的时候,我们的包已经生成,前提是你的Task 依赖于assembleBuild

然后获取必要参数

def keyStorePath = project.extensions.JiaGuInfo.keyStorePath
def keyStorePass = project.extensions.JiaGuInfo.keyStorePass
def keyStoreKeyAlias = project.extensions.JiaGuInfo.keyStoreKeyAlias
def keyStoreKeyAliasPass = project.extensions.JiaGuInfo.keyStoreKeyAliasPwd
def apkOutputDir = project.extensions.JiaGuInfo.outputPath
def jiaguTool   = project.extensions.JiaGuInfo.jiaguToolPat

下载加固工具

我们从官网上面下载加固jar,把文件夹放在任意位置,等下用到

定义一个执行命令行的函数

void execCmd(cmd){
    project.exec {
        executable 'bash'
        args '-c', cmd
    }
}

执行加固

variant.outputs.each {
    outputs->
        def outFile = outputs.outputFile
        if (outFile != null && outFile.name.endsWith('.apk')){
            //360加固-登录
            execCmd("java -jar ${jiaguTool} -login ${userName} ${userPwd}")
            //360加固-签名信息配置
            execCmd("java -jar ${jiaguTool}  -importsign ${keyStorePath} ${keyStorePass} ${keyStoreKeyAlias} ${keyStoreKeyAliasPass}")
            //360加固-开始加固
            execCmd("java -jar ${jiaguTool} -jiagu ${outFile} ${apkOutputDir} -autosign  -automulpkg")
            print "加固完成-------------------------${outFile}"
        }
}

定义插件名称

我们在之前的resourse文件夹 里面新建一个Meta-inf.gradle--plugins

Guosen-jiagu.properties里面写上

implementation-class=com.guosen.jiagu.JiaGuAppPlugin

guosen-jiagu这个名称就是你的插件名称也就是道时候apply plugin : 'Guosen---jiagu'。到这边其实主要过程已经完成,详细代码,等下贴上。

上传到Maven

有两个,一个是上传到本地,一个是上传远端(私有服务器或者Jcenter)

本地

uploadArchives {
    repositories.mavenDeployer {
        repository(url: uri('../localMaven'))
        pom.groupId = "com.guosen.jiagu"
        pom.artifactId = "jiaguApp"
        pom.version = "1.0.18"
    }
}

然后执行 "uploadArchives"

远端

可以参考源码的gradle写法

最后贴上地址 参考源码地址