在 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.webp import 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.ByteBuffer class 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 的版本号 , 1537 15371537 ;
三、参考资料
参考文档 :
创建 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