美文网首页程序猿学习Android知识cocos creator
基于Walle的多渠道快速打包自动脚本

基于Walle的多渠道快速打包自动脚本

作者: 夕枫晚照 | 来源:发表于2017-06-20 21:16 被阅读1300次

    Walle的项目链接:https://github.com/Meituan-Dianping/walle

    前言

    最近项目的渠道包越来越多,传统的多渠道打包方式十分缓慢,基本一分钟一个包,十几个渠道的时候还能忍受十几分钟,但是几十个包1个小时这种打包速度实在无法接受。于是在网上找了一下再写入的打包方式,看到了美团的解决方案。
    因为自己的项目里用到了360加固,很自然的中招了,顺着去看美团的加固后失效的解决方案
    http://18e0c209.wiz01.com/share/s/0oUc890scQDx2tkMAj02NI0c3Ubmms31ckdr2UwE0E2X-bzY
    十分感谢itang的热心整理。本文的内容就是根据上面这篇文章编写的自动化脚本。

    目的

    为了解决使用Walle打包同时使用360或者其他三方加固的问题,根据上面的链接我们需要在打包时需要如下步骤:

    1.使用AS进行普通的打包 打包后生成apk为未加固版

    2.打开360加固助手或者使用网页进行加固,此时不需要签名
    加固后的apk文件假设为C:\Users\app225.apk

    3.进行zipalign压缩对齐 得到app_nosign.apk
    具体操作为:命令行输入(我的sdk在F盘)zipalign -v 4 [apk路径] [生成的apk路径]
    F:\sdk\build-tools\25.0.3>zipalign -v 4 C:\Users\app225.apk C:\Users\app_nosign.apk

    4.对app_nosign.apk进行签名 apksigner sign --ks [keystore路径] [apk路径]
    F:\sdk\build-tools\25.0.3>apksigner sign --ks C:\Users\xxxx.jks C:\Users\app_nosign.apk

    5.检查是否使用V2签名 java -jar CheckAndroidV2Signature.jar [apk路径]
    java -jar C:\Users\CheckAndroidV2Signature.jar C:\Users\app_nosign.apk

    6.写入渠道信息
    写入一个渠道
    java -jar walle-cli-all.jar put -c [渠道名] [apk路径]
    java -jar walle-cli-all.jar put -c [渠道名] [apk路径] [生成的apk路径(可选)]
    java -jar walle-cli-all.jar put -c yingyongbao C:\Users\app_nosign.apk
    批量写入渠道(生成的文件写入到apks目录下)
    java -jar walle-cli-all.jar batch -f [渠道文件] [apk路径] [生成的新apk路径(可选)]
    java -jar walle-cli-all.jar batch -f C:\Users\channel C:\Users\app_nosign.apk C:\Users\apks

    7.显示当前apk中的渠道和额外信息
    java -jar walle-cli-all.jar show [apk路径]

    经过一番在命令行中的折腾之后,终于搞定了。虽然完成了任务,但是实在太麻烦了,于是打算把这些全部封装成一个批处理。

    批处理

    预想的目标是做一个工具包,将apk文件拖到批处理bat文件上,就自动对apk进行渠道打包前面,然后在apks文件夹输出。

    准备工作

    一些命令的收集:
    获取自身所在路径set mypath=%~dp0
    获取拖入文件路径set filepath=%~dp1
    设定的临时文件目录 当前工具包路径/cache
    调用其他批处理文件 CALL

    初步完成

    初步的按照上面的方案完成代码

    @echo off
    @set mypath=%~dp0
    @set filepath=%~dp1
    @echo %filepath%
    @echo %mypath%cache
    
    @rd /s/q %mypath%cache
    
    @md %mypath%cache
    @md %mypath%cache\apks
    
    @call %mypath%lib\zipalign -v 4 %~1 %mypath%cache\app_nosign.apk
    
    @call java -jar %mypath%lib\apksigner.jar sign --ks [keystore路径xxxx] --ks-key-alias [key名xxxx] --ks-pass pass:[keystore密码xxxx]  --key-pass pass:[key密码xxxx] --out %mypath%cache\app_sign.apk %mypath%cache\app_nosign.apk
    
    @call java -jar %mypath%lib\CheckAndroidV2Signature.jar %mypath%cache\app_sign.apk
    
    @call java -jar %mypath%lib\walle-cli-all.jar batch -f %mypath%channel %mypath%cache\app_sign.apk %mypath%cache\apks
    

    通用性优化

    上一步代码的问题是keystore完全是写死到里面的,无法修改也不够灵活,于是改为使用config.ini配置文件配置参数,批处理读取的方法,同时将生成的文件改为和输入文件的文件名相关的模式。
    这里遇到个问题:读入参数里含有中文和特殊符号(自己作死keystore名称写成中文了,还带有特殊符号),需要如果是写死到批处理文件中,那么需要使用ascii编码保存,如果是配置文件则要将配置文件保存成ascii编码。

    @echo off
    @set mypath=%~dp0
    @set filepath=%~dp1
    @echo %filepath%
    @echo %mypath%cache
    
    @set filename=%~n1
    
    @CALL lib/readconfig keyAlias keyAliasValue
    @CALL lib/readconfig storeFile storeFileValue
    @CALL lib/readconfig storePassword storePasswordValue
    @CALL lib/readconfig keyPassword keyPasswordValue
    
    @rd /s/q %mypath%cache
    
    @md %mypath%cache
    @md %mypath%cache\apks
    
    @call %mypath%lib\zipalign -v 4 %~1 %mypath%cache\%filename%_nosign.apk
    
    @call java -jar %mypath%lib\apksigner.jar sign --ks %storeFileValue% --ks-key-alias %keyAliasValue% --ks-pass pass:%storePasswordValue%  --key-pass pass:%keyPasswordValue% --out %mypath%cache\%filename%_sign.apk %mypath%cache\%filename%_nosign.apk
    
    @call java -jar %mypath%lib\CheckAndroidV2Signature.jar %mypath%cache\%filename%_sign.apk
    
    @call java -jar %mypath%lib\walle-cli-all.jar batch -f %mypath%channel %mypath%cache\%filename%_sign.apk %mypath%cache\apks
    

    拓展方案

    这个方案的实质是要使用自动化的方式调用几个命令,完成文件生成,所以还可以采用其他的自动化脚本方案。这里试验了一下使用Python完成上述任务,不过被字符集问题困扰没有完成。试验的代码也放到demo的beta文件夹下了。类似的还可以考虑使用gulp.js或者Java的Jenkins,和Android关系紧密的Gradle应该也能完成。

    实际demo和工具类

    https://github.com/HortonGou/packtool

    感谢郭神能通过我的投稿,感谢公众号评论中的热心建议,当时写这个主要是为了满足推广时繁多推广渠道统计,并且使用v2签名。至于跨平台的问题,在考虑写个py版吧,主要逻辑还是基于几个java命令的调用

    相关文章

      网友评论

        本文标题:基于Walle的多渠道快速打包自动脚本

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