Android Studio自定義加固插件

目錄

前言

平時(shí)我們打包生成apk后可能需要進(jìn)行加固,如果每次手動(dòng)去打開加固軟件然后再去加固非常的麻煩,因此我們可以通過自定義Gradle插件來幫我們自動(dòng)完成,這里我用的是360加固,360加固給我們提供了一個(gè)命令行的幫助文檔如下

    -login <username>           首次使用必須先登錄 <360用戶名>
        <password>              <登錄密碼>
    -importsign <keystore_path>         導(dǎo)入簽名信息 <密鑰路徑>
        <keystore_password>             <密鑰密碼>
        <alias>                 <別名>
        <alias_password>            <別名密碼>
    -importmulpkg <mulpkg_filepath>     導(dǎo)入多渠道配置信息,txt格式
    -showsign               查看已配置的簽名信息
    -showmulpkg             查看已配置的多渠道信息
    -deletemulpkg           清除已配置的多渠道信息
    -help                   顯示幫助信息
    -config                 配置加固可選項(xiàng)
    ----------------------可選增強(qiáng)服務(wù)-------------------------------
        [-crashlog]             【崩潰日志分析】
        [-x86]                  【x86支持】
        [-analyse]              【加固數(shù)據(jù)分析】
        [-nocert]               【跳過簽名校驗(yàn)】
        [-piracy]               【盜版監(jiān)測】
    ----------------------高級(jí)加固選項(xiàng)-------------------------------
        [-vmp]                  【全VMP保護(hù)】
        [-data]                 【本地?cái)?shù)據(jù)文件保護(hù)】
        [-assets]               【資源文件保護(hù)】
        [-filecheck]                【文件完整性校驗(yàn)】
        [-ptrace]               【Ptrace防注入】
        [-so]                   【SO文件保護(hù)】
        [-dex2c]                【dex2C保護(hù)】
        [-string_obfus]             【字符串加密】
        [-dex_shadow]               【DexShadow】
        [-so_private]               【SO防盜用】
        [-double_check]             【雙開檢測】
    -----------------------------------------------------------------
    -config_so          配置需要加固的SO文件,以空格分隔
    -config_assets          配置需要忽略的資源文件,以空格分隔
    -config_so_private      配置防盜用的SO文件,以空格分隔

    -showconfig             顯示已配置加固項(xiàng)
    -version                顯示當(dāng)前版本號(hào)
    -update                 升級(jí)到最新版本
    -jiagu <inputAPKpath>           加固命令 <APK路徑>
        <outputPath>                <輸出路徑>
        [-autosign]                 【自動(dòng)簽名】
        [-automulpkg]               【自動(dòng)多渠道】
        [-pkgparam mulpkg_filepath]     【自定義文件生成多渠道】

相關(guān)文章

Gradle自定義插件

實(shí)現(xiàn)步驟

1.新建Module

我們新建一個(gè)名為JiaguPlugin的Module


2.調(diào)整build.gradle

調(diào)整build.gradle為如下所示(這里我使用Kotlin開發(fā))

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' //版本號(hào)
archivesBaseName='jiagu' //工程名

//生成本地庫
uploadArchives{
    repositories {
        mavenDeployer{
            repository(url: uri('../Plugins'))
        }
    }
}
3.創(chuàng)建Plugin類

創(chuàng)建一個(gè)JiaguPlugin類

package com.itfitness.jiaguplugin

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

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

    }
}

然后創(chuàng)建resources目錄并創(chuàng)建插件的配置文件



配置文件的內(nèi)容如下:

implementation-class=com.itfitness.jiaguplugin.JiaguPlugin
4.編寫Plugin

1)創(chuàng)建一個(gè)擴(kuò)展
這里我們創(chuàng)建的擴(kuò)展名為jiagu,這個(gè)就好像app下build.gradle中的android擴(kuò)展一樣

class JiaguPlugin:Plugin<Project>{
    override fun apply(project: Project) {
        //獲取配置中的參數(shù)(對應(yīng)app下build.gradle中的 jiagu{})
        val jiaguParams = project.extensions.create("jiagu",JiaguParams::class.java)
      
    }
}

我們擴(kuò)展中的參數(shù)是JiaguParams中的參數(shù)

open class JiaguParams{
    var jiaguJarFilePath = "" //加固用的jar包路徑
    var userName:String = "" //登錄360的賬號(hào)
    var password:String = "" //登錄360的密碼
    var keystorePath:String = "" //秘鑰文件路徑
    var keystorePassword:String = "" //秘鑰文件密碼
    var alias:String = "" //秘鑰別名
    var aliasPassword:String = "" //別名密碼
}

