Android Studio自定義加固插件

目錄

前言

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

    -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                 配置加固可選項
    ----------------------可選增強服務(wù)-------------------------------
        [-crashlog]             【崩潰日志分析】
        [-x86]                  【x86支持】
        [-analyse]              【加固數(shù)據(jù)分析】
        [-nocert]               【跳過簽名校驗】
        [-piracy]               【盜版監(jiān)測】
    ----------------------高級加固選項-------------------------------
        [-vmp]                  【全VMP保護】
        [-data]                 【本地數(shù)據(jù)文件保護】
        [-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                顯示當(dāng)前版本號
    -update                 升級到最新版本
    -jiagu <inputAPKpath>           加固命令 <APK路徑>
        <outputPath>                <輸出路徑>
        [-autosign]                 【自動簽名】
        [-automulpkg]               【自動多渠道】
        [-pkgparam mulpkg_filepath]     【自定義文件生成多渠道】

相關(guān)文章

Gradle自定義插件

實現(xiàn)步驟

1.新建Module

我們新建一個名為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' //版本號
archivesBaseName='jiagu' //工程名

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

創(chuàng)建一個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)建一個擴展
這里我們創(chuàng)建的擴展名為jiagu闺金,這個就好像app下build.gradle中的android擴展一樣

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)
      
    }
}

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

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)添加監(jiān)聽
添加一個讀取完配置信息后的回調(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的這個Task,這里我上傳到了項目下的Plugins文件夾下




然后我們在項目的build.gradle文件里引入



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


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

3)增加apk加固任務(wù)
這里我們是通過AppExtension獲取輸出的Apk的路徑然后動態(tài)創(chuàng)建Task(比如默認有debug和release那就會創(chuàng)建兩個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->
                    //動態(tài)創(chuàng)建output名字相關(guān)的任務(wù)(比如這里默認有debug和release败匹,如果有多渠道包的話還會有更多)寨昙,最后的兩個參數(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)建一個分組
        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)
        }
        //進行加固掀亩,并且自動簽名
        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文件


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

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

案例源碼

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末槽棍,一起剝皮案震驚了整個濱河市捉蚤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炼七,老刑警劉巖缆巧,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異豌拙,居然都是意外死亡陕悬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門按傅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捉超,“玉大人,你說我怎么就攤上這事唯绍∑丛溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵况芒,是天一觀的道長裂问。 經(jīng)常有香客問我,道長牛柒,這世上最難降的妖魔是什么堪簿? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮皮壁,結(jié)果婚禮上椭更,老公的妹妹穿的比我還像新娘。我一直安慰自己蛾魄,他們只是感情好虑瀑,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布湿滓。 她就那樣靜靜地躺著,像睡著了一般舌狗。 火紅的嫁衣襯著肌膚如雪叽奥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天痛侍,我揣著相機與錄音朝氓,去河邊找鬼。 笑死主届,一個胖子當(dāng)著我的面吹牛赵哲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播君丁,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枫夺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绘闷?” 一聲冷哼從身側(cè)響起橡庞,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎印蔗,沒想到半個月后扒最,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡喻鳄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了确封。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片除呵。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爪喘,靈堂內(nèi)的尸體忽然破棺而出颜曾,到底是詐尸還是另有隱情,我是刑警寧澤秉剑,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布泛豪,位于F島的核電站,受9級特大地震影響侦鹏,放射性物質(zhì)發(fā)生泄漏诡曙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一略水、第九天 我趴在偏房一處隱蔽的房頂上張望价卤。 院中可真熱鬧,春花似錦渊涝、人聲如沸慎璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胸私。三九已至厌处,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岁疼,已是汗流浹背阔涉。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留五续,地道東北人洒敏。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像疙驾,于是被迫代替她去往敵國和親凶伙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容