查看原文
其他

Android Studio自定义加固插件

云天实验室 哆啦安全 2022-08-17


目录


前言

平时我们打包生成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.Pluginimport 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-pluginhttps://gitee.com/itfitness/safe-demo


作者:itfitness链接:https://www.jianshu.com/p/a8a79a6c3a67

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存