android编译assets集成某文件太大更新导致git仓库变大

news2024/12/13 0:40:25

不知道大家有没有类似的困扰,你的工程assets文件过大,我曾经在某度车机地图团队工作过一段时间时候,每次发包会集成一个上百MB的文件。工作一段时间你的git仓库将会增加特别多。最后,你会发现你如果重新git clone这个仓库会非常大,好几G。当时我没有想到好办法。

拓展:虽然可以通过git clone xxx --depth=1来只check out最新的。但是commits又不太好出现。虽然我还有–unsallow的办法…始终不太好弄。

但是现在我工作的团队,也有类似的,每次发包或者debug包都可能需要更新某个zip包,好几十MB。
现在,我找到了一个好办法:

第1步:

将你的文件上传到内网,得到一些地址,比如:

http://11.11.1.11:8888/packages/works/xxx.zip
http://11.11.1.11:8888/packages/works/yyy.mp4
...

请添加图片描述

第2步:

编写app/build.gradle的编译前脚本

2.1 编译前下载
def zipFile = 'http://:8888/packages/2.11.11/web-200.5.zip'
def featureMp4s = ['http://3344/packages/feature_2041.mp4', 'http://8888/packages/feature_3223.mp4']

// 自定义下载文件的任务
tasks.register('downloadFile') {//保持同名
    doLast {
        downloadFileFun(zipFile, null) { File file->
            return file.name.endsWith("zip") && file.name.contains("web-")
        }
        featureMp4s.forEach {
            if (!it.trim().isEmpty()) {
                downloadFileFun(it, featureMp4s) { File file->
                    return file.name.endsWith("mp4") && file.name.contains("feature_")
                }
            }
        }
    }
}

// 将 downloadFile 任务作为 preBuild 的依赖
tasks.named('preBuild').configure {
    dependsOn tasks.named('downloadFile')//保持同名
}
2.2 下载函数
//matchFileChecker会给你传递file。你返回true表示此类文件是符合我们需要下载的类型文件, 也避免将其他文件删除。
def downloadFileFun(String url, List<String> needDownAllUrls, Closure matchFileChecker) {
    var downloadDir = file("src/main/assets") //自行修改文件位置,或者提取成变量
    var downloadUrlFileName = url.substring(url.lastIndexOf("/") + 1)
    var outputFile = file(downloadDir.absolutePath + File.separator + downloadUrlFileName)
    println("build: download file..." + downloadUrlFileName)
    // 确保目标文件夹存在
    if (!downloadDir.exists()) {
        throw new RuntimeException("build: download file error.")
    }

    var files = downloadDir.listFiles()
    var hasFile = false
    for (file in files) {
        if (matchFileChecker.call(file)) { //符合我们需要下载的类型文件, 也避免将其他文件删除。
            if (file.name == downloadUrlFileName) {
                hasFile = true
            } else {
                //追加一个需要下载的全列表,这样避免删除`兄弟`文件。
                if (needDownAllUrls == null || !needDownAllUrls.collect {it.substring(it.lastIndexOf("/") + 1)}.contains(downloadUrlFileName)) {
                    file.delete()
                    println "build: DELETE " + file
                } else {
                    println "build: don't delete " + file
                }
            }
        }
    }

    if (!hasFile) {
        println "build: Downloading file from $url..."
        new URL(url).withInputStream { input ->
            outputFile.withOutputStream { output ->
                output << input
            }
        }
        println "build: Download completed: $outputFile\n"
    } else {
        println "build: File already exists: $outputFile\n"
    }

    Thread.sleep(100)
}

后续你只需要更改zipFile ,featureMp4s 变量(当然你最好自行改名参考实现)即可。这样的话,你只更新了1-2句代码,而不是更新压缩包。git仓库得到了拯救。
同时切分支,切commit,倒退回去的时候,也能正常下载,也能查到当时的zip链接,找到之前的对应版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

F5-TTS文本语音合成模型的使用和接口封装

F5-TTS文本语音生成模型 1. F5-TTS的简介 2024年10月8日&#xff0c;上海交通大学团队发布&#xff0c;F5-TTS (A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching) 是一款基于扩散Transformer和ConvNeXt V2的文本转语音 (TTS) 模型。F5-TTS旨在生成流…

克隆选择算法复现

克隆选择算法复现 基于克隆选择算法求解0 - 1背包问题的代码复现文档一、背景和意义&#xff08;一&#xff09;背景&#xff08;二&#xff09;意义 二、算法原理&#xff08;一&#xff09;克隆选择算法基础&#xff08;二&#xff09;受体编辑机制 三、算法流程&#xff08;…

Scala的隐式对象

Scala中&#xff0c;隐式对象&#xff08;implicit object&#xff09;是一种特殊的对象&#xff0c;它可以使得其成员&#xff08;如方法和值&#xff09;在特定的上下文中自动可用&#xff0c;而无需显式地传递它们。隐式对象通常与隐式参数和隐式转换一起使用&#xff0c;以…

观察者模式的理解和实践

引言 在软件开发中&#xff0c;设计模式是开发者们为了解决常见的设计问题而总结出来的一系列最佳实践。观察者模式&#xff08;Observer Pattern&#xff09;是其中一种非常经典且使用率极高的设计模式。它主要用于定义对象之间的一对多关系&#xff0c;使得当一个对象的状态发…

windows下Qt5自动编译配置QtMqtt环境(11)

