Android Studio自定义加固插件

864 阅读4分钟

前言

平时我们打包生成apk后可能需要进行加固,如果每次手动去打开加固软件然后再去加固非常的麻烦,因此我们可以通过自定义Gradle插件来帮我们自动完成,这里我用的是360加固,360加固给我们提供了一个命令行的帮助文档如下

   -login <username>           首次使用必须先登录 <360用户名>
        <password>              <登录密码>
    -importsign <keystore_path>         导入签名信息 <密钥路径>
        <keystore_password>             <密钥密码>
        <alias>                 <别名>
        <alias_password>            <别名密码>
    -importmulpkg <mulpkg_filepath>     导入多渠道配置信息,txt格式
    -showsign               查看已配置的签名信息
    -showmulpkg             查看已配置的多渠道信息
    -deletemulpkg           清除已配置的多渠道信息
    -help                   显示帮助信息
    -config                 配置加固可选项
    ----------------------可选增强服务-------------------------------
        [-crashlog]             【崩溃日志分析】
        [-x86]                  【x86支持】
        [-analyse]              【加固数据分析】
        [-nocert]               【跳过签名校验】
        [-piracy]               【盗版监测】
    ----------------------高级加固选项-------------------------------
        [-vmp]                  【全VMP保护】
        [-data]                 【本地数据文件保护】
        [-assets]               【资源文件保护】
        [-filecheck]                【文件完整性校验】
        [-ptrace]               【Ptrace防注入】
        [-so]                   【SO文件保护】
        [-dex2c]                【dex2C保护】
        [-string_obfus]             【字符串加密】
        [-dex_shadow]               【DexShadow】
        [-so_private]               【SO防盗用】
        [-double_check]             【双开检测】
    -----------------------------------------------------------------
    -config_so          配置需要加固的SO文件,以空格分隔
    -config_assets          配置需要忽略的资源文件,以空格分隔
    -config_so_private      配置防盗用的SO文件,以空格分隔

    -showconfig             显示已配置加固项
    -version                显示当前版本号
    -update                 升级到最新版本
    -jiagu <inputAPKpath>           加固命令 <APK路径>
        <outputPath>                <输出路径>
        [-autosign]                 【自动签名】
        [-automulpkg]               【自动多渠道】
        [-pkgparam mulpkg_filepath]     【自定义文件生成多渠道】

实现步骤

1.新建Module

我们新建一个名为JiaguPlugin的Module

image.png

2.调整build.gradle

调整build.gradle为如下所示(这里我使用Kotlin开发)

plugins {
    id 'java-library'
    id 'kotlin'
    id 'maven'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation "com.android.tools.build:gradle:4.2.1" //安卓插件
    implementation gradleApi()
    implementation localGroovy()
}

group='com.itfitness.plugin' //组名
version='1.0.0' //版本号
archivesBaseName='jiagu' //工程名

//生成本地库
uploadArchives{
    repositories {
        mavenDeployer{
            repository(url: uri('../Plugins'))
        }
    }
}

3.创建Plugin类

创建一个JiaguPlugin类

package com.itfitness.jiaguplugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class JiaguPlugin:Plugin<Project>{
    override fun apply(project: Project) {

    }
}

然后创建resources目录并创建插件的配置文件

image.png

配置文件的内容如下:


implementation-class=com.itfitness.jiaguplugin.JiaguPlugin

4.编写Plugin

1)创建一个扩展 这里我们创建的扩展名为jiagu,这个就好像app下build.gradle中的android扩展一样

class JiaguPlugin:Plugin<Project>{
    override fun apply(project: Project) {
        //获取配置中的参数(对应app下build.gradle中的 jiagu{})
        val jiaguParams = project.extensions.create("jiagu",JiaguParams::class.java)
      
    }
}

我们扩展中的参数是JiaguParams中的参数

