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

相关文章
相关标签/搜索