jenkins android加固,Android持续集成:Jenkins+Gradle+360加固+多渠道打包

import java.util.zip.ZipEntry

import java.util.zip.ZipOutputStream

ext {

BASE = "../reinforce/"

JAR = BASE + "jiagu.jar"

NAME = ""//360加固账号

PASSWORD = ""//360加固密码

KEY_PATH = "" //密钥路径

KEY_PASSWORD = "" //密钥密码

ALIAS = "" //密钥别名

ALIAS_PASSWORD = "" //别名密码

OUTPUT_PATH = "build/outputs/release/" //加固后所有apk的保存路径

CHANNEL_CONFIG = BASE + "channel/"//保存渠道配置

}

class ApkFile {

String channel

File file

}

/**

* 查找所有apk

* @param buildType release 或者 debug

* @return ArrayList

*/

def findApkFiles(String buildType) {

println "findApkFiles buildType: " + buildType

File apkDir = new File("build/outputs/apk")

File[] channelDirs = apkDir.listFiles()

List apkFiles = new ArrayList<>()

for (int i = 0; i < channelDirs.length; i++) {

File channelDir = channelDirs[i]

ApkFile apkFile = new ApkFile()

apkFile.channel = channelDir.name

File[] files = new File(channelDir, "/" + buildType).listFiles()

if (files == null || files.length == 0) {

continue

}

File lastFile = files[files.length - 1]

if (!lastFile.name.endsWith(".apk")) {

continue

}

apkFile.file = lastFile

apkFiles.add(apkFile)

}

return apkFiles

}

/**

* 360加固

* @param apk 加固的原始apk File

* @param outputPath 输出目录

* @param channel 原始渠道(baidu,yyb,...)

*/

def reinforce(apk, outputPath, channel) {

println "reinforce apk:" + apk

//jiagu.db中缓存了多渠道信息,如果不删除会合并到当前多渠道配置

def db = new File(BASE + "jiagu.db")

if (db.exists()) {

if (!db.delete()) {

throw new RuntimeException("delete jiagu.db failure!")

}

}

exec {

commandLine "powershell", "java -jar", JAR, "-login", NAME, PASSWORD

}

exec {

commandLine "powershell", "java -jar", JAR, "-importsign", KEY_PATH, KEY_PASSWORD, ALIAS, ALIAS_PASSWORD

}

exec {

commandLine "powershell", "java -jar", JAR, "-showsign"

}

exec {

commandLine "powershell", "java -jar", JAR, "-importmulpkg", CHANNEL_CONFIG + "template_" + channel + ".txt"

}

exec {

commandLine "powershell", "java -jar", JAR, "-showmulpkg"

}

exec {

commandLine "powershell", "java -jar", JAR, "-jiagu", apk, outputPath, "-autosign", "-automulpkg"

}

}

/**

* 删除一些临时文件

* @param outputDir apk保存目录

*/

def filterApk(File outputDir) {

println "*************** filter apk ***************"

File[] files = outputDir.listFiles()

for (int i = 0; i < files.length; i++) {

File file = files[i]

String fileName = file.getName()

if (fileName.endsWith("jiagu_sign.apk") || fileName.endsWith("temp.apk")

|| !fileName.endsWith("_sign.apk")) {

file.delete()

}

}

}

/**

* 修改所有apk文件名

* @param outputDir apk保存目录

*/

def renameApk(File outputDir) {

println "*************** rename apk ***************"

File[] files = outputDir.listFiles()

for (int i = 0; i < files.length; i++) {

File file = files[i]

String fileName = file.getName()

String[] prefixArr = fileName.split("-")

String[] suffixArr = fileName.split("_")

String rename = prefixArr[0] + "-" + prefixArr[1] +

"-" + (i + 1) + "-" + suffixArr[suffixArr.length - 2] + ".apk"

file.renameTo(file.getParent() + "/" + rename)

println "rename apk: " + fileName + " --> " + rename

}

}

/**

* zip压缩apk保存目录,生成 build/outputs/release/pccb-x.x.x.zip

* @param outputDir apk保存目录

*/

def compressDir(File outputDir) {

println "*************** compress apk output dir ***************"

File zipFile = new File(outputDir.getParent() + "/" + outputDir.getName() + ".zip")

if (zipFile.exists()) {

zipFile.delete()

}

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))

File[] files = outputDir.listFiles()

for (int i = 0; i < files.length; i++) {

File file = files[i]

byte[] bf = new byte[8192]

FileInputStream fis = new FileInputStream(file)

zos.putNextEntry(new ZipEntry(file.getName()))

int len

while ((len = fis.read(bf)) > 0) {

zos.write(bf, 0, len)

}

zos.flush()

fis.close()

}

zos.close()

}

//构建发布到生产环境的所有渠道apk,生成压缩文件 pccb-x.x.x.zip

task packageRelease {

dependsOn("assembleRelease")

doLast {

List apkFiles = findApkFiles("release")

if (apkFiles.size() == 0) {

throw new RuntimeException("no apk files has found!")

}

String[] nameSlice = apkFiles.get(0).file.name.split("-")

File outputDir = new File(OUTPUT_PATH + nameSlice[0] + "-" + nameSlice[1])

if (outputDir.exists()) {

if (!outputDir.delete()) {

throw new RuntimeException("delete outputDir failure!")

}

} else {

if (!outputDir.mkdirs()) {

throw new RuntimeException("make outputDir failure!")

}

}

for (int i = 0; i < apkFiles.size(); i++) {

ApkFile apkFile = apkFiles.get(i)

reinforce(apkFile.file, outputDir.getPath(), apkFile.channel)

}

filterApk(outputDir)

renameApk(outputDir)

compressDir(outputDir)

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值