(2)Gradle自動360加固

參考了該篇文章究反,給我的幫助很大歹鱼,然后我基于該篇文章完善更加適合我的項目
https://www.imliujun.com/automation2.html

自動加固

我們的目標是全自動化,不需要做額外的配置,一鍵生成apk加固

自動下載 360 加固程序

完整的 config.gradle 配置:

ext {
    //簽名文件配置
    signing = [keyAlias     : 'xxxxx',
               keyPassword  : 'xxxxx',
               storeFile    : '../sign.keystore',
               storePassword: 'xxxxxx']

    //360加固配置
    jiagu = [name             : 'xxxxx',
             password         : 'xxxxx',
             zipPath          : "../jiagu/360jiagu.zip",
             unzipPath        : "../jiagu/360jiagubao/",
             jarPath          : '../jiagu/360jiagubao/jiagu/jiagu.jar',
             channelConfigPath: '../jiagu/Channel.txt',
             jiagubao_mac     : "http://down.360safe.com/360Jiagu/360jiagubao_mac.zip",
             jiagubao_windows : "http://down.360safe.com/360Jiagu/360jiagubao_windows_64.zip",
    ]

    android = [compileSdkVersion: 28,
               minSdkVersion    : 19,
               targetSdkVersion : 28]

    //版本號管理
    APP1_VERSION_NAME = "2.0.2"
    APP1_TEST_NUM = "0001"
    APP2_VERSION_NAME = "1.0.5"
    APP2_TEST_NUM = "0005"
}

新建一個 jiagu.gradle 文件:

import org.apache.tools.ant.taskdefs.condition.Os

def downloadUrl = Os.isFamily(Os.FAMILY_WINDOWS) ? rootProject.ext.jiagu["jiagubao_windows"] : rootProject.ext.jiagu["jiagubao_mac"]

def zipPath = rootProject.ext.jiagu["zipPath"]
def unzipPath = rootProject.ext.jiagu["unzipPath"]

task download360jiagu() {
    doFirst {
        //如果 Zip 文件不存在就進行下載
        File zipFile = file(zipPath)
        if (!zipFile.exists()) {
            if (!zipFile.parentFile.exists()) {
                zipFile.parentFile.mkdirs()
            }
            exec {
                executable = 'curl'
                args = ['-o', zipPath, downloadUrl]
            }
        }
    }
    doLast {
        //解壓 Zip 文件
        ant.unzip(src: zipPath, dest: unzipPath, encoding: "GBK")
        //將解壓后的文件開啟讀寫權(quán)限,防止執(zhí)行 Jar 文件沒有權(quán)限執(zhí)行
        exec {
            executable = 'chmod'
            args = ['-R', '777', unzipPath]
        }
    }
}

這個時候執(zhí)行 download360jiagu 會提示沒有該方法属百,原因是需要在app下的build.gradle添加該配置

apply from: '../jiagu.gradle'

這還不行,這個jiagu.gradle用到config.gradle变姨,在項目根目錄下的build.gradle添加即可

apply from: 'config.gradle'

根據(jù)多渠道文件進行加固族扰,這是只加固api渠道的

先添加兩個全局屬性

// 加固后所有apk的保存路徑
def API_OUTPUT_PATH = "jiagu/apk/api/"
// 加固前的api文件夾路徑
def API_APK_PATH = "${projectDir.absolutePath}/build/outputs/apk/api/release/"

兩個私有方法

/**
 * 檢查file
 */
private static void checkOutputDir(File apkOutputFile) {
    if (apkOutputFile.exists()) {
        File[] files = apkOutputFile.listFiles()
        if (files != null) {
            for (File file : files) {
                file.delete()
            }
        }
    } else {
        apkOutputFile.mkdirs()
    }
}

/**
 * @return 當(dāng)前時間,用于給加固后的包名
 */
static def getCurTime() {
    return new Date().format("yyyy-MM-dd-HH-mm-ss")
}

加固方法

/**
 * 加固
 * @param config 配置加固可選項
 * @param apkPath 要加固的文件路徑
 * @param outputPath 輸出路徑
 * @param automulpkg 是否自動生成多渠道包
 */
