基于V3.4.6和V3.5.1版本的對(duì)比
一、針對(duì)圖片資源的apk瘦身
1圈暗、把大圖轉(zhuǎn)換為webp格式泽铛,以及刪除無(wú)用的圖片資源減小圖片占用
2、vectorDrawable的使用:(5.0引入的牍蜂,以前的版本可以使用兼容包)
好處:1漾根、可以任意縮放而不會(huì)失真,僅僅需要一個(gè)文件鲫竞,就能動(dòng)態(tài)生成對(duì)應(yīng)分辨率的圖片辐怕。
2、文件一般較小从绘,省去很多資源寄疏。而且占用內(nèi)存非常小,性能高僵井。
缺點(diǎn):沒(méi)有圖片表達(dá)的色彩豐富陕截,只作為簡(jiǎn)單規(guī)則圖片的替換方式。
不過(guò)單個(gè)圖片的內(nèi)存占用前后變化不大批什,作為減少apk大小更有優(yōu)勢(shì)农曲。
3、開(kāi)啟shrinkResources編譯時(shí)刪除無(wú)用資源文件和圖片:
優(yōu)化后apk大小比較:apk包的大小由68.8MB縮減為51.3MB驻债,比原來(lái)減少了25%
二乳规、尺寸壓縮之后內(nèi)存占用對(duì)比
根據(jù)圖片的寬高生成對(duì)應(yīng)的縮放系數(shù),再根據(jù)該系數(shù)加載對(duì)應(yīng)的bitmap到內(nèi)存中:
fun getLocalBitmapFromResFolder(context: Context?, resId: Int, reqWidth: Int, reqHeight: Int): Bitmap? {
val opts = BitmapFactory.Options()
opts.inJustDecodeBounds = true
var bitmap: Bitmap?
try {
// BitmapFactory.decodeResource(context?.resources, resId, opts)
Log.d("ImageViewUtils:", BitmapFactory.decodeResource(context?.resources, resId).allocationByteCount.toString())
} catch (e: OutOfMemoryError) {
e.printStackTrace()
System.gc()
return null
} catch (e: Exception) {
e.printStackTrace()
return null
}
opts.inPreferredConfig = Bitmap.Config.RGB_565
opts.inTempStorage = ByteArray(10 * 1024 * 1024)
try {
BitmapFactory.decodeResource(context?.resources, resId, opts)
Log.d("ImageViewUtils:原始圖的寬高",opts.outWidth.toString()+","+opts.outHeight)
} catch (e: OutOfMemoryError) {
e.printStackTrace()
System.gc()
return null
} catch (e: Exception) {
e.printStackTrace()
return null
}
try {
opts.inSampleSize = calculateInSampleSize(opts, reqWidth, reqHeight)
Log.i("ImageViewUtils:", "inSampleSize " + opts.inSampleSize)
opts.inJustDecodeBounds = false
bitmap = BitmapFactory.decodeResource(context?.resources, resId, opts)
Log.i("ImageViewUtils:壓縮后的寬高", "w:" + bitmap.width + " h:" + bitmap.height)
Log.d("ImageViewUtils:",bitmap.byteCount.toString())
} catch (outOfMemoryError: OutOfMemoryError) {
outOfMemoryError.printStackTrace()
System.gc()
return null
}
return bitmap
}
//計(jì)算縮放系數(shù)合呐,是2的倍數(shù)
fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
val height = options.outHeight
val width = options.outWidth
var inSampleSize = 1
if (height > reqHeight || width > reqWidth) {
val halfHeight = height / 2
val halfWidth = width / 2
while (halfHeight / inSampleSize > reqHeight && halfWidth / inSampleSize > reqWidth) {
inSampleSize *= 2
}
}
return inSampleSize
}
使用RGB_565格式替代默認(rèn)的ARGB_8888,能減少一半的開(kāi)銷(xiāo)暮的,一個(gè)像素占用2個(gè)字節(jié),而ARGB_8888一個(gè)像素占用4個(gè)字節(jié)淌实,如果圖片對(duì)alpha要求不高冻辩,是一個(gè)不錯(cuò)的選擇。
相同圖片占用堆內(nèi)存比較:占用內(nèi)存字節(jié)數(shù)縮減為原來(lái)的1/4
優(yōu)化前:
優(yōu)化后:
·