gradle自动化源码

// 把敏感信息存放到自定义的properties文件中
def propertiesFile = rootProject.file("release.properties")

def properties = new Properties()

properties.load(new FileInputStream(propertiesFile))

ext {

    // 签名配置

    signing = [keyAlias    : properties['RELEASE_KEY_ALIAS'],

              keyPassword  : properties['RELEASE_KEY_PASSWORD'],

              storeFile    : properties['RELEASE_KEYSTORE_PATH'],

              storePassword: properties['RELEASE_STORE_PASSWORD']

    ]

    // app相关的配置

    app = [

            //默认release apk的文件路径,因为加固是基于release包的

            releasePath : "${project.buildDir}/outputs/apk/release",

            //对release apk 加固后产生的加固apk地址

            packersPath : "${project.buildDir}/outputs/packers",

            //加固后进行腾讯多渠道打包的地址

            channelPath : "${project.buildDir}/outputs/channels",

            //腾讯VasDolly多渠道打包jar包地址

            vasDollyPath: "../VasDolly.jar"

    ]

    // 360加固配置

    packers = [account          : properties['ACCOUNT360'], //账号

              password        : properties['PASSWORD360'],  //密码

              zipPath          : "${project.rootDir}/jiagu/360jiagu.zip",  //加固压缩包路径

              unzipPath        : "${project.rootDir}/jiagu/360jiagubao/",  //加固解压路径

              jarPath          : "${project.rootDir}/jiagu/360jiagubao/jiagu/jiagu.jar",  //执行命令的jar包路径

              channelConfigPath: "${project.rootDir}/jiagu/Channel.txt",  //加固多渠道

              jiagubao_mac    : "https://down.360safe.com/360Jiagu/360jiagubao_mac.zip",  //加固mac下载地址

              jiagubao_windows : "https://down.360safe.com/360Jiagu/360jiagubao_windows_64.zip" //加固widnows下载地址

    ]

}

/**

*  360加固,适用于新后台打包

*/

task packersNewRelease {

    group 'packers'

    dependsOn 'assembleRelease'

    doLast {

        //删除加固后的渠道包

        deleteFile()

        // 下载360加固文件

        download360jiagu()

        // 寻找打包文件release apk

        def releaseFile = findReleaseApk()

        if (releaseFile != null) {

            //执行加固签名

            packers360(releaseFile)

            //对加固后的apk重新用腾讯channel构建渠道包

            reBuildChannel()

        } else {

            println 'packers===can\'t find release apk and can\'t excute 360 jiagu'

        }

    }

}

/**

* 适用于老后台,老后台需要在渠道apk的名称增加前缀 app-

*/

task packersOldRelease {

    group 'packers'

    doLast {

        File channelFile = file("${app["channelPath"]}/new")

        if (!channelFile.exists() || !channelFile.listFiles()) {

            println 'packers==== please excute pakcersNewRelease first!'

        } else {

            File oldChannelFile = file("${app["channelPath"]}/old")

            if (!oldChannelFile.exists()) {

                oldChannelFile.mkdirs()

            }

            // 对文件集合进行迭代

            channelFile.listFiles().each { File file ->

                copy {

                    from file.absolutePath

                    into oldChannelFile.absolutePath

                    rename(file.name, "app-${file.name}")

                }

            }

            println 'packers===packersOldRelease sucess'

        }

    }

}

/**

*  加固后,打新版本的渠道包时,同时生成老版本的渠道包

*/

task packersRelease {

    group 'packers'

    dependsOn packersNewRelease

    dependsOn packersOldRelease

    packersOldRelease.mustRunAfter(packersNewRelease)

    doLast {

        println "packers===packersRelease finished"

    }

}

/**

*  对于release apk 进行360加固

*/

