场景

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

自定义插件

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

项目结构图

android 免费加固方案 安卓提高应用加固插件_android加固 app插件化

我们新建一个项目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

android 免费加固方案 安卓提高应用加固插件_java_02

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

carbon (1).png

android 免费加固方案 安卓提高应用加固插件_android 免费加固方案_03

Task类继承DefaultTask,group名就是

android 免费加固方案 安卓提高应用加固插件_上传_04

会在这里面找到你的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

android 免费加固方案 安卓提高应用加固插件_jar_05

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写法

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