范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Android热修复框架设计Gradle自动化多渠道打包

  Gradle 是什么
  Gradle 是 依赖管理 + 构建工具。它继承了 Ant 的灵活和 Maven 的生命周期管理,它最后被 google 作为了 Android 御用管理工具。它最大的区别是不用 XML 作为配置文件格式,采用了DSL格式,使得脚本更加简洁。 Ant 是最早的构建工具,基于 idea,好象是2000年有的,当时是最流行 java 构建工具,不过它的 XML 脚本编写格式让 XML 文件特别大。对工程构建过程中的过程控制特别好。 Maven 它是用来给 Ant 补坑的,Maven 第一次支持了从网络上下载的功能,仍然采用 xml 作为配置文件格式,它的问题是不能很好的相同库文件的版本冲突。Maven 专注的是依赖管理,构建神马的并不擅长。 构建工具 是什么 单个源码文件,你可以很轻松地 javac、gcc。然而项目结构复杂的时候,从源代码到实际产出的生成物之间需要经过一些列的转换操作,比如说编译、打包。而这一整个完整的过剩叫做"构建"。 Maven 的主要功能主要分为5点,分别是依赖管理系统、多模块构建、一致的项目结构、一致的构建模型和插件机制。 gradle相关基础
  gradle脚本插件的引用apply from: "${project.rootDir}/packers.gradle"局部变量def dest = "A"扩展属性使用ext扩展块,一次扩展多个属性 ext { account = "XXXX" password = "XXXXX" }字符串相关单引号不支持插值 def name = ‘张三’ 双引号支持插值 def name = "我是${‘张三’}" 三个单引号支持换行 def name = """ 张三 李四 """可有可无的圆括号// 这两种写法等价 println(‘A’) println ‘A’闭包作为方法的最后一个参数repositories { println "A" } repositories() { println "A" } repositories({println "A" })task依赖task B { // TaskB依赖TaskA,故会先执行TaskA dependsOn A //其次执行packersRelease doLast { println "B" } }task排序//taskB必须总是在 taskA 之后运行, 无论 taskA 和 taskB 是否将要运行 taskB.mustRunAfter(taskA) //没有msut那么严格 taskB.shouldRunAfter (taskA)文件定位// 使用一个相对路径 File configFile = file(‘src/config.xml’) // 使用一个绝对路径 configFile = file(configFile.absolutePath) // 使用一个项目路径的文件对象 configFile = file(new File(‘src/config.xml’))`文件遍历// 对文件集合进行迭代 collection.each {File file -> println file.name }文件复制重命名copy { from 源文件地址 into 目标目录地址 rename("原文件名", "新文件名字") }代码示例自动下载360加固保,也可以自己下载然后放到根目录 */ def download360jiagu() { // 下载360压缩包 File zipFile = file(packers["zipPath"]) if (!zipFile.exists()) { if (!zipFile.parentFile.exists()) { zipFile.parentFile.mkdirs() println("packers=create parentFile jiagu ${zipFile.parentFile.absolutePath}") }// 加固保的下载地址def downloadUrl = isWindows() ? packers["jiagubao_windows"] : packers["jiagubao_mac"] // mac自带curl命令 windows需要下载curl安装 def cmd = "curl -o ${packers["zipPath"]} ${downloadUrl}" println cmd cmd.execute().waitForProcessOutput(System.out, System.err) } File unzipFile = file(packers["unzipPath"]) if (!unzipFile.exists()) {//解压 Zip 文件ant.unzip(src: packers["zipPath"], dest: packers["unzipPath"], encoding: "GBK") println "packers=unzip 360jiagu’//将解压后的文件开启读写权限,防止执行 Jar 文件没有权限执行,windows若没有权限需要自己手动改if (!isWindows()) { def cmd = "chmod -R 777 ${packers["unzipPath"]}" println cmd cmd.execute().waitForProcessOutput(System.out, System.err) } } }打一个release包
  gradle其实为我们提供了一系列相关的任务,如下图
  我们执行加固前是需要拿到一个release包的,所以我们可以利用assembleRelease在加固前先执行assembleRelease这个Task。  task packersNewRelease { group ‘packers’ //可以利用task的依赖关系先执行打包 dependsOn ‘assembleRelease’ } 自动执行加固
  所谓自动执行加固,无非就是几行命令,360加固保提供了一套命令行进行加固
  特别提醒,此处360配置可选项的增强服务有bug,已经跟官方沟通,他们需要在下个版本修复,当前存在bug的版本3.2.2.3(2020-03-16),命令行目前无法只选择盗版监测 /**  对于release apk 进行360加固 */ def packers360(File releaseApk) { println ‘packers=beginning 360 jiagu’ def packersFile = file(app["packersPath"]) if (!packersFile.exists()) { packersFile.mkdir() } exec { // 登录360加固保 executable = ‘java’ args = [’-jar’, packers["jarPath"], ‘-login’, packers["account"], packers["password"]] println "packers=import 360 login’ } exec { // 导入签名信息 executable = ‘java’ args = [’-jar’, packers["jarPath"], ‘-importsign’, signing["storeFile"], signing["storePassword"], signing["keyAlias"], signing["keyPassword"]] println ‘packers=import 360 sign’ } exec { // 查看360加固签名信息 executable = ‘java’ args = [’-jar’, packers["jarPath"], ‘-showsign’] println "packers=show 360 sign’ } exec { // 初始化加固服务配置,后面可不带参数 executable = ‘java’ args = [’-jar’, packers["jarPath"], ‘-config’] println ‘packers=init 360 services’ } exec { // 执行加固,然后自动签名,若不采取自动签名,需要自己通过build-tools命令自己签名 executable = ‘java’ args = [’-jar’, packers["jarPath"], ‘-jiagu’, releaseApk.absolutePath, app["packersPath"], ‘-autosign’] println "packers=excute 360 jiagu’ } println "packers=360 jiagu finished’ println "packers=360 jiagu path ${app["packersPath"]}" }自动签名
  关于自动签名,其实360在加固的时候提供了自动签名的配置选项,如果你不想将签名文件上传给360,在加固后可以自己选择手动签名,因为这涉及到安全性的问题,此版本我采取的是360自动签名,如果大家想自己手动签名,下面我给出一套方案,主要是利用 zipalign 和 apksigner命令 他们都是位于SDK文件中的build-tools目录中,我们执行自动化签名需要gradle配置好路径。 对齐未签名的apk zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk 使用你的私钥为apk签名 apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk 验证apk是否已经被签名 apksigner verify my-app-release.apk 基于加固Apk自动实现多渠道
  关于多渠道打包,我们之前项目一直使用的是腾讯的VasDolly,故我们此次是采取VasDolly命令,但是需要先下载VasDolly.jar,至于放在什么位置没有要求,只需要gradle配置好路径即可,我直接是放在项目根目录。也可以使用360的多渠道加固,实际上整套都可以使用360加固提供的命令。
  腾讯channel重新构建渠道包 */ def reBuildChannel() { File channelFile = file("${app["channelPath"]}/new") if (!channelFile.exists()) { channelFile.mkdirs() } def cmd = "java -jar ${app["vasDollyPath"]} put -c ${"…/channel.txt"} ${outputpackersApk()} ${channelFile.absolutePath}" println cmd cmd.execute().waitForProcessOutput(System.out, System.err) println ‘packers===excute VasDolly reBuildChannel’ }敏感信息存取
  我们都知道,签名需要签名文件,密码、别名等等文件,360加固需要配置账号与密码,这些都属于敏感信息,google官方不建议直接放在gradle中,它是以纯文本记录在gradle中的,建议存储在properties文件中。 // 把敏感信息存放到自定义的properties文件中 def propertiesFile = rootProject.file("release.properties ") def properties = new Properties() properties.load(new FileInputStream(propertiesFile))  ext {// 签名配置signing = [keyAlias : properties[‘RELEASE_KEY_ALIAS’], keyPassword : properties[‘RELEASE_KEY_PASSWORD’], storeFile : properties[‘RELEASE_KEYSTORE_PATH’], storePassword: properties[‘RELEASE_STORE_PASSWORD’] ]// app相关的配置app = [//默认release apk的文件路径,因为加固是基于release包的releasePath : "p r o j e c t . b u i l d D i r / o u t p u t s / a p k / r e l e a s e " , / / 对 r e l e a s e a p k 加 固 后 产 生 的 加 固 a p k 地 址 p a c k e r s P a t h : " {project.buildDir}/outputs/apk/release", //对release apk 加固后产生的加固apk地址 packersPath : "project.buildDir/outputs/apk/release",//对releaseapk加固后产生的加固apk地址packersPath:"{project.buildDir}/outputs/packers", //加固后进行腾讯多渠道打包的地址 channelPath : "${project.buildDir}/outputs/channels", //腾讯VasDolly多渠道打包jar包地址 vasDollyPath: "…/VasDolly.jar" ]// 360加固配置packers = [account : properties[‘ACCOUNT360’], //账号 password : properties[‘PASSWORD360’], //密码 zipPath : "p r o j e c t . r o o t D i r / j i a g u / 360 j i a g u . z i p " , / / 加 固 压 缩 包 路 径 u n z i p P a t h : " {project.rootDir}/jiagu/360jiagu.zip", //加固压缩包路径 unzipPath : "project.rootDir/jiagu/360jiagu.zip",//加固压缩包路径unzipPath:"{project.rootDir}/jiagu/360jiagubao/", //加固解压路径 jarPath : "p r o j e c t . r o o t D i r / j i a g u / 360 j i a g u b a o / j i a g u / j i a g u . j a r " , / / 执 行 命 令 的 j a r 包 路 径 c h a n n e l C o n f i g P a t h : " {project.rootDir}/jiagu/360jiagubao/jiagu/jiagu.jar", //执行命令的jar包路径 channelConfigPath: "project.rootDir/jiagu/360jiagubao/jiagu/jiagu.jar",//执行命令的jar包路径channelConfigPath:"{project.rootDir}/jiagu/Channel.txt", //加固多渠道 jiagubao_mac : "https://down.360safe.com/360Jiagu/360jiagubao_mac.zip", //加固mac下载地址 jiagubao_windows : "https://down.360safe.com/360Jiagu/360jiagubao_windows_64.zip" //加固widnows下载地址 ]自动上传到服务器
  这个功能准备在下篇文章更新,我们可以通过curl命令上传到自己的服务器,如果你在测试阶段可以上传到蒲公英或者fir.im托管平台,目前他们都提供了相关的操作方式,这样基本上整个自动化的目的就完成了,当然你也可以选择Jenknis自动化构建、打包及上传。
  发布应用到fir.im托管平台 入口 方式一:fir-CLI 命令行工具上传 $ fir p path/to/application -T YOUR_FIR_TOKEN
  方式二:API 上传 通过curl命令调用相关的api 1.获取凭证 curl -X "POST" "http://api.bq04.com/apps" -H "Content-Type: application/json" -d "{"type":"android", "bundle_id":"xx.x", "api_token":"aa"}"
  2.上传apk curl -F "key=xxxxxx" -F "token=xxxxx" -F "file=@aa.apk" -F "x:name=aaaa" -F "x:version=a.b.c" -F "x:build=1" -F "x:release_type=Adhoc"  #type=ios 使用 -F "x:changelog=first" https://up.qbox.me
  发布应用到蒲公英 入口 curl -F "file=@/tmp/example.ipa" -F "uKey=" -F "_api_key=" https://upload.pgyer.com/apiv1/app/upload
  整体效果
  我们的需求是需要打两批包,用于老后台与新后台,老后台的包必须加上app-前缀,所以有三个任务packersNewRelease执行正常的加固打包用于新后台,packersOldRelease用于打包加前缀app-名称用于老后台,packersRelease这个任务用于一键同时打包成老后台与新后台。
  同时可以在gradle控制台查看打包任务的输出日志,如下:
  gradle自动化源码
  为了能够让大家尝试自动化gradle脚本带来的便利之处,下面我贡献上自己的整个gradle源码,需要的可以拿走去研究,如存在问题也希望多多交流。 /**  @author hule @date 2020/04/15 13:42 description:360自动加固+Vaslloy多渠道打包 */// 把敏感信息存放到自定义的properties文件中def propertiesFile = rootProject.file("release.properties") def properties = new Properties() properties.load(new FileInputStream(propertiesFile))  ext {// 签名配置signing = [keyAlias : properties[‘RELEASE_KEY_ALIAS’], keyPassword : properties[‘RELEASE_KEY_PASSWORD’], storeFile : properties[‘RELEASE_KEYSTORE_PATH’], storePassword: properties[‘RELEASE_STORE_PASSWORD’] ]// app相关的配置app = [ //默认release apk的文件路径,因为加固是基于release包的 releasePath : "p r o j e c t . b u i l d D i r / o u t p u t s / a p k / r e l e a s e " , / / 对 r e l e a s e a p k 加 固 后 产 生 的 加 固 a p k 地 址 p a c k e r s P a t h : " {project.buildDir}/outputs/apk/release", //对release apk 加固后产生的加固apk地址 packersPath : "project.buildDir/outputs/apk/release",//对releaseapk加固后产生的加固apk地址packersPath:"{project.buildDir}/outputs/packers", //加固后进行腾讯多渠道打包的地址 channelPath : "${project.buildDir}/outputs/channels", //腾讯VasDolly多渠道打包jar包地址 vasDollyPath: "…/VasDolly.jar" ]// 360加固配置packers = [account : properties[‘ACCOUNT360’], //账号 认release apk的文件路径,因为加固是基于release包的 releasePath : "p r o j e c t . b u i l d D i r / o u t p u t s / a p k / r e l e a s e " , / / 对 r e l e a s e a p k 加 固 后 产 生 的 加 固 a p k 地 址 p a c k e r s P a t h : " {project.buildDir}/outputs/apk/release", //对release apk 加固后产生的加固apk地址 packersPath : "project.buildDir/outputs/apk/release",//对releaseapk加固后产生的加固apk地址packersPath:"{project.buildDir}/outputs/packers", //加固后进行腾讯多渠道打包的地址 channelPath : "${project.buildDir}/outputs/channels", //腾讯VasDolly多渠道打包jar包地址 vasDollyPath: "…/VasDolly.jar" ]// 360加固配置packers = [account : properties[‘ACCOUNT360’], //账号文末
  以上步骤的前提是你需要配置好Gradle运行环境、熟悉Gradle的基本命令以及必要的耐心和不怕失败的勇气。
  深入Android架构学习,可以私信我,发送"核心笔记"或"手册",即可获取Android架构相关学习路线及相套的学习资料!

爱奇艺会员涨价,价格几乎追平优酷腾讯专家要有好内容才能留住会员时隔一年,爱奇艺(IQ。US)会员再次涨价,最低价格为25元。红星资本局发现,爱奇艺不含电视端的黄金会员涨价后,各套餐价已追平优酷腾讯。近年来,会员涨价已成为各长视频平台的常态化操甘肃建科技专家库鼓励银发族入企服务图为甘肃机器人表演。(资料图)高展摄中新网兰州12月17日电(闫姣)记者17日从甘肃省科技厅获悉,甘肃灵活运用银发族力量,通过搭服务对接平台,助力企业科技创新科技成果转化和人才培养2023款领克06RemixPHEVPro版售价16。68万元2023款领克06新能源RemixPHEVPro版指导价16。68万元作为一款插电式混动小型SUV值不值得买呢本文实拍详细解读外观部分领克家族式设计语言造型时尚标配后泊车雷达全系没睿蓝9正式上市车身售价10。9912。99万中国网汽车12月17日讯换电轻出行普及者睿蓝汽车旗下可充可换大SUV引领者睿蓝9正式上市。新车共推出风尚版引领版创始版旗舰版4款配置车型,补贴后车身价格为10。9912。99万元。华为高端系列不再贵,Mate50系列全系破发,512GB跌1200元!今年下半年,可以说是华为的春天了。因为华为召开了多场发布会,甚至加起来的数量都要比之前的总和还要多,也推出了不少的新品,收获了大家的肯定和好评。而且这也表明,华为解决了自己的生产线11月SUV销量排行自主9车霸榜围攻合资,极氪001哪吒V成黑马临近年底,对于各行各业而言,都希望在有限的时间内放出最大的促销力度吸引消费,冲击既定的销量任务,汽车行业也不例外。从车企在双11购物节中的参与度不难看出,促销政策和力度是相当激进的一带一路全球行中非合作真实亲诚视频加载中蒙内铁路,连接肯尼亚首都内罗毕和东非第一大港口蒙巴萨,全长约480公里,是一条采用中国标准中国技术中国装备建造的现代化铁路。蒙内铁路宛如大动脉,加快了肯尼亚现代化步伐,也广东江门富豪榜大洗牌,首富宝座再次易主,三位女老板齐上榜素有中国第一侨乡美誉的江门市位于广东省中南部,地处珠江三角洲西翼,是珠三角西岸重要的交通枢纽城市,同时也是粤港澳大湾区的节点城市。江门历史悠久,自古人杰地灵,是广府文化的重要发祥地乌鲁木齐将全面恢复市民集市石榴云新疆日报讯(记者胡大敏报道)全面恢复市民集市(含早夜市)分时步行街等新型业态的设摊经营活动12月16日发布的乌鲁木齐市促进消费工作方案(以下简称方案)中提到,2023年,乌市时间定了!油价将迎今年最后一调12月19日24时,国内新一轮成品油调价窗口将开启。本轮调价将是2022年国内油价最后一调。新华社石油价格系统发布的数据显示12月15日一揽子原油平均价格变化率为6。59。据此测算蓬江区省级预制菜产业园揭牌动工签约,总投资超120亿元南都讯鲍汁佛跳墙矶烧金蚝,鲍鱼花胶港式盆菜启动仪式现场,侨都预制菜产品展示区有众多饱含侨乡特色,充满浓郁年味侨味的预制菜产品。12月16日,江门市蓬江区省级预制菜产业园揭牌动工(签
跟队拉比奥要求1000万年薪1000万签字费,续约几乎不可能根据尤文图斯跟队记者NicolaBalice的报道,尤文将在近期与拉比奥商谈续约,但由于球员的经济要求非常高,想要达成协议几乎是不可能的。这篇报道中提到,尤文与拉比奥一直保持着联系为何球队不如预期?里德我们知道为什么,我们能扭转局势森林狼以104116不敌活塞。赛后,森林狼球员纳兹里德接受媒体采访,谈到了球队现在挣扎的表现。你们是否也不知道为什么球队会表现得如此的不如预期?记者问里德。不是的。我们知道,我们知终结5连败!奎克利27分,兰德尔3512!火箭20分惨败,戈登心寒了NBA常规赛如火如荼,2连败的火箭队坐镇主场,迎来了5连败的尼克斯队的挑战,全场战罢,尼克斯队以10888大胜火箭队!两队首发火箭队杰伦格林小凯文波特贾巴里史密斯戈登和费尔南多。尼幸福的烦恼!勇士仅剩一人正式名额,杰罗姆兰姆该选谁?随着赛季的深入,勇士的两名双向合同球员杰罗姆和兰姆逐渐发光发彩,杰罗姆场均可以得到7。2分1。7篮板2。4助攻,兰姆场均5。9分3。1篮板1。6助攻。但勇士的15人大名单已经只剩一石油储量还有多少?来看看世界上十大石油储量国石油也被称为液体黄金,是世界主要行业中最重要的商品之一。全球每天的石油消费量高达9500万桶,用于家庭供暖系统汽车运输,甚至电力。然而,你有没有想过这些液体黄金主要是从哪里来的,还女排二传姚迪出国助力朱婷?意大利媒体消息被球迷热议,揭秘蹊跷头条创作挑战赛近日关于中国女排二传姚迪即将赴意大利打球的消息充斥网络。这是由一则意大利媒体发布的消息翻译而来。大意是朱婷所效力的斯坎迪奇女排将招入天津女排二传姚迪。这则非官方的消息2022年年度西甲积分榜巴萨83分榜首皇马78分第二马竞69分第三直播吧1月1日讯2022年已经结束,德转网站对西甲联赛2022年年度积分榜进行了统计,巴萨积83分排名榜首,皇马78分为列次席,马竞69分排名第三,西班牙人29分排名第17名,是出世界杯,救不了东鹏特饮我累我累,我困我困,累了困了喝东鹏特饮!靠着世界杯期间的魔性洗脑广告,能量饮料第一股东鹏饮料,在万千球迷面前又狠狠刷了一波存在感。如果世界杯期间你看了央视的转播,相信对于持续霸屏的泰国成立RCEP中心!29000种产品实现零关税,前11个月中泰贸易额超6700亿元视频加载中(央视财经天下财经)泰国是最早发起RCEP(区域全面经济伙伴关系协定)谈判的东盟十国之一。眼下,就在RCEP正式生效一周年之际,泰国商业部将原有的自由贸易协定中心正式升级盘点2022我最喜欢的十部韩剧一我的解放日志首播20220409(韩国)该剧讲述了廉家三姊兄妹和外地人具氏,他们的人生达到极限,共同寻找逃离当下的解放生活故事。由李民基金智媛孙锡久李艾儿等主演。二财阀家的小儿子50岁杨坤被曝新恋情!带美女吃饺子满面红光,身材粗壮坐姿霸气12月30日,有八卦媒体在社交平台上晒出一组有关杨坤的照片,可以看出当天杨坤身边跟着一位美女,两人显得也是比较亲密,不知道是不是情侣关系,对此也是引来广大网友们的热议。从视频中来看