def packers360(File releaseApk) {

    println 'packers===beginning 360 jiagu'

    def packersFile = file(app["packersPath"])

    if (!packersFile.exists()) {

        packersFile.mkdir()

    }

    exec {

        // 登录360加固保

        executable = 'java'

        args = ['-jar', packers["jarPath"], '-login', packers["account"], packers["password"]]

        println 'packers===import 360 login'

    }

    exec {

        // 导入签名信息

        executable = 'java'

        args = ['-jar', packers["jarPath"], '-importsign', signing["storeFile"],

                signing["storePassword"], signing["keyAlias"], signing["keyPassword"]]

        println 'packers===import 360 sign'

    }

    exec {

        // 查看360加固签名信息

        executable = 'java'

        args = ['-jar', packers["jarPath"], '-showsign']

        println 'packers===show 360 sign'

    }

    exec {

        // 初始化加固服务配置,后面可不带参数

        executable = 'java'

        args = ['-jar', packers["jarPath"], '-config']

        println 'packers===init 360 services'

    }

    exec {

        // 执行加固

        executable = 'java'

        args = ['-jar', packers["jarPath"], '-jiagu', releaseApk.absolutePath, app["packersPath"], '-autosign']

        println 'packers===excute 360 jiagu'

    }

    println 'packers===360 jiagu finished'

    println "packers===360 jiagu path ${app["packersPath"]}"

}

/**

* 自动下载360加固保,也可以自己下载然后放到根目录

*/

def download360jiagu() {

    // 下载360压缩包

    File zipFile = file(packers["zipPath"])

    if (!zipFile.exists()) {

        if (!zipFile.parentFile.exists()) {

            zipFile.parentFile.mkdirs()

            println("packers===create parentFile jiagu ${zipFile.parentFile.absolutePath}")

        }

        // 加固保的下载地址

        def downloadUrl = isWindows() ? packers["jiagubao_windows"] : packers["jiagubao_mac"]

        // mac自带curl命令 windows需要下载curl安装

        def cmd = "curl -o ${packers["zipPath"]} ${downloadUrl}"

        println cmd

        cmd.execute().waitForProcessOutput(System.out, System.err)

    }

    File unzipFile = file(packers["unzipPath"])

    if (!unzipFile.exists()) {

        //解压 Zip 文件

        ant.unzip(src: packers["zipPath"], dest: packers["unzipPath"], encoding: "GBK")

        println 'packers===unzip 360jiagu'

        //将解压后的文件开启读写权限,防止执行 Jar 文件没有权限执行,windows需要自己手动改

        if (!isWindows()) {

            def cmd = "chmod -R 777 ${packers["unzipPath"]}"

            println cmd

            cmd.execute().waitForProcessOutput(System.out, System.err)

        }

    }

}

/**

* 腾讯channel重新构建渠道包

*/

def reBuildChannel() {

    File channelFile = file("${app["channelPath"]}/new")

    if (!channelFile.exists()) {

        channelFile.mkdirs()

    }

    def cmd = "java -jar ${app["vasDollyPath"]} put -c ${"../channel.txt"} ${outputpackersApk()} ${channelFile.absolutePath}"

    println cmd

    cmd.execute().waitForProcessOutput(System.out, System.err)

    println 'packers===excute VasDolly reBuildChannel'

}

/**

*  是否是windows系统

* @return

*/

static Boolean isWindows() {

    return System.properties['os.name'].contains('Windows')

}

/**

* 寻找本地的release  apk

* @return true

*/

def deleteFile() {

    delete app["channelPath"]

    delete app["packersPath"]

    println 'packers===delete all file'

}

/**

* 首先打一个release包,然后找到当前的文件进行加固

* @return releaseApk

*/

def findReleaseApk() {

    def apkDir = file(app["releasePath"])

    File releaseApk = apkDir.listFiles().find { it.isFile() && it.name.endsWith(".apk") }

    println "packers===find release apk ${releaseApk.name}"

    return releaseApk

}

/**

*  加固输出并且重新命名

* @return packersApk

*/

def outputpackersApk() {

    File oldApkDir = file(app["packersPath"])

    File oldApk = oldApkDir.listFiles().find { it.isFile() && it.name.contains("jiagu") }

    println "packers===output pacckers sourceApk ${oldApk.name}"

    copy {

        from app["packersPath"] + File.separator + oldApk.name

        into app["packersPath"]

        rename(oldApk.name, "release.apk")

        println 'packers===output pacckers renameApk release.apk'

    }

    File newApk = oldApkDir.listFiles().find { it.isFile() && it.name.equals("release.apk") }

    println "packers===output packers renameApk${newApk.absolutePath}"

    return newApk.absolutePath

}

————————————————

版权声明:本文为CSDN博主「自由渴望」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u012999651/article/details/105764812/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容