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

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架构相关学习路线及相套的学习资料!

浪琴大眼睛飞行员计时码表这款全新计时码表的灵感来自航空业的发展与SaintImier品牌之间的历史纽带,采用钛金属轮廓和蓝如天空的表盘。自20世纪初,航空业迈出第一步,浪琴表就一直陪伴着最勇猛的人穿越天空曾可妮我的穿搭心得就是做减法搜狐时尚,赞13如果说到当下内娱中身材管理做的最出色的艺人,那么曾在选秀综艺青春有你2中与金子涵刘令姿戴燕妮一同组成限定组合172Girls的曾可妮一定很有发言权,比队名还要高出2让BLACKPINK,贝嫂沦陷的神仙美甲如果你还在为不知该更换什么美甲款式而苦恼中,不妨可以看看来自韩国的美甲师ParkEunkyung的作品,她可以说是把美甲,做成了指尖上的艺术品ParkEunkyung之所以能在云云卫衣短裙才是今秋最流行穿搭!洋气减龄又显瘦,照着穿绝了衬衫和卫衣是秋冬百搭的两件利器,但是衬衫的劣势在于它过分轻薄,天气更冷一点它只能沦为存在感不强的内搭单品了。而卫衣面料要更有厚度一点,整体版型也更加温暖,所以在秋冬卫衣单品的实穿度西装正走在日渐式微的路上您有多久没穿过西装了?每个人有不同的答案,对于我自己相信也对于很多朋友来说,上一次穿西装已经是遥远的过去了。在中国,西装,作为男士正装(某些场合下也是女装正装)已经有差不多百年时光韩国乒坛女神,穿樊振东球衣,叫樊振东东哥,想跟小胖组跨国搭档虽然是一名韩国乒乓球运动员,但田志希却对国乒队关注尤甚,接受采访时表示,国乒女队的三朵金花陈梦孙颖莎王曼昱三人,实力强大到可以冲击男子比赛的奖牌。虽然田志希说的是实话,但这话由一位勇士迎赛季三连败,卫冕冠军是不是跌入谷底了,库里空砍三双北京时间11月2日,202223赛季卫冕冠军勇士继续客场之旅,今天挑战热火队。首节,双方开始对攻,手感都不错,首节后四分钟迈阿密热火很热啊,打出一波183的攻击波,直接反超比分,斯张帅为何屡次错失创造个人历史良机?网友道出了个中原因2022年WTA125米德兰站,赛前被视为最大夺冠热门的张帅爆出大冷,首轮就惨遭淘汰。一轮游的后果是,让这位中国金花一姐再次错失了创造个人新纪录的良机。自WTA1000瓜达拉哈拉因日本武尊宣布重要决定!张沛勉这场大战有机会了11月1日,武尊在个人社交平台宣布在10月31日与K1赛事和俱乐部的合约到期后,将不再续签,就此告别K1赛场,之后他将会参加其他国家或者赛事组织的比赛,继续战斗。武尊发布消息武尊全乒乓女神原形毕露后丑闻缠身,出轨风波后续,被男友前妻告上法庭福原爱这是怎么了?是退役后的原形毕露还是遇见真爱的身不由己呢?近日,福原爱出轨门有了新进展,在34岁生日当天被现任男友的前妻一纸诉讼告上法庭。诉讼中,以福原爱写给横滨男的情书为婚外再见纳什,篮网官宣新决定,欧文逃过一劫,哈登果然赌赢了NBA常规赛越打越激烈,卫冕冠军勇士队不敌热火,库里他们遭遇三连败,勇士(3胜5负)和快船(3胜4负)这两支西部强队,战绩非常不理想。同样,东部篮网队输给公牛队之后,战绩2胜6负,
强美元周期结束?空头头寸升至16个月新高,分析师美元在短期内继续处于防守状态每经记者蔡鼎每经编辑高涵过去两周时间内,美国10月通胀显示出缓和迹象,加剧了市场有关美联储将很快放慢加息速度的猜测,美元指数从20年高点大幅下挫。据Refinitiv的数据,美元指重要通知!今晚,油价要降了央视财经根据国家发改委消息,新一轮成品油调价窗口将于今天(11月21日)24时开启。据国家发改委价格监测中心监测,本轮成品油调价周期内(11月7日11月18日)国际油价震荡下降。平2022年11月21日24时起国内成品油价格按机制下调央视网消息根据近期国际市场油价变化情况,按照现行成品油价格形成机制,自2022年11月21日24时起,国内汽柴油价格(标准品,下同)每吨分别降低175元和165元。调整后,各省(区龙虎榜中榜方新侠狂买医药,养家痴情信创,谁是渣男谁更深情?技术分析的失效,并不会说明技术的无用,而是个强烈的技术信号,它表示有巨大的外力在抵消原有的形态力量,它催促你立即作出决定,无论盘面看上去有多么平静我们都不能麻木,因为巨变即将开始。揭秘阿拉山口中欧班列守护人央广网阿拉山口11月21日消息(记者罗成通讯员曹轶广)阿拉山口海关和乌铁局阿拉山口站最新统计数据显示,今年前10月,阿拉山口口岸进出口贸易值2615。5亿元,同比增长3阿拉山口铁路京东方,股民的最爱!上市21年,坐了6次过山车,如今逼近发行价11月财经新势力电视机进入大屏时代,电脑和手机更是工作生活不可或缺的工具,这些离不开液晶面板厂商的功劳。中国已经发展成为全球最大液晶面板生产国,这个成果是政府大力支持和企业自主创新山东省临沂市沂水县诸葛镇马场峪村山东省临沂市沂水县诸葛镇马场峪村文吴传忠连日来,有好多读者在我的公众号文章文末留言你走过诸葛镇的山山水水,写过不少美丽村庄的文章,怎么不来我们马场峪村看看走走啊,我们那里有药王庙有山东女排豪华亮相,一优势力压天津女排,安家杰叫板王宝泉不是梦20222023赛季中国女排超级联赛C组比赛,山东女排首次亮相,对阵河北女排,结果山东女排砍瓜切菜般的30战胜对手,三局的比分为2592582511。本场比赛,山东女排不仅大比分战北证50实时行情正式发布主动偏股型基金北交所重仓持股比例上升至0。1311月21日,北交所首个指数北证50成份指数正式发布实时行情,以反映市场整体运行情况,提供投资标的和业绩比较基准。同日,华夏基金上报华夏北证50成份指数证券投资基金,便于投资者参与女星近期造型盘点赵露思头重脚轻,虞书欣千金归来,柳岩美绝了最近娱乐圈中的活动也不少,女明星也有很多营业造型,一起来看看女明星的近日造型吧赵露思最近出席宝格丽活动时,穿了一身黑色长裙,在胸部附近有镂空的设计。对小个子来说,稍微的露肤设计会显供销社全系统物流业营业额暴增超8。9倍,创新仍是关键近日,资本市场上供销社概念股出现连续涨停。在物资紧缺的时代,供销社和国营百货公司,一个服务农村,一个面向城市,对物资按计划进行分配,在供不应求的环境中,过着做垄断生意的日子,随着改