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

相关推荐
androidwork4 小时前
Android LinearLayout、FrameLayout、RelativeLayout、ConstraintLayout大混战
android·java·kotlin·androidx
每次的天空4 小时前
Android第十三次面试总结基础
android·面试·职场和发展
wu_android4 小时前
Android 相对布局管理器(RelativeLayout)
android
李斯维6 小时前
循序渐进 Android Binder(二):传递自定义对象和 AIDL 回调
android·java·android studio
androidwork6 小时前
OkHttp 3.0源码解析:从设计理念到核心实现
android·java·okhttp·kotlin
像风一样自由7 小时前
【001】frida API分类 总览
android·frida
casual_clover7 小时前
Android 之 kotlin 语言学习笔记四(Android KTX)
android·学习·kotlin
移动开发者1号9 小时前
Android 大文件分块上传实战:突破表单数据限制的完整方案
android·java·kotlin
移动开发者1号9 小时前
单线程模型中消息机制解析
android·kotlin
每次的天空11 小时前
Android第十五次面试总结(第三方组件和adb命令)
android