參考:https://blog.csdn.net/m13984458297/article/details/70159464
1、webp介紹:
webp是Google於2010年提出了一種新的圖片壓縮格式 — WebP,給圖片的優化提供了新的可能。
WebP爲網絡圖片提供了無損和有損壓縮能力,同時在有損條件下支持透明通道。
據官方實驗顯示:無損WebP相比PNG減少26%大小;有損WebP在相同的SSIM
(Structural Similarity Index,結構相似性)下相比JPEG減少25%~34%的大小;
有損WebP也支持透明通道,大小通常約爲對應PNG的1/3。
參考:https://blog.csdn.net/f2006116/article/details/53141207
2、github下載webp源碼:
github源碼地址:https://github.com/EverythingMe/webp-android
3、android導入webp源碼,編譯生成.so可用文件:
(1)、android studio直接open打開下載解壓好的 webp-android-master
(2)、由於源碼是17年之前搞得,所以gradle需要修改下,不然會報錯
apply plugin: 'com.android.library'
buildscript {
repositories {
mavenCentral()
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1'
}
}
allprojects {
repositories {
mavenCentral()
google()
jcenter()
maven { url 'https://maven.google.com' }
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
maven { url "https://jitpack.io" }
}
}
android {
compileSdkVersion 26
buildToolsVersion "28.0.2"
defaultConfig {
targetSdkVersion 26
minSdkVersion 4
versionCode 1
versionName "1.0.4"
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/libs/']
}
}
archivesBaseName=getName()
version='1.0.'+(System.getenv('BUILD_NUMBER') ? System.getenv('BUILD_NUMBER') : '0-LOCAL')
//rename the aar to {archivesBaseName}-{version}.aar
// libraryVariants.all { variant ->
// variant.outputs.each { output ->
// def outputFile = output.outputFile
// if (outputFile != null && outputFile.name.endsWith('.aar')) {
// def fileName = "${archivesBaseName}-${version}.aar"
// output.outputFile = new File(outputFile.parent, fileName)
// }
// }
// }
libraryVariants.all { variant ->
variant.outputs.all {
def fileName = "webp${archivesBaseName}_${version}.aar"
outputFileName = fileName
}
}
}
// call regular ndk-build(.cmd) script from app directory
task ndkBuild(type: Exec) {
String ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build", '-j8', '-C', file('src/main/jni').absolutePath
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
task cleanExtra(type: Delete) {
delete 'src/main/obj'
}
clean.dependsOn(cleanExtra)
group = 'me.everything'
apply plugin: 'com.jfrog.artifactory-upload'
apply plugin: 'android-maven'
(3)、ndk的版本當前太新會導致編譯不成功,我這裏下載了一箇舊版的來用
# 下載舊版本的ndk來支持webp:https://developer.android.google.cn/ndk/downloads/older_releases.html
# 配置android中的local.properties改成下載的ndk路徑:
# 配置環境變量:
(4)、terminal 中cd到jni路徑執行命令如下:
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk
參考:http://www.bubuko.com/infodetail-3256499.html
4、android項目使用webp的.so文件:
(1)、android項目,libs中放入生成的.so文件
(2)、gradle中添加libs資源路徑
android {
...
sourceSets {
main {
jniLibs.srcDirs = ['libs']//設置目標的so存放路徑
}
}
}
(3)、copy源碼中的webp工具類:
WebPDecoder.java/WebpImageView.java
(4)、佈局中使用:
5、注意的點:
(1)、android導入源碼的時候可能會有錯誤,需要更新自己的gradle信息
(2)、webp的動圖加載,圖片兼容框架就只有 fresco