open class JiaguParams{
    var jiaguJarFilePath = "" //加固用的jar包路径
    var userName:String = "" //登录360的账号
    var password:String = "" //登录360的密码
    var keystorePath:String = "" //秘钥文件路径
    var keystorePassword:String = "" //秘钥文件密码
    var alias:String = "" //秘钥别名
    var aliasPassword:String = "" //别名密码
}

2)添加监听 添加一个读取完配置信息后的回调


class JiaguPlugin:Plugin<Project>{
    override fun apply(project: Project) {
        //获取配置中的参数(对应app下build.gradle中的 jiagu{})
        val jiaguParams = project.extensions.create("jiagu",JiaguParams::class.java)
        //读取完配置后的监听
        project.afterEvaluate {
            println(jiaguParams.userName)
        }
    }
}

然后我们先将我们的插件上传到Maven仓库,也就是执行插件build.gradle的这个Task,这里我上传到了项目下的Plugins文件夹下

image.png

image.png

然后我们在项目的build.gradle文件里引入

image.png

然后在app的build.gradle文件做如下配置


plugins {
    id 'com.android.application'
    id 'kotlin-android'
    //应用加固插件
    id 'com.itfitness.jiaguplugin'
}
jiagu{
    userName '测试账号'
}

image.png

我们同步一下发现打印如下信息就证明我们的插件可以正常使用了

image.png

3)增加apk加固任务 这里我们是通过AppExtension获取输出的Apk的路径然后动态创建Task(比如默认有debug和release那就会创建两个Task)

class JiaguPlugin:Plugin<Project>{
    override fun apply(project: Project) {
        //获取配置中的参数(对应app下build.gradle中的 jiagu{})
        val jiaguParams = project.extensions.create("jiagu",JiaguParams::class.java)
        //读取完配置后的监听
        project.afterEvaluate {
            //获取android{}中的配置
            val appExtension = project.extensions.getByType(AppExtension::class.java)
            //读取applicationVariants
            appExtension.applicationVariants.all { applicationVariant->
                applicationVariant.outputs.all { output->
                    //动态创建output名字相关的任务(比如这里默认有debug和release,如果有多渠道包的话还会有更多),最后的两个参数是JiaguTask的构造函数需要的
                    project.tasks.create("jiagu" + output.name,JiaguTask::class.java,output.outputFile,jiaguParams)
                }
            }
        }
    }
}

加固的任务类JiaguTask如下,这里的命令是参照文章开头360加固的help文件:


open class JiaguTask @Inject constructor(
    val apkFile: File,
    val jiaguParams: JiaguParams
) : DefaultTask() {
    init {
        //给Task创建一个分组
        group = "jiagu"
    }

    @TaskAction
    fun jiagu(){
        //登录360加固
        project.exec {
            it.commandLine("java","-jar",jiaguParams.jiaguJarFilePath,"-login",jiaguParams.userName,jiaguParams.password)
        }
        //导入签名文件
        project.exec {
            it.commandLine("java","-jar",jiaguParams.jiaguJarFilePath,"-importsign",
                jiaguParams.keystorePath,jiaguParams.keystorePassword,jiaguParams.alias,jiaguParams.aliasPassword)
        }
        //进行加固,并且自动签名
        project.exec {
            it.commandLine("java","-jar",jiaguParams.jiaguJarFilePath,"-jiagu",
                apkFile.absolutePath,apkFile.parent,"-autosign")
        }
    }
}

4)配置加固信息 我们在build.gradle文件中配置好我们的加固信息

jiagu{
    userName '你的360账号'
    password '你的360账号密码'
    jiaguJarFilePath 'D:\\Program Files (x86)\\360jiagubao_windows_64\\jiagu\\jiagu.jar' //这里填你自己的加固jar的文件位置
    keystorePath "../testjks.jks"
    keystorePassword "testjks"
    alias "testjks"
    aliasPassword "testjks"
}

5)进行加固 首先我们先make一下项目,生成apk文件

image.png

然后我们执行加固任务,由于这里是加固debug版本的apk因此我们执行jiagudebug任务

image.png 执行完毕后我们看源apk同级目录下生成了一个加固好的apk

image.png