瘦身前 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