Android图片资源检测插件实现

为什么要检测图片资源?

  1. 避免不小心把未压缩 , 不合适的图片资源打入apk中 , 造成apk过大
  2. 图片打入apk前 , 可以自动化转换 , 压缩
实现思路
  1. 思路一:使用gradle在aapt编译期 , 扫描汇总资源的文件夹 , 过滤出不符合要求的图片资源 , 并抛出异常中断编译
  2. 思路二:是思路一的进阶 。还是在使用gradle在aapt编译期 , 查找有没有合适的gradle task , 提供给我们遍历所有资源的机会
gradle插件实现gradle插件实现的基础
简单对gradle插件实现进行复习
插件搭建
  • 新建一个模块
  • 配置好该模块的上传配置(mvn.gradle)
  • 在build中 , 对gradleApi进行依赖
  • scss复制代码
  • Apply plugin: 'kotlin' //插件如果使用kotlin实现 , 需要依赖kotlindependencies { implementation gradleApi() implementation localGroovy() implementation 'com.Android.tools.build:gradle:3.4.2'}
  • 在mAIn下面新建resources.META-INF.gradle-plugins文件夹
  • 在该文件夹中创建一个和module同名的.properties文件 , 在里面配置上你的插件入口类
  • 例:
  • arduino复制代码
  • implementation-class=com.xxx.checkbigimage.image.ImagePlugin
插件的基本实现上面讲到要配置一个入口类 , 这个入口类就是实现了Plugin接口的类 , 它有一个override fun apply(project: Project)方法 , 就是我们插件开始执行的地方 , 相当于main函数 , 参数project就是整个工程的配置文件
可以使用以下方法 , 从我们使用插件的地方获取到对插件的配置
Python/ target=_blank class=infotextkey>Python复制代码project.extensions.create("config", Config::class.JAVA)mConfig = project.property("config") as ConfigConfig是一个java bean数据类
"config"是我们在build中的配置名称
这样一个简单gradle插件就实现了图片资源检测插件实现上面说了为什么要实现这样一个插件和该如何实现一个gradle插件 , 那么下面就具体介绍该插件的实现过程
想要的功能
  • 检测和拦截功能
    • 检测是否有大小超标的图片
    • 检测是否有宽高超标的图片
    • 拦截非webp资源 , 并进行提示
  • 自动化压缩
    • 自动压缩png , jpg等资源
  • 白名单设置
  • 一些统计功能
实现过程上面已经说了gradle插件的实现 , 那么我们就从apply方法开始说起 。
瞄准task挂钩既然是要hock android打包的编译过程 , 那就要寻找android打包时 , 合适的task
想hock task , 首先应该拿到任务task集合在android插件编译生成apk的过程中 , 有好多task都可以生成apk , 它们的名字基于Build Types 和 Product Flavor 生成 。那么我们怎么拿到具体生成apk的task组呢?
为了解决这个问题 。android插件有几个属性 , 就是我们平常配置的变体(所谓的环境) , androd中有三类变体
  • applicationVariants(只适用于 app plugin)
  • libraryVariants(只适用于 library plugin)
  • testVariants(app、library plugin 均适用)
这三个对象都是实现了BaseVariant(BaseVariantImpl为实现这个接口的抽象类)接口的类的对象的集合
属性名
属性类型
说明
name
String
Variant 的名字 , 唯一
description
String
Variant 的描述说明
dirName
String
Variant 的子文件夹名 , 唯一 。可能有不止一个子文件夹 , 例如 “debug/flavor1”
baseName
String
Variant 输出的基础名字 , 必须唯一
outputFile
File
Variant 的输出 , 该属性可读可写
processManifest
ProcessManifest
处理 Manifest 的 task
aidlCompile
AidlCompile
编译 AIDL 文件的 task
renderscriptCompile
RenderscriptCompile
编译 Renderscript 文件的 task
mergeResources


推荐阅读