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链接,找到之前的对应版本。

相关推荐
哲科软件5 小时前
跨平台开发的抉择:Flutter vs 原生安卓(Kotlin)的优劣对比与选型建议
android·flutter·kotlin
jyan_敬言11 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
程序员老刘11 小时前
Android 16开发者全解读
android·flutter·客户端
福柯柯12 小时前
Android ContentProvider的使用
android·contenprovider
不想迷路的小男孩12 小时前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
餐桌上的王子12 小时前
Android 构建可管理生命周期的应用(一)
android
菠萝加点糖12 小时前
Android Camera2 + OpenGL离屏渲染示例
android·opengl·camera
用户20187928316712 小时前
🌟 童话:四大Context徽章诞生记
android
yzpyzp12 小时前
Android studio在点击运行按钮时执行过程中输出的compileDebugKotlin 这个任务是由gradle执行的吗
android·gradle·android studio
aningxiaoxixi13 小时前
安卓之service
android