当前位置: 首页 > news >正文

Android-->产物收集(含apk文件重命名, aab文件重命名)

以前写过修改apk生成路径和文件名的文章, 如下:

AS–›Gradle 7.0.0/4.1.0/4.0/3.3/3.0 修改APK生成路径和文件名(附AAR修改方式以及分析过程)_com.android.build.gradle.internal.api.libraryvaria-CSDN博客

这种方法入侵了gradle,破坏了原有的gradle环境, 经常会导致如下问题的产生:

  • Error loading build artifacts from: ...app/intermediates/apk_ide_redirect_file/debug/redirect.tx
  • In plugin 'com.android.internal.version-check' type 'com.android.build.gradle.internal.tasks.ListingFileRedirectTask' property 'listingFile'
  • 'output-metadata.json' which doesn't exist.

这一次, 换一种思路实现, 以便达到相同效果.

这次通过监听assembleXXX任务(用于生成apk)和bundleXXX任务(用于生成aab), 在任务结束之后, 通过脚本复制对应的产物到指定的目录(顺便修改文件名),即可达到相同的效果.

android {tasks.whenTaskAdded { task ->tasks.create('收集产物任务') {doLast {//开始收集产物}}task.finalizedBy('收集产物任务')//挂载任务}
}

怎么设置对应的产物名称

这里通过applicationVariants拿到flavorbuildType, 将产物名称关联到这2个参数上.

android {applicationVariants.all { variant ->variant.flavorName //关键信息flavorvariant.buildType.name //关键信息buildType}    
}

使用flavorbuildType按照一定规则, 生成唯一的key, 然后把产物名称通过ext对象存储,rootProject.ext.setProperty(key, name), 方便之后在task中读取.

怎么读取设置的产物名称

Android打包时, 都有对应的打包gradle task, 这个task.name就会包含flavorbuildType信息, 只要从任务名称中分离出这2个参数, 然后和上一步对应上, 就可以取出设置好的产物文件名了.

思路大体就是上述内容, 我已封装成了在线脚本, 一键食用.

脚本支持特性

  • 支持收集apk,并支持重命名
  • 支持收集aab,并支持重命名
  • 收集mapping.txt
  • 收集usage.txt
  • 收集seeds.txt
  • 收集R.txt
  • 收集configuration.txt
  • 支持AGP 8.0+
  • 支持AGP 8.0-

使用方式

apply脚本之前, 先配置产物名称:

ext {APP_NAME = "xxx"apkName = "#an-#vn_#fn_#bn_#ka"
}//可用参数: #an:app名字APP_NAME; #vn:版本名; #d:当天日期yyyy-MM-dd; #t:当天时间yyyy-MM-dd_HH-mm; #fn:风味名; #bn:编译类型名;
//         #sn:使用的签名名称; #ka:使用的签名别名;

在工程的build.gradle中加入脚本:

国内

apply from: 'https://gitee.com/angcyo/CollectProduct/raw/master/app/collectProduct.gradle'

国外

apply from: 'https://raw.githubusercontent.com/angcyo/CollectProduct/master/app/collectProduct.gradle'

参数配置

gradle.properties文件中配置产物输出目录, 默认为根目录下的.apk文件夹:

apk_path='.apk'

群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

联系作者

点此QQ对话 该死的空格 点此快速加群

在这里插入图片描述

开源地址

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Mutual_Voting_for_Ranking_3D_Correspondences
  • AFSim 仿真系统----坐标系统
  • 基于CNN的医学X-Ray图像分类全程解析
  • 在Notebook中使用backtrader绘图出现 Javascript Error: IPython is not defined
  • CUDA编程06 - 性能优化指南
  • 【微信小程序】WXSS 模板样式
  • 详解C++的四大特性(封装,继承,多态,抽象)
  • 大数据信用报告查询哪家平台的比较好?
  • 视频美颜SDK的核心技术与直播美颜插件的开发详解
  • 国内首个支持国产化信创的开源云原生平台
  • 业界首个OpenTelemetry结合eBPF的向导式可观测性平台APO正式开源
  • 数据结构(5.5_2)——并查集
  • Linux centos stream 9命令及源码
  • 46-扇孔的处理及铺铜以及布线
  • 01学生管理系统(数组)
  • 【5+】跨webview多页面 触发事件(二)
  • ES6系列(二)变量的解构赋值
  • JavaScript DOM 10 - 滚动
  • Java超时控制的实现
  • Node 版本管理
  • PHP的Ev教程三(Periodic watcher)
  • React16时代,该用什么姿势写 React ?
  • React-Native - 收藏集 - 掘金
  • ucore操作系统实验笔记 - 重新理解中断
  • vue总结
  • 简单易用的leetcode开发测试工具(npm)
  • 前端技术周刊 2019-02-11 Serverless
  • 前端性能优化--懒加载和预加载
  • 实现菜单下拉伸展折叠效果demo
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 用 Swift 编写面向协议的视图
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​TypeScript都不会用,也敢说会前端?
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • # SpringBoot 如何让指定的Bean先加载
  • #define,static,const,三种常量的区别
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $.ajax,axios,fetch三种ajax请求的区别
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (003)SlickEdit Unity的补全
  • (2020)Java后端开发----(面试题和笔试题)
  • (ibm)Java 语言的 XPath API
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十三)MipMap
  • (算法)区间调度问题
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)h264中avc和flv数据的解析
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .htaccess 强制https 单独排除某个目录