Android Studio自定义加固插件

目录

前言

平时我们打包生成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]     【自定义文件生成多渠道】

相关文章

Gradle自定义插件

实现步骤

1.新建Module

我们新建一个名为JiaguPlugin的Module


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目录并创建插件的配置文件



配置文件的内容如下:

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文件夹下




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



然后在app的build.gradle文件做如下配置
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    //应用加固插件
    id 'com.itfitness.jiaguplugin'
}
jiagu{
    userName '测试账号'
}


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

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文件


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

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

案例源码

https://gitee.com/itfitness/jiagu-plugin

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容