瘦身前 android
瘦身後 git
包文件對比
github
類型 | 原始大小 | 當前大小 | 縮減類型 |
---|---|---|---|
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文件 |
優勢:有批量添加工具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處傳入源文件的輸出路徑優化
``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
}
複製代碼
defaultConfig {
resConfigs "zh"
ndk {
abiFilters "armeabi-v7a"
}
}
複製代碼
按照主工程GIF圖片實際展現大小進行適當壓縮ui
由於工程中有視頻拼接功能因此添加了FFmpeg-Android庫文件致使包體積急劇上升,根據項目目前需求可取消對x86平臺的支持spa
不一樣的項目能夠根據不一樣的需求選擇不一樣的方法進行體積壓縮,下面總結常見的apk壓縮技巧
可優化內容以下:
代碼清除(刪除工程中無用代碼,使用第三方包時,儘可能將本身使用的部分源碼拷貝進項目)
圖片資源清除(在項目對分辨率要求不是跟高的前提下能夠只支持 xhdpi xxdpi xxxdpi 甚至能夠只支持xxdpi xxxdpi兩中分辨率 )
webp
tinypng