我平常在项目开发中,刚开始的APK包可能不太大,但是随着时间的变迁,项目的迭代,慢慢的就回发现打出来的APK包越来越大,包每大一点可能用户下载的欲望就小一些,所以在平常的项目迭代过程中,对APK瘦身的工作也要持续进行,这篇文章就会记录一下从几个方面对apk进行瘦身
我们生成一个包,把包拖到Android studio中就可以看到包的构成了
apk的构成如上图,下面具体看下各个部分都是什么
apk的构成我们已经有了初步的了解,接下来我们就可以对apk进行瘦身优化了
android { buildTypes { release { minifyEnabled true } } } 复制代码
在proguard-rules.pro编写混淆规则
android { buildTypes { release { minifyEnabled true shrinkResources true } } } 复制代码
shrinkResources和minifyEnabled必须同时开启才有效
特别注意:这里需要强调一点的是开启之后无用的资源或者图片并没有真正的移除掉,而是用了一个同名的占位符号,我们拿图片举例来看一下
(图一)
(图二)
如上面两张图所示,best.png图片并没有使用到,大小为3.3K,属于无用资源 ,在开启 shrinkResources之后,发现best.png确实打包进apk中了,但大小变成了67B,具体内容是个小黑块的占位符
我们通过Android studio提供的lint工具去排查没有使用到的资源文件,然后让无用的资源文件删除掉 通过Analyze - Run Inspection By Name... 选项 ,然后输入 unused resources来查找无用的资源文件
如上图所示无用的资源文件就找到了就可以对其进行删除
我们通过Android studio提供的lint工具去排查没有使用到的代码,然后让无用的代码删除掉 通过Analyze - Run Inspection By Name... 选项 ,然后输入 unused declaration来查找无用的代码
如上图所示无用的代码就找到了就可以对其进行删除
特别注意:通过反射引用的方法或者类,lint是识别不了的,也会给检查出来,所以在删除的时候要特别注意,通过的反射引用的方法或者类千万不能删除
可以通过以下几种方式就图片进行压缩
很多点击效果或者背景图可能会使用到图片,可以换成shape进行代替实现,能够有效的减少apk大小
Android应用本身是支持国际化的,但国内的项目好多都是在国内使用,不需要国际化,这时候可以对相关的String进行减法操作,使其只包含特定的语言(例如中文)
android { defaultConfig { ... //语言资源,只支持中文 resConfigs "zh-rCN" } } 复制代码
如上图所示通过resConfigs配置,打包进apk的语言就只有中文了
使用微信大神张绍文的AndResGuard工具对项目的资源文件进行混淆,在压缩apk大小的同时,提升了反破解难度
具体的源码和使用方法如下 github.com/shwenzhang/…
我们在引入第三方sdk时,有很多sdk都有对应的so库,且给到的so库分好多架构(armeabi,armeabi-v7a,x86等等)
Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起)
所有的架构设备x86、x8664、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一定会有不一样的变化