webp格式图片使用技术调研 webp官网介绍:https://developers.google.com/speed/webp/ 资料(含Demo):https://github.com/loveAndroidAndroid/GlideWebp webp兼容: android4.0(API level 4)之下:默认不支持 android4.0(API level 14)- Android 4.3(API level 18):只支持完全不透明的decode、encode的webp图 Android 4.3(API level 18)之上:支持无损和透明的WebP图像 webp限制: 点9图(.9.png)格式的文件,不能转换为WebP图像 webp制作: AS:选择图片-右击-选择convert to WebP开启制作 软件:PS,智图等 在线制作:https://cloudconvert.com/jpeg-to-webp 压缩大小实际情况:(具体详见资料链接) 按照默认压缩质量75%来算,某些情况还可以再压缩,按照实际效果来。 图片30k -> 3.3k 图片80k -> 37k 图片120k -> 61.6k 图片940k -> 67.6k 影响APK包大小:(具体详见资料链接) 因为项目本身支持Glide和Okhttp,所以加入fresco-webp支持后项目增大200k左右, 具体大小比较可看webp相关资料。 使用流程:(更多详见Demo) 1.加入依赖,demo使用最新版Glide和fresco支持 //用于webp的支持 implementation "com.facebook.fresco:animated-webp:1.13.0" implementation ("com.github.bumptech.glide:glide:4.9.0") implementation "com.github.bumptech.glide:okhttp3-integration:4.9.0" annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' implementation 'com.squareup.okhttp3:okhttp:3.10.0' 2.创建AppGlideModule初始化webp support(加载webp静态加动态图) // webp support相关代码(具体详见AppGlideModule的registerComponents方法代码) ResourceDecoder decoder = new WebpResourceDecoder(context,glide); ResourceDecoder byteDecoder = new WebpBytebufferDecoder(context,glide); // use prepend() avoid intercept by default decoder registry.prepend(InputStream.class, Drawable.class, decoder) .prepend(ByteBuffer.class, Drawable.class, byteDecoder); 3.使用 正常Glide使用用法就ok Glide加载webp原理: Glide库本身是不支持加载webp格式的图片的。其原理在于借助fresco的web库来解析网络流,并且支持动态webp,引入implementation "com.facebook.fresco:animated-webp:1.13.0"库 , 并拷贝包里的包装类,作用是按glide提供的接口方式来实现网络流的解析,但最核心的解析层是使用fresco的web扩展库解析的。 使用发现问题:(具体详见Demo) 5.0以下https单向认证问题,现象导致图片加载不出来 解决思路: square/okhttp#2372 https://blog.csdn.net/weixin_34085658/article/details/88490322 自定义OkhttpClient: 在AppGlideModule的registerComponents方法加入自定义的OkhttpClient registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(getHttpClient(context))); You cannot call Glide.get() in registerComponents()(Glide初始化两次问题,可跟进源码查看异常抛出代码) WebpResourceDecoder和WebpBytebufferDecoder代码直接传入Glide对象,不在初始化中使用Glide.get(context)代码两次初始化导致报错。具体详见Demo 最新Grade5.1.1 com.android.tools.build:gradle:3.4.0 集成此套环境有问题,无法加载动图webp,暂不知问题解决方案,待后期考察。