【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )
文章目录
- 一、 Android Studio 中导入 libwebp.so 库
- 二、 Android Studio 中测试 libwebp.so 库
- 三、参考资料
一、 Android Studio 中导入 libwebp.so 库
已经做好了兼容 4.0 以下系统的的 Android 工程源码 , 在下面博客资源中可以下载 ;
上一篇博客 【Android 安装包优化】WebP 应用 ( libwebp 源码下载 | Android.mk 和 Application.mk 构建脚本修改 | libwebp 函数库编译 ) 最后编译好的动态库在 libs 目录下 ;
每个 CPU 架构目录下都有如下几个文件 :
导入三种 CPU 架构的动态库到 Android Studio 中 , 在 Android Studio 中的 app/src/main/ 下创建 jniLibs 目录 , 创建三个对应架构的目录 , 拷贝对应的 libwebp.so 动态库到对应目录中 ;
Google 为该 libwebp.so 提供了 Java 调用接口 , 将 libwebp-0.6.1\swig\libwebp.jar 拷贝到 app/libs 目录中 ;
在 Android Studio 中 , 右键点击 libs 下的 libwebp.jar , 在弹出的菜单中 , 选择 " Add As Library … " ,
选择要添加 Library 的 Module ,
在对应 Module 下的 build.gradle 构建脚本中 , 就会添加对应的 jar 依赖 ;
在 build.gradle 构建脚本中 , 设置 APK 打包指令集 , 这里全设置 ;
android {defaultConfig {//配置 APK 打包 哪些动态库// 示例 : 如在工程中集成了第三方库 , 其提供了 arm, x86, mips 等指令集的动态库// 那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置ndk{// 打包生成的 APK 文件指挥包含 ARM 指令集的动态库abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"}}
}
在使用 libwebp.so 的类中 , 需要手动加载动态库 ;
class MainActivity : AppCompatActivity() {companion object{val TAG = "MainActivity"init {System.loadLibrary("webp")}}
}
二、 Android Studio 中测试 libwebp.so 库
调用一下 libwebp 库中的 WebPGetDecoderVersion() 函数 , 查看是否能使用 ;
package kim.hsl.webpimport android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.google.webp.libwebp
import java.io.FileOutputStream
import java.nio.ByteBufferclass MainActivity : AppCompatActivity() {companion object{val TAG = "MainActivity"init {System.loadLibrary("webp")}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)Log.e(TAG, "libwebp 函数库版本 : ${libwebp.WebPGetDecoderVersion()}")// 测试 WebP 解码速度decodeWebP()// 测试 WebP 编码速度encodeWebP()}fun encodeWebP(){// 读取一张本地图片var bitmap = BitmapFactory.decodeResource(resources, R.mipmap.icon_png)var pngStart = System.currentTimeMillis()var fos = FileOutputStream("${cacheDir}/icon_png.png")bitmap.compress(Bitmap.CompressFormat.PNG, 75, fos)fos.close()Log.e(TAG, "编码 png 格式图片时间 : ${System.currentTimeMillis() - pngStart} ms , " +"输出文件 : ${cacheDir}/icon_png.png")var webPStart = System.currentTimeMillis()fos = FileOutputStream("${cacheDir}/icon_webp.webp")bitmap.compress(Bitmap.CompressFormat.WEBP, 75, fos)fos.close()Log.e(TAG, "编码 WebP 格式图片时间 : ${System.currentTimeMillis() - webPStart} ms , " +"输出文件 : ${cacheDir}/icon_webp.webp")}fun decodeWebP(){var pngStart = System.currentTimeMillis()BitmapFactory.decodeResource(resources, R.mipmap.icon_png)Log.e(TAG, "解码 png 格式图片时间 : ${System.currentTimeMillis() - pngStart} ")var webPStart = System.currentTimeMillis()BitmapFactory.decodeResource(resources, R.mipmap.icon_webp)Log.e(TAG, "解码 WebP 格式图片时间 : ${System.currentTimeMillis() - webPStart} ")}
}
打印结果 :
2021-04-25 14:11:16.249 1545-1646/kim.hsl.webp E/libc: Access denied finding property "vendor.debug.egl.profiler"
2021-04-25 14:11:16.423 1545-1545/kim.hsl.webp E/MainActivity: libwebp 函数库版本 : 1537
2021-04-25 14:11:16.703 1545-1545/kim.hsl.webp E/MainActivity: 解码 png 格式图片时间 : 280
2021-04-25 14:11:16.903 1545-1545/kim.hsl.webp E/MainActivity: 解码 WebP 格式图片时间 : 200
2021-04-25 14:11:19.584 1545-1545/kim.hsl.webp E/MainActivity: 编码 png 格式图片时间 : 2411 ms , 输出文件 : /data/user/0/kim.hsl.webp/cache/icon_png.png
2021-04-25 14:11:22.659 1545-1545/kim.hsl.webp E/MainActivity: 编码 WebP 格式图片时间 : 3074 ms , 输出文件 : /data/user/0/kim.hsl.webp/cache/icon_webp.webp
成功打印出 libwebp 的版本号 , 153715371537 ;
三、参考资料
参考文档 :
创建 WebP 图片 : https://developer.android.google.cn/studio/write/convert-webp
Android 中支持的媒体格式 : https://developer.android.google.cn/guide/topics/media/media-formats
isparta 工具官网 : http://isparta.github.io/
isparta 工具 GitHub 地址 : https://github.com/iSparta/iSparta
Google 提供的 WebP 工具 ( 国内不能访问 ) : https://developers.google.com/speed/webp/download
Google WebP 主页 : https://developers.google.com/speed/webp
WebP 相关工具下载页 : https://developers.google.com/speed/webp/download
WebP工具和函数库使用文档 : https://developers.google.com/speed/webp/docs/using
Android NDK 编译构建脚本参考文档 :
- ndk-build 脚本 : https://developer.android.google.cn/ndk/guides/ndk-build
- Android.mk 构建脚本 : https://developer.android.google.cn/ndk/guides/android_mk
- Application.mk 构建脚本 : https://developer.android.google.cn/ndk/guides/application_mk
博客资源 :
- iSparta 工具 : https://download.csdn.net/download/han1202012/17496041
- Google libwebp 库 : https://download.csdn.net/download/han1202012/17498155
- libwebp 源码及编译相关资源 : https://download.csdn.net/download/han1202012/17826464 ( 源码 , 编译脚本 , 编译结果 so 库 )
博客源码 :
- GitHub 地址 : https://github.com/han1202012/Webp
- CSDN 下载地址 : https://download.csdn.net/download/han1202012/18125733
【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )相关推荐
- 【Android 安装包优化】WebP 图片格式性能测试 ( 测试 WebP 图片解码速度 | 测试 WebP 图片编码速度 )
文章目录 一.测试 WebP 图片解码速度 二.测试 WebP 图片编码速度 三.参考资料 测试结果 : WebP 格式图片 , 解码快 , 编码慢 , 占用空间小 ; 在解码速度上 , WebP 格 ...
- 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )
文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...
- 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )
文章目录 一.开启资源压缩 二.启用严格模式的资源引用检查 三.自定义保留/移除资源配置 四.资源压缩效果 五.完整配置 1.keep.xml 配置 2.build.gradle 构建脚本 六.参考资 ...
- 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )
文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )
文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...
- 【Android 安装包优化】Android 中使用 7zr 可执行程序 解压缩文件
文章目录 一.Android 中使用 7zr 可执行程序 解压缩文件 二.完整代码示例 三.参考资料 一.Android 中使用 7zr 可执行程序 解压缩文件 在上一篇博客 [Android 安装包 ...
最新文章
- 企业融入租时代 谋求轻资产化高效运营
- 动态验证码制作(RandomCodeImage )
- netty源码深度分析
- 表单元素聚焦状态回车提交表单问题小记
- 关于Vmware ESX 4.1添加第二个Servier Console 却无法添加网关的解决方法
- 爬虫用java还是python_网络爬虫是用python比较好,还是Java比较好呢?
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
- Tomcat access log配置
- 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客
- 破解百词斩单词数据之旅
- 大话设计模式之爱你一万年:第十三章 行为型模式:策略模式:女友在手,说走就走:1.策略模式概念
- WIN10 下 autocad2006 及其他版本打开文件多窗口不能一个窗口的解决办法
- HTML 表单 (form) 的作用解释
- 【Python进阶】9- Pandas的应用
- clip-summary
- 陈臣java_小菜学设计模式——享元模式
- oracle判断不是null,oracle中判断不为null
- ESP32 DEVKIT V1 资料分享-原理图+引脚图
- Android内存泄漏检测工具使用手册
- STM32 PC13 PC14 PC15用作普通IO口
热门文章
- 简单的Tab切换组件
- Object_Type列表
- 微软在你的计算机里隐藏的秘密
- MongoDB · 引擎特性 · MongoDB索引原理
- Object处理方法的返回值
- POJ 2010 Moo University - Financial Aid(堆维护滑窗kth,二分)
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决...
- 负margin的移位参考线
- ZOJ 1049 2^x mod n = 1
- 再探Javascript词法作用域