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

不知道大家有没有类似的困扰,你的工程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 编译前下载
groovy 复制代码
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 下载函数
groovy 复制代码
//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链接,找到之前的对应版本。

相关推荐
graceyun3 小时前
C语言进阶习题【1】指针和数组(4)——指针笔试题3
android·java·c语言
2401_897916068 小时前
Android 自定义 View _ 扭曲动效
android
天花板之恋8 小时前
Android AutoMotive --CarService
android·aaos·automotive
susu108301891112 小时前
Android Studio打包APK
android·ide·android studio
2401_8979078612 小时前
Android 存储进化:分区存储
android
Dwyane0319 小时前
Android实战经验篇-AndroidScrcpyClient投屏一
android
FlyingWDX19 小时前
Android 拖转改变视图高度
android
_可乐无糖19 小时前
Appium 检查安装的驱动
android·ui·ios·appium·自动化
一名技术极客1 天前
Python 进阶 - Excel 基本操作
android·python·excel
我是大佬的大佬1 天前
在Android Studio中如何实现综合实验MP3播放器(保姆级教程)
android·ide·android studio