theme: channing-cyan
知识储备
首先需要知道V1,V2,V3签名的区别,可以参考之前的文章:AndroidV1,V2,V3签名原理详解
前言:一般开发者会指定使用自己创建的证书,如果没有指定,则会默认使用系统的证书,该默认的证书存储在C:Usersadmin.androiddebug.keystore,不同的电脑可能安装不同路径。一个签名证书文件中,是包含一对公私钥,用私钥对apk进行签名,在安装到android手机时,系统会使用证书中对应签名私钥的公钥来验证,查看apk是否被更改过,如果没有则可以安装在手机上。任何的app store都不允许使用默认的debug.keystore打包的apk发布上去,因为debug.keystore的密码是默认的,不安全。 一,没有签名的APK无法安装 Android的APK要进行签名才能够安装到手机上,这是因为在安装的时候系统会进行检测,平时我们直接点AS里面那个绿色的运行按钮也能够直接安装到手机上,这是因为其实它也进行了签名,只不过AS自动帮我们做了这个操作有个默认的签名
大致流程
- 找到assembleRelease生成的app-release.apk
- 在assembleRelease后面新建Task处理apk包
- 对这个apk进行加固
- 对这个apk进行多渠道打包
- 对多渠道的apk重新签名 360加固宝
命令行
登录
-jar jiagu.jar –login <username><password>
导入签名
java -jar jiagu.jar -importsign <keystore_path> <keystore_password> <alias>
导入渠道列表文件 java -jar jiagu.jar -importmulpkg <mulpkg_path>
加固 多渠道打包
java -jar jiagu.jar -jiagu <inputAPKpath> <outputpath> -autosign -automulpkg
找到assembleRelease生成的app-release.apk
代码语言:javascript复制findReleaseApkPath = { ->
def appBuildOutPut = new File("${rootProject.rootDir}/app/build/outputs/apk/release")
def apkFile = null
appBuildOutPut.eachFile {
if (it.name.endsWith(".apk") && it.name.contains("release")) {
println(it)
apkFile = it
}
}
return apkFile
}
处理apk包
代码语言:javascript复制/**
* 通过调用360的命令行加固并且多渠道打包
* 参数:
* apk -> 原有release包的文件
* outputPath -> 多渠道打包后文件输出路径
*/
reinForceApk = { File apk, File outPutPath ->
println(outPutPath)
if (apk == null || !apk.exists()) {
println("没有找到apk文件")
throw new FileNotFoundException("没有找到APK文件")
}
if (!outPutPath.exists()) {
outPutPath.mkdirs()
}
//360加固和多渠道打包命令行
java -jar ${rein360ForceJarPath} -login ${account360}
${psw360}".execute().waitForProcessOutput(System.out, System.err)
"java -jar ${rein360ForceJarPath} -importmulpkg
${mulpkgPath}".execute().waitForProcessOutput(System.out, System.err)
"java -jar ${rein360ForceJarPath} –importsign ${keyStorePath} ${KEYSTORE_PASSWORD}
${KEY_ALIAS} ${KEY_PASSWORD}".execute().waitForProcessOutput(System.out, System.err)
"java -jar ${rein360ForceJarPath} -config -
analyse".execute().waitForProcessOutput(System.out, System.err)
"java -jar ${rein360ForceJarPath} -jiagu ${apk.path} ${outPutPath.path} -autosign -
automulpkg".execute().waitForProcessOutput(System.out, System.err)
}
将处理apk的task写到输出release包后的task上
代码语言:javascript复制task assembleReinForceRelease() {
group 'multipleChannels'
dependsOn('assembleRelease')
doLast {
def apk = findReleaseApkPath()
def outputFile = new File(reinForcedOutPutPath)
reinForceApk(apk, outputFile)
}
}
之后使用gradle命令运行assembleReinForceRelease这个task即可,这个task依赖于assembleRelease任务,所以打release的task会先执行,执行完后获取apk的地址然后调用360的加固和多渠道打包命令行将处理后的apk输出到一个文件中,之后交由测试即可。