文章目录 [toc]1、概述2、准备1.1 下载源码1.2 配置环境1.3 解释原理 3、编译4、验证5、参考6、视频 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt网络编程 &#x1f448; 1、概述 Qt默认是不包含mqtt库的&#xff0c;如果需要使用到mqtt库就只能自己编译配…

【6】数据分析检测(DataFrame 1)

学习目标3 昨天&#xff0c;我们学习了Series。 而Pandas的另一种数据类型&#xff1a;DataFrame&#xff0c;在许多特性上和Series有相似之处。 今天&#xff0c;我们将学习DataFrame的相关知识&#xff1a; 1. DataFrame的概念 2. 构造一个DataFrame 3. DataFrame的常用…

如何选择安全、可验证的技术?

澳大利亚信号局的澳大利亚网络安全中心 (ASD 的 ACSC) 发布了一份指导文件&#xff0c;题为《选择安全和可验证的技术》&#xff0c;旨在帮助组织在采购软件&#xff08;专有或开源&#xff09;、硬件&#xff08;例如物联网设备&#xff09;和云服务&#xff08;SaaS、MSP 服务…

趣味编程:猜拳小游戏

1.简介 这个系列的第一篇以猜拳小游戏开始&#xff0c;这是源于我们生活的灵感&#xff0c;在忙碌的时代中&#xff0c;我们每个人都在为自己的生活各自忙碌着&#xff0c;奔赴着自己所走向的那条路上&#xff0c;即使遍体鳞伤。 但是&#xff0c;生活虽然很苦&#xff0c;也不…

轮转数组

轮转数组 1、题目描述2、解答思路2.1、辅助数组2.2、原地反转 1、题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 2、解答思路 2.1、辅助数组 如果我们在原数组上通过覆盖元素会导致部分元素的丢失&#xff0c…

如何编译安装系统settings设置应用(5.0.0-Release)

本文介绍如何在OpenHarmony 5.0.0 r版本中修改系统设置应用&#xff0c;并且编译安装到开发板上 开发环境 1.dayu200开发板 2.OpenHarmony 5.0.0r 固件 3.API12 full sdk &#xff08;如果安装full sdk过程中出现报错hvigor ERROR: Cannot find module typescript,请参考 h…

学习记录,隐式对象,隐式类

隐式对象 格式&#xff1a;就是在对象前面加一个 implicit 作用&#xff1a;就是给函数当默认值&#xff01; 隐式类 隐式类 一个类 一个隐式转换函数 格式&#xff1a;在class 的前面&#xff0c;添加implicit 要点&#xff1a;要有一个参数&#xff0c;就要待被转换的类型…

第三部分:进阶概念 9.错误处理 --[JavaScript 新手村:开启编程之旅的第一步]

在JavaScript中&#xff0c;错误处理是确保应用程序稳定性和用户体验的重要部分。JavaScript提供了几种机制来捕获和处理运行时错误&#xff08;异常&#xff09;。以下是几种常见的错误处理方式&#xff1a; 1. try...catch 语句 try...catch 语句是JavaScript中处理错误和异…

Java面试之多线程状态(三)

此篇接上一篇Java面试之实现多线程(二) Java线程可以拥有自己的操作数栈、程序计数器、局部变量表等资源&#xff0c;它与同一进程内的其他线程共享该进程的所有资源。Java线程在生命周期内存在多种状态&#xff0c;可以通过Thread.State枚举类获取线程状态。如图所示有NEW(新建…

数据仓库:智控数据中枢

数据仓库 一. 什么是数据仓库&#xff1f;二. 传统数据库与数据仓库的区别&#xff1f;三. 数据仓库详解&#xff08;一&#xff09;. 数据分析&#xff08;二&#xff09;. 特点1. 面向主题2. 集成的3. 反应历史变化 四. 如何搭建数据仓库&#xff08;一&#xff09;. 数据平台…

【全连接神经网络】核心步骤及其缺陷

前向传播 计算公式&#xff08;其中一种&#xff09; x1/x2&#xff1a;输入值&#xff0c;一般是神经网络上一层的输出或者输入数据本身&#xff0c;上图中表示两个节点w11 w13&#xff1a;权重&#xff0c;在神经网络中&#xff0c;权重是学习的参数&#xff0c;表示每个输入…

微服务的问题

1.创建maven项目 然后配置对应的maven地址 2.创建父工程 删掉其中的src文件 在父pom中进行版本依赖和管理 如下图所示 3.在子文件中进行添加依赖 然后刷新maven进行下载

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…

计算机视觉与医学的结合:推动医学领域研究的新机遇

目录 引言医学领域面临的发文难题计算机视觉与医学的结合&#xff1a;发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉&#xff08;Computer Vision, CV&#xff09;技术作为人工智能的重要分支&#xff0c;已经在多个领域取得了显著的应用成果&…

微搭低代码AI组件单词消消乐从0到1实践

目录 1 为什么要开发单词消消乐2 需要具备什么功能3 采用什么技术方案实现4 逻辑设计4.1 数据结构设计4.2 游戏的核心逻辑4.3 数据设计 5 代码详解5.1 导入依赖5.2 定义函数组件5.3 数据初始化5.4 状态定义5.5 打乱解释的逻辑5.6 定义选择单词的函数5.7 定义选择解释的函数5.8 …

learn-(Uni-app)输入框u-search父子组件与input输入框(防抖与搜索触发)

1.父子组件u-search &#xff08;1&#xff09;父组件 <!-- 父组件 --> <template> <div><searchBar change"change" search"search"></searchBar> </div> </template> <script> // 子组件搜索 import…