Android WebP的使用

參考: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
                    3.1
        (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
            1
            # 配置android中的local.properties改成下載的ndk路徑:
              3.2
            # 配置環境變量:
             3.3
        (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

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
                5
        (4)、佈局中使用:

               4.3

5、注意的點:

(1)、android導入源碼的時候可能會有錯誤,需要更新自己的gradle信息

(2)、webp的動圖加載,圖片兼容框架就只有 fresco 

編譯的源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章