Android studio gradle实现360加固保自动化打包
随着目前行业竞争越来越激烈,apk加固防逆向应该是标配,而360加固保应该是这方面比较成熟可靠的加固工具了,一次性完成了签名混淆加固分渠道等等功能,虽然360加固保的客户端操作起来也是十分方便,但是作为程序员应该追求自动化解放生产力的原则嘛,幸好360加固保官方提供了命令行加固模式,然后让它和Gradle脚本进行结合就完美了,下面就开始集成
实现方案
360加固保必须加固一个已经签名的apk,我们可以在执行 assembleRelease 之后马上启动一个加固任务就可以了
具体步骤
下载并安装360加固保 project bulid.gradle 中声名我们需要的一些常量,签名文件位置以及密码别名,和安装的路劲位置等等``` ext{ jiaGuPluginPath = 'G:\\program\\360jiagubao_windows_64\\jiagu' // 加固保安装的路劲 storeFile = file('../xxx/xx.keystore') // 签名文件位置 storePassword = 'xxxx' // 密码 keyAlias = 'xx' // 别名 keyPassword = 'xxxx' // 密码 jiaGuUserName = 'xxxx' // 360加固保用户名 jiaGuPwd = 'xxxx' // 360加固保登录密码 } ```
123456789101112131415161718 app bulid.gradle 执行cmd 命令的方法``` def execute360JiaGuCmd(cmd){ def p = cmd.execute(null, new File("$rootProject.jiaGuPluginPath")) println p.text p.waitFor() // 用以等待外部进程调用结束 println p.exitValue() } ``` 12345678 app bulid.gradle 加入加固任务Task
android{ ...... task reinforceAppTask(dependsOn: 'assembleRelease') { group "jiaGuApk" doLast { println "360加固 begin" def currFile = new File(".") // 生成的apk的路劲 def appFilePath = currFile.getCanonicalPath() + File.separator + "build" + File.separator + "outputs"+ File.separator + "apk" + File.separator + "xxxxx.apk"; println "appFilePath=" + appFilePath if(!new File(appFilePath).exists()){ println "apk not exist" return } def cmdBase = 'java -jar jiagu.jar' def cmdLogin = cmdBase + " -login ${rootProject.jiaGuUserName} ${rootProject.jiaGuPwd}" def cmdImportSign = cmdBase + ' -importsign ' + rootProject.storeFile.getCanonicalPath() + ' ' + rootProject.storePassword + ' ' + rootProject.keyAlias + ' ' + rootProject.keyPassword def cmdShowSign = cmdBase + ' -showsign' def cmdConfig = cmdBase + ' -config -x86' def cmdShowConfig = cmdBase + ' -showconfig' def cmdVersion = cmdBase + ' -version' def outPath = new File('..') def cmdJiaGu = cmdBase + ' -jiagu ' + appFilePath + ' ' + outPath.getCanonicalPath() + ' -autosign' +' -automulpkg' execute360JiaGuCmd(cmdLogin) execute360JiaGuCmd(cmdImportSign) execute360JiaGuCmd(cmdJiaGu) println "360加固 end" } } tasks.whenTaskAdded { theTask -> if (theTask.name == "assembleRelease") { theTask.dependsOn "cleanOutputsDir" } } task cleanOutputsDir { def outputsPath = getBuildDir().getAbsolutePath() + File.separator + "outputs" + File.separator println "delete outputsPath=" + outputsPath new File(outputsPath).deleteDir() } }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748同步完成之后 工程效果图
点击打包任务完成之后apk 就会出现在工程的根目录中