Android图片资源检测插件实现( 三 )

  • lua复制代码
  • if (imgFile.length() >= maxSize) { LogUtil.log(SIZE_TAG, imgFile.path, true.toString()) return true}
  • 压缩图片逻辑
    这里我们只处理普通图片转换为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")转换后 , 记得把原图删掉
    优化点:
    有的图片转换后比以前还大 , 这里需要注意
    第一次扫描过后的无法优化的图片 , 可以存在一个text文本当中 , 第二次执行时 , 就不要去转换了
    系统兼容在linux系统上 , 创建和删除文件都需要权限 , 如果没有权限就会失败 。这时需要先判断当前的操作系统是不是linux , 如果是 , 可以执行chmod 755 -R ${FileUtil.getRootDirPath()}添加权限
    这里可以优化一下 , 在我们的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:chmodDebug
    Task :app:CheckBigImageDebug
    Task :app:mergeDebugResources
    gradle版本差异我们上面的例子 , 都是基于比较最新的gradle和android gradle tools版本(>3.3) , android插件直接提供给了我们allRawAndroidResources , 方便无比 , 直接在merge前遍历它就好了 。
    那么3.3之前的版本呢?就是我们最初的设想了 , 在合并完各个module资源后 , 扫描merge文件夹!这里又有aapt和aapt2的差异


    推荐阅读