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

相关推荐
千里马学框架15 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台15 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone16 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc16 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo18 小时前
Kotlin 协程中的 Job 结构化并发与取消
android
sun00770018 小时前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼19 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone20 小时前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen20 小时前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone20 小时前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui