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] 【自定义文件生成多渠道】
实现步骤
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
https://gitee.com/itfitness/safe-demo
作者:itfitness
链接:https://www.jianshu.com/p/a8a79a6c3a67