公司开发的应用,有至关一部分被破解,出现了各类所谓的纯净版、破解版、无广告版,对于公司的商业化形成了不利影响,通过调研,决定采起360加固的方案。java
可是有个问题,公司外发的应用每每须要多个渠道,加固以后的apkwalle打的渠道号以及签名会丢失,须要从新签名,打渠道,比较耗时耗力,做为一名爱搞事情的程序员,这种复杂重复的工做就应该交给机器去处理,相似这种工做,python每每是不二选择。python
经过360加固官网知道,加固工具分为windows、mac、以及linux版本,并且加固分为登陆360加固保帐号而后加固两个步骤。我这里安装的是win版本,安装以后的目录结构以下图:linux
这里面有咱们执行加固命令的环境,经过网上各类水,终于找到了360加固的命令,这就为咱们python自动化加固提供了可能(这步是关键,耗费了我至关一部分的时间),上面提到加固分为登陆以及加固步骤,因此命令也分两条:程序员
登陆:java -jar -Dfile.encoding=UTF-8 jiagu_jar_path -login 用户名 密码shell
加固: java -jar -Dfile.encoding=UTF-8 jiagu_jar_path -jiagu apk_path apk_out_pathwindows
通过一番各类调试修改,在本地经过cmd执行命令成功以后,再经过python执行也成功了,接下来部署到jenkins服务器,你觉得这样就OK了么?噩梦才刚刚开始,在本地调通的python脚本部署到jenkins上始终运行不成功,也没有任何日志,一开始还觉得我本地安装的是pyhon3.0,而jenkins是2.0的缘由,结果我本地安装2.0以后,本地仍是正常的。就在一筹莫展的时候,钊哥提出是否是jenkins是linux平台,而我上传的360加固环境是基于windows的,结果替换以后果真一切正常了,反正总而言之是能够了。bash
接下来说讲怎么使用,公司的外发项目设计到多渠道walle打包的都有一个build.py的脚本,咱们从main函数看起,以下:服务器
if __name__ == '__main__':
options = parse_options()
path = options.origin_apk_dir
number = options.number
channels = options.channels.split(',')
spec = options.spec
walle_channel_jar = options.walle_channel_jar
print_format("APK CHANNELS")
for root, dirs, files in os.walk(path):
for file in files:
filePath = os.path.join(root, file)
if filePath.endswith(".apk"):
print "[APK CHANNELS]Start to generate channel package based on: " + filePath
start_generate(filePath, number, channels, spec, walle_channel_jar)
print "[APK CHANNELS]Channel package generation is complete."
复制代码
start_generate()函数是walle打包的入口函数,咱们只须要在这个以前把grale生成的apk加固从新签名,而后将生成好的apk做为参数walle打包就行了,以下:
app
if __name__ == '__main__':
options = parse_options()
keystore_path = options.keystore_path
print "keystore_path: " + keystore_path
ks_key_alias = options.ks_key_alias
print "ks_key_alias: " + ks_key_alias
ks_pass = options.ks_pass
print "ks_pass: " + ks_pass
key_pass = options.key_pass
print "key_pass: " + key_pass
path = options.origin_apk_dir
number = options.number
channels = options.channels.split(',')
spec = options.spec
walle_channel_jar = options.walle_channel_jar
print "jiagu_path: " + jiagu_path
print_format("APK CHANNELS")
for root, dirs, files in os.walk(path):
for file in files:
filePath = os.path.join(root, file)
if filePath.endswith(".apk"):
print "[APK CHANNELS]Start to generate channel package based on: " + filePath
index = filePath.find("debug")
#debug ingnore
if filePath.find("debug")>0:
start_generate(filePath, number, channels, spec, walle_channel_jar)
else:
#jiagu
temp_result = jiagu.jiagu(jiagu_path,"15267451420","lisj10659",filePath)
print "temp_result" + temp_result
signed_apk_path = temp_result[0:temp_result.rindex('/')] + temp_result[temp_result.rindex('/'):temp_result.rindex('.')]+"_sign.apk"
print "signed_apk_path" + signed_apk_path
#sign
sign_apk(jiagu_path,keystore_path,ks_key_alias,ks_pass,key_pass,signed_apk_path,temp_result)
#generate channel apk
start_generate(signed_apk_path, number, channels, spec, walle_channel_jar)
print "[APK CHANNELS]Channel package generation is complete."
复制代码
注意这里:
函数
keystore_path = options.keystore_path
print "keystore_path: " + keystore_path
ks_key_alias = options.ks_key_alias
print "ks_key_alias: " + ks_key_alias
ks_pass = options.ks_pass
print "ks_pass: " + ks_pass
key_pass = options.key_pass
print "key_pass: " + key_pass
复制代码
增长了四个用于签名的参数,须要在jenkins上配置,以下图:
配置内容以下:
-e ${WORKSPACE}/fasthdtv.jks -a fasthdtv -k 123456 -p 123456
分别对应gradle 签名配置中的 storeFile、keyAlias、storePassword、keyPassword,而后在main函数调用的parse_options(),进行解析以下:
main函数中调用了jiagu.jagu()以下图:
因此咱们须要在build.py的目录下新建一个jiagu.py而且定义jiagu()函数,以下:
import os
import subprocess
def jiagu(jiagu_360_dir, username, password, apk_file):
jiagu_360_jar = '{jiagu_360_dir}/jiagu.jar'.format(jiagu_360_dir=jiagu_360_dir)
print "jiagu_360_jar"+jiagu_360_jar
# login
command_login = "java -jar -Dfile.encoding=UTF-8 {jiagu_360_jar} -login {username} {password}".format(
jiagu_360_jar=jiagu_360_jar, username=username, password=password
)
print "command_login"+command_login
login_result = subprocess.call(command_login, shell=True)
# x86 com.dangbei.settingprovoder2.support
command_config_x86 = 'java -jar -Dfile.encoding=UTF-8 {jiagu_360_jar} -config -x86'.format(
jiagu_360_jar=jiagu_360_jar)
subprocess.call(command_config_x86, shell=True)
#dest dir
jiagu_tmp = apk_file[0:apk_file.rindex('/')]
subprocess.call("chmod -R 775 {jiagu_tmp}".format(jiagu_tmp=jiagu_tmp), shell=True)
#jiagu
command_jiagu = 'java -jar -Dfile.encoding=UTF-8 {jiagu_360_jar} -jiagu {apk_file} {jiagu_tmp}'.format(
jiagu_360_jar=jiagu_360_jar, apk_file=apk_file, jiagu_tmp=jiagu_tmp)
subprocess.call(command_jiagu, shell=True)
print ("***************** command_jiagu"+command_jiagu)
print ("***************** apk_file"+apk_file)
result_file = jiagu_tmp+apk_file[apk_file.rindex('/'):apk_file.rindex('.')] + "_jiagu.apk"
print ("***************** result_file"+result_file)
for tmp in os.listdir(jiagu_tmp):
if tmp.endswith(".apk"):
full_path = jiagu_tmp + "/" + tmp
print ("***************** full_path"+full_path)
os.chmod(full_path, 775)
os.rename(full_path, result_file)
#subprocess.call("rm -R {jiagu_tmp}".format(jiagu_tmp=jiagu_tmp), shell=True)
print ('[JIAGU]jiagu completed')
return result_file
def zip_align(zip_aligned_apk, origin_apk):
command_zipalign = 'zipalign -f -v 4 {origin_apk} {zip_aligned_apk}'.format(origin_apk=origin_apk,
zip_aligned_apk=zip_aligned_apk)
subprocess.call(command_zipalign, shell=True)
os.remove(origin_apk)
print ('[ZIP ALIGN]zipaligin completed')
def print_format(content):
print ("#########################################################")
print ("# -----> {content}".format(content=content))
print ("#########################################################")
#jiagu("D:/AndroidStudioProjects/fasthdtv/app/build_script/channel/jiagu","15267451420","lisj10659","D:/AndroidStudioProjects/fasthdtv/app/build/outputs/apk/debug/app-debug.apk")
复制代码
到此jenkins配置360加固脚本(python版)结束,附件为完整的buIld.py以及jiagu.py,须要的自取,根据本身的项目状况改动,手动比心!