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


方法一关掉aapt2
ini复制代码android.enableAapt2=false在mergeDebugResources后 , processDebugResources前扫描文件夹
前面说过 , mergeDebugResources是合并所有module的资源文件到固定目录
那么processDebugResources是什么呢?就是处理这些已经合并完成的文件 , 生成R.id , 资源索引之类的文件
那么我们的任务就必须插入到processDebugResources前面 , 而不是mergeDebugResources了
方法二仔细翻了翻MergeResources里面的方法 , 有一个getResSet和computeResourceSetList看起来有点意思 。那么computeResourceSetList中又调用了getResSet 。最后发现computeResourceSetList果然可以获取所有文件列表 。
less复制代码/*** Computes the list of resource sets to be used during execution based all the inputs.*/@VisibleForTesting@NonNullList<ResourceSet> computeResourceSetList()【Android图片资源检测插件实现】注释也很有意思 , 有道翻译一下:根据所有输入计算执行期间使用的资源集列表 。
鉴于该方法是友元方法 , 就使用反射获取 。

因为3.3之后 , aapt2是强制开启的 , 并且aapt2 merge后的文件不是原文件了哦!注意aapt1合并后 , 还是正常的xxx.png 。aapt2合并后的文件扩展名为flat
所以 , 方法一不支持大于3.3的gradle版本 。方法二支持 。可以平滑过渡到新版本 。鉴于新版本的gradle直接提供了allRawAndroidResources这样的方法 , 所以在3.3以上 , 直接使用它就可以了
allRawAndroidResources和扫描合并文件夹的差异 。allRawAndroidResources提供的是未合并前的资源路径
  • 源码依赖的module , 编译时 , 会获取该文件的真实路径
  • aar依赖的路径 , 会获取到aar-cache的路径
  • 所以:如果开启自动转换webp功能你会发现:你本地源代码中的png , 都转成了webp
扫描合并文件夹 , 扫描的是编译期merge成功后的文件夹
  • 不会影响源代码
  •  
优化
  1. 已经扫描过的 , 且确认无法经过webp优化的图片 , 把这些名称写入一个本地文件 , 优化扫描速度
未来想做的事情统计
  1. 拦截了多少图片
  2. 转换了多少图片
  3. 3. 统计各个模块的图片资源情况 。在合适的时间进行预警




推荐阅读