APK體積壓縮整理記錄

包結構分析對比

瘦身前 android

before

瘦身後 git

after

包文件對比
github

compare

類型 原始大小 當前大小 縮減類型
resource.arsc 1.9M 855.9KB 國際化資源文件,當前僅保留zh
res/ 14.3M 6.7M 圖片轉爲webp
assets 42M 21.1M 減小FFmpeg x86平臺編譯文件
lib 28M 6.6M 減小x86平臺下的so文件

一、圖片資源優化

tinypng

  • 優勢:無兼容性問題
  • 缺點:壓縮繁雜需上傳至網頁下載,不支持批量壓縮替換

webp

  • 優勢:有批量添加工具cwebp,可實現批量替換,後期可考慮將webp壓縮添加到自動化打包流程中golang

  • 缺點:有兼容性問題,WebP格式是從Android4.0版本開始支持;Android4.0到Android4.2.1之間的版本不支持無損壓縮和透明格式的WebP圖片的編解碼web

最終通過查看用戶手機型號及版本範圍分佈決定使用webp優化圖片資源,固然若是經過Android studio 一個一個的將圖片轉換爲webp顯然是很是耗時且易出錯的,Google官方提供了cwebp工具可使用腳本批量壓縮替換,具體語法以下:bash

execCommand("cwebp", "-q", "80", in, "-o", out)工具

-q 後面的80表示壓縮比率爲源文件的80%
in 此處傳入源文件目錄進行替代
-o 後面的 out處傳入源文件的輸出路徑優化

圖片批量替換爲Webp
``golang``
package main

var fileRealPath string

func init() {
	fileRealPath = "/Users/aihuishou/Desktop/opt_rn/android"
	//fileRealPath = getCurrentDirectory()
}

func main() {
	getFileList(fileRealPath)
}

func getFileList(filep string) {
	err := filepath.Walk(filep, func(path string, f os.FileInfo, err error) error {
		if f == nil {
			return err
		}
		if f.IsDir() {
			return nil
		}

		png2webp(f.Name(), path)
		//deleteWebp(f.Name(),path)
		return nil
	})
	if err == nil {
		fmt.Println("轉換完畢")
	}
}

// 經過cwebp命令批量替換png圖片
func png2webp(name string, path string) {
	var isLauncher = strings.HasPrefix(name, "ic_launcher")

	var isPng = strings.HasSuffix(name, ".png")

	var isJpg = strings.HasSuffix(name, ".jpg")

	var is9png = strings.HasSuffix(name, ".9.png")

	// 對png和pjg同時進行處理,排除掉應用圖標及.9圖
	if isPng && !isLauncher && !is9png || isJpg {

		var out string
		if isJpg {
			out = strings.TrimSuffix(path, ".jpg") + ".webp"
		}
		if isPng {
			out = strings.TrimSuffix(path, ".png") + ".webp"
		}

		cmdErr := execCommand("cwebp", "-q", "80", path, "-o", out)

		if cmdErr {
			println(path, " 替換爲 =======> ", out)
			del := os.Remove(path)
			if del == nil {
				println(path, " 刪除成功!")
			}
		}
	}
}

// 刪除當前目錄中的webp文件
func deleteWebp(name string, path string) {
	var isweb = strings.HasSuffix(name, ".webp")

	if isweb {
		del := os.Remove(path)
		if del == nil {
			println(path, " 刪除成功!")
		}
	}
}

// 執行cwebp轉換命令
func execCommand(commandName string, params ...string) bool {
	cmd := exec.Command(commandName, params...)

	//顯示運行的命令
	fmt.Println(cmd.Args)

	stdout, err := cmd.StdoutPipe()

	if err != nil {
		fmt.Println(err)
		return false
	}

	cmd.Start()

	reader := bufio.NewReader(stdout)

	//實時循環讀取輸出流中的一行內容
	for {
		line, err2 := reader.ReadString('\n')
		if err2 != nil || io.EOF == err2 {
			break
		}
		fmt.Println(line)
	}

	cmd.Wait()
	return true
}

複製代碼

二、主工程瘦身

  • 主工程刪除x86平臺支持
  • 主工程resConfigs設置爲zh,僅支持中文語言包
defaultConfig {
        resConfigs "zh"
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
複製代碼
  • 主工程gif圖片壓縮

按照主工程GIF圖片實際展現大小進行適當壓縮ui


三、三方庫瘦身

由於工程中有視頻拼接功能因此添加了FFmpeg-Android庫文件致使包體積急劇上升,根據項目目前需求可取消對x86平臺的支持spa

  • 下載FFmpeg-Android源文件講asset中x86下的FFmpeg文件刪除,設置ABI平臺僅支持armeabi-v7a
  • 刪除項目中歷史冗餘代碼

後記

不一樣的項目能夠根據不一樣的需求選擇不一樣的方法進行體積壓縮,下面總結常見的apk壓縮技巧

  • 冗餘代碼和資源文件清除

可優化內容以下:

代碼清除(刪除工程中無用代碼,使用第三方包時,儘可能將本身使用的部分源碼拷貝進項目)

圖片資源清除(在項目對分辨率要求不是跟高的前提下能夠只支持 xhdpi xxdpi xxxdpi 甚至能夠只支持xxdpi xxxdpi兩中分辨率 )

  • 圖片大小優化

webp
tinypng

  • 代碼混淆
  • 資源混淆

AndResGuard

相關文章
相關標籤/搜索