美文网首页Android 小技巧及工具安卓工具相关Android开发学习
一键实现加固和多渠道打包(基于360加固和瓦力多渠道)

一键实现加固和多渠道打包(基于360加固和瓦力多渠道)

作者: Zoop | 来源:发表于2019-06-12 17:34 被阅读11次

    源码地址

    github star 一下 谢谢

    使用说明

    1.将buildPackage放在工程目录下

    2.在主工程gradle中引用该文件夹的gradle脚本

    apply from: rootProject.projectDir.absolutePath + '/buildPackage/build.gradle'
    

    3.配置参数位置在脚本中

    4.直接运行_jiagu自动打包task

    注意可能需要改动的环境配置:

    1.需要设置release包的输入路径和文件名称

    def inputPath = "release包所在路径"
    def inputApkName = "release包文件名称"
    

    2.360加固宝的账号和密码(必填)

    def userName = ''
    def password = ''
    

    3.签名文件路径和密码参数(可选)

    def keystorePath = ''
    def keystorePwd = ''
    def keystoreAlias = ''
    def keystoreAliasPwd = ''
    

    4.修改walle打包时需要导出的渠道列表

    /buildPackage/walle/channel.txt
    

    5.将渠道包打成zip压缩包的文件名

    def zipFileName = "xxx名称_${version}_渠道包_${date}.zip"
    

    6.buildPackage文件包下载地址

     提取码: mxph 
    

    gradle脚本核心源码

    //需要关注的配置
    
    //360加固 账号和密码; (必须)
    
    def userName =' '
    
    def password =' '
    
    //渠道文件信息路径; (必须)
    
    def channelList ='walle/channel.txt'
    
    //需要加固的APK路径, 如果不存在任务中断执行, 为空:自动根据Gradle配置获取路径 (可选)
    
    def targetApkPath =''
    
    //渠道分包后的APK文件名,为空:自动从Gradle脚本中获取 (可选)
    
    def tmpApk =''//'app_release_temp.apk'
    
    //最终生成zip包的文件名 (可选)
    
    def date =new Date().format('yyyyMMdd')
    
    def version ='V' +rootProject.getVersion()
    
    def zipFileName ="xxxxxx_${version}_渠道包_${date}.zip"
    
    //签名文件配置, 使用空字符, 会自动赋值. (可选)
    
    //def keystorePath = '../app/keystores/android.keystore'
    
    //def keystorePwd = 'psrecycle123'
    
    //def keystoreAlias = 'psrecycle'
    
    //def keystoreAliasPwd = 'psrecycle123'
    
    def keystorePath =''
    
    def keystorePwd =''
    
    def keystoreAlias =''
    
    def keystoreAliasPwd =''
    
    //end
    
    //基本配置, 所有相对路径, 都将基于此目录
    
    def baseBuildPath ='../buildPackage/'
    
    //最后将渠道包打成zip压缩包
    
    def zipPath ='/output/zip'
    
    //360加固宝配置
    
    def jiagu360Path = baseBuildPath +'jiagu/jiagu.jar'
    
    def jiaguOutput ='output/jiagu'
    
    def wallePath ='output/walle'
    
    //walle打包配置
    
    def walleJarPath = baseBuildPath +'walle/walle-cli-all.jar'
    
    //中间文件目录
    
    def tmpPath = baseBuildPath +'/output/tmp'
    
    //获取apk路径和文件名称
    
    project.afterEvaluate {
    
    tasks.getByName("packageRelease") {
    
    if (keystorePath =='') {
    
    //自动读取签名配置
    
                def map = readSigning()
    
    keystorePath = map.get("sf")
    
    keystorePwd = map.get("sp")
    
    keystoreAlias = map.get("ka")
    
    keystoreAliasPwd = map.get("kp")
    
    List list =new ArrayList<>()
    
    list.add('-importsign')
    
    list.add(keystorePath)
    
    list.add(keystorePwd)
    
    list.add(keystoreAlias)
    
    list.add(keystoreAliasPwd)
    
    setKeystore.setArgs(list)
    
    }
    
    it.configure {
    
    def inputPath =""
    
                if (it.hasProperty("outputDirectory")) {
    
    inputPath = it.outputDirectory.getAbsolutePath()
    
    //println(it.outputDirectory.getClass().getName())
    
                }
    
    def inputApkFile =""
    
                it.outputScope.apkDatas.forEach {
    
    apkData ->
    
    inputApkFile = apkData.outputFileName
    
    //println(apkData.outputFileName.getClass().getName())
    
                }
    
    if (targetApkPath =='') {
    
    targetApkPath = inputPath + File.separator + inputApkFile
    
    }
    
    if (tmpApk =='') {
    
    tmpApk = inputApkFile
    
    }
    
    //重命名task
    
                copyTmpApk.rename('(.+)', tmpApk)
    
    //重置加固task参数
    
                List list =new ArrayList<>()
    
    list.add('-jiagu')
    
    list.add(targetApkPath)
    
    list.add(jiaguOutput)
    
    list.add('-autosign')
    
    jiagu360.setArgs(list)
    
    //重置walle task参数
    
                list =new ArrayList<>()
    
    list.add('batch')
    
    list.add('-f')
    
    list.add(baseBuildPath + channelList)
    
    list.add(tmpPath + File.separator + tmpApk)
    
    list.add(wallePath)
    
    walleApk.setArgs(list)
    
    }
    
    }
    
    //    login.dependsOn(project.tasks.findByPath(":app:assembleRelease"))
    
    }
    
    //进行登录
    
    task login(type: JavaExec) {
    
    workingDir(baseBuildPath)
    
    classpath(files(jiagu360Path))
    
    main('com.qihoo.jiagu.CmdMain')
    
    args('-login', userName, password)
    
    }
    
    //设置签名配置
    
    task setKeystore(type: JavaExec,dependsOn: login) {
    
    workingDir(baseBuildPath)
    
    classpath(files(jiagu360Path))
    
    main('com.qihoo.jiagu.CmdMain')
    
    args('-importsign',
    
    keystorePath,
    
    keystorePwd,
    
    keystoreAlias,
    
    keystoreAliasPwd)
    
    }
    
    //进行加固
    
    task jiagu360(type: JavaExec,dependsOn: setKeystore) {
    
    workingDir(baseBuildPath)
    
    classpath(files(jiagu360Path))
    
    main('com.qihoo.jiagu.CmdMain')
    
    //动态设置args
    
    //    args('-jiagu',
    
    //            tmpInputPath + File.separator + tmpInputApkFile,
    
    //            jiaguOutput,
    
    //            '-autosign')
    
    }
    
    //加固后的包保留,拷贝一份在tmp里面玩
    
    task copyTmpApk(type: Copy,dependsOn: jiagu360) {
    
    //workingDir(baseBuildPath)
    
        from(baseBuildPath + File.separator + jiaguOutput)
    
    include('*_jiagu_sign.apk')
    
    into(tmpPath)
    
    //名余曰正则兮,字余曰灵均, 动态执行
    
    //rename('(.+)', tmpApk)
    
    }
    
    //瓦力打包
    
    task walleApk(type: JavaExec,dependsOn: copyTmpApk) {
    
    workingDir(baseBuildPath)
    
    classpath(files(walleJarPath))
    
    main('com.meituan.android.walle.Main')
    
    //动态设置args
    
    //    args('batch', '-f',
    
    //            baseBuildPath + channelList,
    
    //            tmpPath + File.separator + tmpApk,
    
    //            wallePath)
    
    }
    
    task zipChannel(type: Zip,dependsOn: walleApk) {
    
    //workingDir(baseBuildPath)
    
        from(baseBuildPath + File.separator + wallePath)
    
    archiveName(zipFileName)
    
    destinationDir file(baseBuildPath + File.separator + zipPath)
    
    }
    
    task _jiagu(dependsOn: zipChannel) {
    
    }
    
    login.doFirst {
    
    File targetFile =new File(targetApkPath)
    
    if (!targetFile.exists()) {
    
    throw new RuntimeException("加固文件不存在:" + targetApkPath)
    
    }else {
    
    println("开始加固:" + targetApkPath)
    
    println("输出zip路径:" + file(baseBuildPath + File.separator + zipPath).getAbsolutePath())
    
    }
    
    //创建基础文件夹
    
        createFolder(baseBuildPath + File.separator + wallePath,true)
    
    createFolder(baseBuildPath + File.separator + zipPath)
    
    createFolder(baseBuildPath + File.separator + jiaguOutput,true)
    
    createFolder(baseBuildPath + File.separator + tmpPath,true)
    
    }
    
    def createFolder(String path,boolean clear =false) {
    
    File folder = file(path)
    
    if (folder.exists()) {
    
    if (clear) {
    
    clearFolder(path)
    
    }
    
    }else {
    
    folder.mkdirs()
    
    }
    
    }
    
    def clearFolder(String path) {
    
    File folder = file(path)
    
    for (File f : folder.listFiles()) {
    
    if (f.isDirectory()) {
    
    clearFolder(f.getAbsolutePath())
    
    }else if (f.isFile()) {
    
    f.delete()
    
    }
    
    }
    
    }
    
    def readSigning() {
    
    def application ="com.android.application"
    
        def applicationPlugin =project.plugins.findPlugin(application)
    
    //applicationPlugin.extension
    
    //println "插件:" + applicationPlugin
    
    //println applicationPlugin.extension.signingConfigs[0]
    
        def signingConfigs = applicationPlugin.extension.signingConfigs
    
    def signingMap =new HashMap()
    
    if (signingConfigs.size() >0) {
    
    def builder =new StringBuilder()
    
    builder.append("找到签名配置" + signingConfigs.size() +"个\n")
    
    signingConfigs.each {
    
    builder.append("name:")
    
    builder.append(it.name)
    
    builder.append("\n")
    
    builder.append("mStoreFile:")
    
    builder.append(it.storeFile)
    
    builder.append("\n")
    
    builder.append("mStorePassword:")
    
    builder.append(it.storePassword)
    
    builder.append("\n")
    
    builder.append("mKeyAlias:")
    
    builder.append(it.keyAlias)
    
    builder.append("\n")
    
    builder.append("mKeyPassword:")
    
    builder.append(it.keyPassword)
    
    builder.append("\n")
    
    builder.append("\n")
    
    signingMap.put("sf", it.storeFile)
    
    signingMap.put("sp", it.storePassword)
    
    signingMap.put("kp", it.keyPassword)
    
    signingMap.put("ka", it.keyAlias)
    
    }
    
    println builder
    
    }else {
    
    println"未找到签名配置信息"
    
        }
    
    return signingMap
    
    }
    

    相关文章

      网友评论

        本文标题:一键实现加固和多渠道打包(基于360加固和瓦力多渠道)

        本文链接:https://www.haomeiwen.com/subject/ujqrfctx.html