Apk不得不看的瘦身大全

概述

我日常在项目开发中,刚开始的APK包可能不太大,可是随着时间的变迁,项目的迭代,慢慢的就回发现打出来的APK包愈来愈大,包每大一点可能用户下载的欲望就小一些,因此在日常的项目迭代过程当中,对APK瘦身的工做也要持续进行,这篇文章就会记录一下从几个方面对apk进行瘦身java

APK构成初探

咱们生成一个包,把包拖到Android studio中就能够看到包的构成了android

apk的构成如上图,下面具体看下各个部分都是什么git

  • lib 主要存放针对各个cpu架构的so库
  • classes.dex 是java文件编译生成的字节码文件
  • res 存放资源文件 (图片,布局等等)
  • META-INF 相关签名信息
  • AndroidManifest.xml 配置文件
  • resources.arsc 是资源文件的映射表 资源id和具体资源的路径信息 ,Strings信息直接存在里面

apk的构成咱们已经有了初步的了解,接下来咱们就能够对apk进行瘦身优化了github

优化方案

1.使用minifyEnabled混淆代码

android {
buildTypes {
    release {
        minifyEnabled true
    }
}
}
复制代码

在proguard-rules.pro编写混淆规则web

2.使用shrinkResources 移除无用资源

android {
buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
    }
}
}
复制代码

shrinkResources和minifyEnabled必须同时开启才有效api

特别注意:这里须要强调一点的是开启以后无用的资源或者图片并无真正的移除掉,而是用了一个同名的占位符号,咱们拿图片举例来看一下

(图一)

(图二)微信

如上面两张图所示,best.png图片并无使用到,大小为3.3K,属于无用资源 ,在开启 shrinkResources以后,发现best.png确实打包进apk中了,但大小变成了67B,具体内容是个小黑块的占位符架构

3.删除项目中未使用到的资源文件

咱们经过Android studio提供的lint工具去排查没有使用到的资源文件,而后让无用的资源文件删除掉 经过Analyze - Run Inspection By Name... 选项 ,而后输入 unused resources来查找无用的资源文件工具

如上图所示无用的资源文件就找到了就能够对其进行删除布局

4.删除项目中未使用到的代码

咱们经过Android studio提供的lint工具去排查没有使用到的代码,而后让无用的代码删除掉 经过Analyze - Run Inspection By Name... 选项 ,而后输入 unused declaration来查找无用的代码

如上图所示无用的代码就找到了就能够对其进行删除

特别注意:经过反射引用的方法或者类,lint是识别不了的,也会给检查出来,因此在删除的时候要特别注意,经过的反射引用的方法或者类千万不能删除

5.对图片进行压缩

能够经过如下几种方式就图片进行压缩

  • png图片格式转换成jpg 将一些大图的格式转成jpg格式,将会有效减少图片的体积
  • 经过tinypng网站对图片进行压缩
  • 使用vector矢量图
  • 将图片转换成webP格式的 (右键图片-Conver To webP 进行转换特别注意:webP格式要求最低的api是18 转换以后图片会小不少,以下图所示)

6.使用shape代替图片

不少点击效果或者背景图可能会使用到图片,能够换成shape进行代替实现,可以有效的减小apk大小

7.使用resConfigs进行语言配置

Android应用自己是支持国际化的,但国内的项目好多都是在国内使用,不须要国际化,这时候能够对相关的String进行减法操做,使其只包含特定的语言(例如中文)

android {
defaultConfig {
    ...
    //语言资源,只支持中文
    resConfigs "zh-rCN"
}
}
复制代码

如上图所示经过resConfigs配置,打包进apk的语言就只有中文了

8.使用AndResGuard对资源进行混淆

使用微信大神张绍文的AndResGuard工具对项目的资源文件进行混淆,在压缩apk大小的同时,提高了反破解难度

具体的源码和使用方法以下 [github.com/shwenzhang/…]

9. so库操做

咱们在引入第三方sdk时,有不少sdk都有对应的so库,且给到的so库分好多架构(armeabi,armeabi-v7a,x86等等)

Android系统目前支持如下七种不一样的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起)

全部的架构设备x8六、x866四、armeabi-v7a、arm64-v8a都支持armeabi架构的.so文件,因此咱们能够根据本身的业务需求选择使用armeabi或者armeabi-v7a进行支持

好比 微信,QQ ,网易云音乐等不少大的应用就只保留了armeabi-v7a

android {
defaultConfig {
    ndk {
        abiFilters 'armeabi','armeabi-v7a'
    }
}
}
复制代码

如上图因此优化完成以后apk的lib包中就只有'armeabi','armeabi-v7a'两种架构了

总结

项目瘦身是一项旷日持久的工做,也只有就apk的构成有所了解以后才能更好的对apk进行瘦身,经过上面的步骤以后你的apk必定会有不同的变化