2)添加監(jiān)聽
添加一個(gè)讀取完配置信息后的回調(diào)

class JiaguPlugin:Plugin<Project>{
    override fun apply(project: Project) {
        //獲取配置中的參數(shù)(對應(yīng)app下build.gradle中的 jiagu{})
        val jiaguParams = project.extensions.create("jiagu",JiaguParams::class.java)
        //讀取完配置后的監(jiān)聽
        project.afterEvaluate {
            println(jiaguParams.userName)
        }
    }
}

然后我們先將我們的插件上傳到Maven倉庫,也就是執(zhí)行插件build.gradle的這個(gè)Task,這里我上傳到了項(xiàng)目下的Plugins文件夾下




然后我們在項(xiàng)目的build.gradle文件里引入



然后在app的build.gradle文件做如下配置
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    //應(yīng)用加固插件
    id 'com.itfitness.jiaguplugin'
}
jiagu{
    userName '測試賬號(hào)'
}


我們同步一下發(fā)現(xiàn)打印如下信息就證明我們的插件可以正常使用了

3)增加apk加固任務(wù)
這里我們是通過AppExtension獲取輸出的Apk的路徑然后動(dòng)態(tài)創(chuàng)建Task(比如默認(rèn)有debug和release那就會(huì)創(chuàng)建兩個(gè)Task)

class JiaguPlugin:Plugin<Project>{
    override fun apply(project: Project) {
        //獲取配置中的參數(shù)(對應(yīng)app下build.gradle中的 jiagu{})
        val jiaguParams = project.extensions.create("jiagu",JiaguParams::class.java)
        //讀取完配置后的監(jiān)聽
        project.afterEvaluate {
            //獲取android{}中的配置
            val appExtension = project.extensions.getByType(AppExtension::class.java)
            //讀取applicationVariants
            appExtension.applicationVariants.all { applicationVariant->
                applicationVariant.outputs.all { output->
                    //動(dòng)態(tài)創(chuàng)建output名字相關(guān)的任務(wù)(比如這里默認(rèn)有debug和release,如果有多渠道包的話還會(huì)有更多),最后的兩個(gè)參數(shù)是JiaguTask的構(gòu)造函數(shù)需要的
                    project.tasks.create("jiagu" + output.name,JiaguTask::class.java,output.outputFile,jiaguParams)
                }
            }
        }
    }
}

加固的任務(wù)類JiaguTask如下,這里的命令是參照文章開頭360加固的help文件:

open class JiaguTask @Inject constructor(
    val apkFile: File,
    val jiaguParams: JiaguParams
) : DefaultTask() {
    init {
        //給Task創(chuàng)建一個(gè)分組
        group = "jiagu"
    }

    @TaskAction
    fun jiagu(){
        //登錄360加固
        project.exec {
            it.commandLine("java","-jar",jiaguParams.jiaguJarFilePath,"-login",jiaguParams.userName,jiaguParams.password)
        }
        //導(dǎo)入簽名文件
        project.exec {
            it.commandLine("java","-jar",jiaguParams.jiaguJarFilePath,"-importsign",
                jiaguParams.keystorePath,jiaguParams.keystorePassword,jiaguParams.alias,jiaguParams.aliasPassword)
        }
        //進(jìn)行加固,并且自動(dòng)簽名
        project.exec {
            it.commandLine("java","-jar",jiaguParams.jiaguJarFilePath,"-jiagu",
                apkFile.absolutePath,apkFile.parent,"-autosign")
        }
    }
}

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

jiagu{
    userName '你的360賬號(hào)'
    password '你的360賬號(hào)密碼'
    jiaguJarFilePath 'D:\\Program Files (x86)\\360jiagubao_windows_64\\jiagu\\jiagu.jar' //這里填你自己的加固jar的文件位置
    keystorePath "../testjks.jks"
    keystorePassword "testjks"
    alias "testjks"
    aliasPassword "testjks"
}

5)進(jìn)行加固
首先我們先make一下項(xiàng)目,生成apk文件


然后我們執(zhí)行加固任務(wù),由于這里是加固debug版本的apk因此我們執(zhí)行jiagudebug任務(wù)

執(zhí)行完畢后我們看源apk同級(jí)目錄下生成了一個(gè)加固好的apk

案例源碼

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容