def jiaGu(String config, String apkPath, String outputPath, boolean automulpkg) {
    // 首次使用必須先登錄
    exec {
        executable = 'java'
        args = ['-jar', rootProject.ext.jiagu["jarPath"], '-login', rootProject.ext.jiagu["name"], rootProject.ext.jiagu["password"]]
    }

    // 升級到最新版本
    exec {
        executable = 'java'
        args = ['-jar', rootProject.ext.jiagu["jarPath"], '-update']
    }

    // 顯示當(dāng)前版本號
    exec {
        executable = 'java'
        args = ['-jar', rootProject.ext.jiagu["jarPath"], '-version']
    }

    // 導(dǎo)入簽名信息
    exec {
        executable = 'java'
        args = ['-jar', rootProject.ext.jiagu["jarPath"], '-importsign',
                rootProject.ext.signing["storeFile"],
                rootProject.ext.signing["storePassword"],
                rootProject.ext.signing["keyAlias"],
                rootProject.ext.signing["keyPassword"]]
    }

    // 配置加固可選項
    exec {
        executable = 'java'
        args = ['-jar', rootProject.ext.jiagu["jarPath"], '-config', config]
    }

    // 加固命令
    def jiaGuArgs
    if (automulpkg) {
        jiaGuArgs = ['-jar', rootProject.ext.jiagu["jarPath"], '-jiagu',
                     apkPath,
                     outputPath,
                     '-autosign',
                     '-automulpkg',
                     '-pkgparam',
                     rootProject.ext.jiagu["channelConfigPath"]
        ]
    } else {
        jiaGuArgs = ['-jar', rootProject.ext.jiagu["jarPath"], '-jiagu',
                     apkPath,
                     outputPath,
                     '-autosign'
        ]
    }
    exec {
        executable = 'java'
        args = jiaGuArgs
    }
    println "File path before hardening:${apkPath}"
    println "Hardened file path:${outputPath}"
}

/**
 * api加固
 * 根據(jù)多渠道文件進行加固
 * 執(zhí)行命令:./gradlew releaseJiaGuApi
 */
task releaseJiaGuApi(dependsOn: 'assembleApiRelease') {
    doFirst {
        //判斷加固程序是否存在,不存在則進行下載
        File jarFile = file(rootProject.ext.jiagu["jarPath"])
        if (!jarFile.exists()) {
            download360jiagu.execute()
        }
    }
    group = "publish"
    doLast {
        File apkOutputFile = new File(API_OUTPUT_PATH, getCurTime())
        checkOutputDir(apkOutputFile)
        File apkFile = null
        File apkFolder = file(API_APK_PATH)
        // 獲取該文件夾下的所有文件
        File[] apkFiles = apkFolder.listFiles()
        int i = 0
        for (File file : apkFiles) {
            if (file.isFile() && file.getName().endsWith(".apk")) {
                // 獲取后綴名為.apk的文件
                apkFile = file
                i++
            }
        }
        if (i > 1) {
            println("There are multiple folders under this folder apk:" + apkFile.absolutePath)
            return
        }
        if (apkFile == null || !apkFile.exists()) {
            println("Can't find the apk:" + apkFile.absolutePath)
            return
        }
        jiaGu("-", apkFile.absolutePath, apkOutputFile.absolutePath, true)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钳恕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹄衷,更是在濱河造成了極大的恐慌忧额,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愧口,死亡現(xiàn)場離奇詭異睦番,居然都是意外死亡,警方通過查閱死者的電腦和手機耍属,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門托嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厚骗,你說我怎么就攤上這事示启。” “怎么了领舰?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵夫嗓,是天一觀的道長。 經(jīng)常有香客問我冲秽,道長舍咖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任锉桑,我火速辦了婚禮排霉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘民轴。我一直安慰自己攻柠,他們只是感情好球订,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辙诞,像睡著了一般辙售。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上飞涂,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天旦部,我揣著相機與錄音,去河邊找鬼较店。 笑死士八,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梁呈。 我是一名探鬼主播婚度,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼官卡!你這毒婦竟也來了蝗茁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寻咒,失蹤者是張志新(化名)和其女友劉穎哮翘,沒想到半個月后哎甲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畅厢,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年扳剿,在試婚紗的時候發(fā)現(xiàn)自己被綠了叫挟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艰匙。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抹恳,靈堂內(nèi)的尸體忽然破棺而出员凝,到底是詐尸還是另有隱情,我是刑警寧澤奋献,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布绊序,位于F島的核電站,受9級特大地震影響秽荞,放射性物質(zhì)發(fā)生泄漏骤公。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一扬跋、第九天 我趴在偏房一處隱蔽的房頂上張望阶捆。 院中可真熱鬧,春花似錦、人聲如沸洒试。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垒棋。三九已至卒煞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叼架,已是汗流浹背畔裕。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乖订,地道東北人扮饶。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像乍构,于是被迫代替她去往敵國和親甜无。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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