这里我们只处理普通图片转换为webp的压缩 。jpg,png的自压缩原理相同 , 就不复述了想压缩转换webp图片 , 需要用到转换工具
google提供的有一套命令行转换工具:cwebp , 各个平台都有 , 我们去下载一套 , 放在我们的主工程文件夹下就可以了
这里需要注意的是:为了方便 , 如果把cwebp命令行程序放在环境变量下 , 那么执行命令时 , 拼接命令时 , 直接拼接cwebp就好 。
如果使用工程目录下的cwebp , 执行前 , 需要在cwebp命令前面拼接它所在的工程目录 。
使用
lua复制代码project.rootDir.path
可以获取工程的根目录如何执行命令行程序呢?可以使用java的api
scss复制代码Runtime.getRuntime().exec(cmd)
现在可以愉快的转换图片了bash复制代码Tools.cmd("cwebp", "${imgFile.path} -o ${webpFile.path} -m 6 -quiet")
转换后 , 记得把原图删掉优化点:系统兼容在linux系统上 , 创建和删除文件都需要权限 , 如果没有权限就会失败 。这时需要先判断当前的操作系统是不是linux , 如果是 , 可以执行chmod 755 -R ${FileUtil.getRootDirPath()}添加权限
有的图片转换后比以前还大 , 这里需要注意
第一次扫描过后的无法优化的图片 , 可以存在一个text文本当中 , 第二次执行时 , 就不要去转换了
这里可以优化一下 , 在我们的mcPicTask前面再加一个task , 用来添加权限 , 这个task只对文件夹进行递归添加就可以了 , 比一个一个文件要来的快 。
因为我们不清楚系统的task(mergeResourcesTask)都依赖了哪些 , 那么如何在依赖上再加依赖 , 如何插入task呢?
gradle api提供给了我们一个方法 ,
xxx.taskDependencies.getDependencies(xxx)可以获取自己的依赖树
在这里就是
scss复制代码(project.tasks.findByName(chmodTask.name) asTask).dependsOn(mergeResourcesTask.taskDependencies.getDependencies(mergeResourcesTask))
让chmodTask依赖mergeResourcesTask的依赖 。假如mergeResourcesTask是A , chmodTask是B 。A依赖一个系统的C 。那么上面的代码就是让B依赖了C 。这时的task图就是 B->C , A->C接下来我们再把mcPicTask(简称为D)也依赖进来
arduino复制代码(project.tasks.findByName(mcPicTask.name) as Task).dependsOn(project.tasks.findByName(chmodTask.name) as Task)
这时就是D->B->C , A->C最后 , 回到我们刚刚拦截图片的逻辑的最后代码
less复制代码mergeResourcesTask.dependsOn(project.tasks.findByName(mcPicTask.name))
就变成了A->D->B->C , 也就是mergeResourcesTask->mcPicTask->chmodTask->原依赖task , 依赖和执行顺序是相反的 。正常的代码就是
scss复制代码(project.tasks.findByName(chmodTask.name) asTask).dependsOn(mergeResourcesTask.taskDependencies.getDependencies(mergeResourcesTask))(project.tasks.findByName(mcPicTask.name) as Task).dependsOn(project.tasks.findByName(chmodTask.name) as Task)mergeResourcesTask.dependsOn(project.tasks.findByName(mcPicTask.name))
Tips直接使用mergeResourcesTask.dependsOn(project.tasks.findByName(mcPicTask.name))插入task 。执行顺序打印
......而使用正规的插入法顺序
Task :app:mainApkListPersistenceDebug UP-TO-DATE
Task :app:CheckBigImageDebug
Task :app:generateDebugResValues UP-TO-DATE Task :app:generateDebugResources UP-TO-DATE Task :app:mergeDebugResources
......
Task :app:mainApkListPersistenceDebug UP-TO-DATE Task :app:generateDebugResValues UP-TO-DATE Task :app:generateDebugResources UP-TO-DATE Task :app:chmodDebuggradle版本差异我们上面的例子 , 都是基于比较最新的gradle和android gradle tools版本(>3.3) , android插件直接提供给了我们allRawAndroidResources , 方便无比 , 直接在merge前遍历它就好了 。
Task :app:CheckBigImageDebug
Task :app:mergeDebugResources
那么3.3之前的版本呢?就是我们最初的设想了 , 在合并完各个module资源后 , 扫描merge文件夹!这里又有aapt和aapt2的差异
推荐阅读
- 把Android手机变成电脑摄像头,开发者倒苦水:40行代码搞定,但需要40个项目文件支持!
- 调料配方分析检测 检测调料配方需要到哪里检测
- 甲醛检测治理方法 甲醛检测治理方法有哪些
- 联想笔记本未检测到电池 笔记本未检测到电池
- tds水质检测多少为饮用水 水质检测多少可以直饮
- 怎么检验新iphone是不是翻新机 新苹果手机怎么检测是否翻新机
- 核酸检测怎么做的疼不疼 核酸检测怎么做痛苦吗
- 支付宝如何预约上门核酸检测报告 支付宝如何预约上门核酸检测
- 做核酸检测之前吃了东西会影响结果吗 核酸检测前吃了东西怎么办
- e视力表标准检测方法有哪些 e视力表标准检测方法