首先可以将apk直接拖入android studio 就可以显示app各个部分所占用的空间大小,然后进行分析,点击各个条目会显示各个模块的占用大小

apk瘦身

 

 

1.assets精简
存放在assets下的文件不会生成ID,存放的文件形式可以是多样的比如音频、图片、html相关的等等,精简体积也就是精简这些内容。

(1)音频:主要用在铃声和通知方面,体积不要太大,使用压缩格式的音频

(2)图片:在不降低图片效果、保证APK显示效果的前提下缩小图片文件大小。

a、使用tinypng优化大部分图片资源

tinypng的缺点是在压缩某些带有过渡效果(带alpha值)的图片时,图片会失真,这种图片可以采用webP格式,保证图片质量前提下大幅减少图片的大小。
https://tinypng.com/

b、使用webP图片格式

webP是一种支持有损和无损压缩的网络图片格式,如果在 App 中使用 WebP,除了 Android4.0 以上提供的原生支持外,其他版本以可以使用官方提供的解析库webp-android-backport编译成so使用,通常UI提供的图片都是png或者jpg格式,
我们可以通过智图或者isparta将其它格式的图片转换成webP格式,isparta可实现批量转换。

如果png大图转成jpg还是很大,或者想压的更小,而尽量不降低画质,那么可以考虑一下webp。

c. png换成jpg
经验发现,一些背景,启动页,宣传页的PNG图片比较大,这些图片图形比较复杂,如果转用有损JPG可能只有不到一半(当然是有损,不过通过设置压缩参数可以这种损失比较小到忽略)。
因为都是大图,所以这种方式能有效减小apk的大小。
这种情况下的apk的减小是不可估量的。

----------------------------------------------------------------------------------------------------

2.classes.dex
(1)尽量使用系统提供的字符串、ID、图片资源等

(2)优化代码结构,减少冗余代码

(3)使用shape来替换图片,能用代码实现的图片样式都用代码实现

(4)使用Proguard对代码进行混淆、优化和压缩,它有一个专门用来减少apk文件大小的功能叫做 tree-shaking。
Proguard 会遍历你的所有代码然后找出无用处的代码。所有这些不可达(或者不需要)的代码都会在生成最终的apk文件之前被清除掉。Proguard 也会重命名你的类属性,类和接口,然整个代码尽可能地保持轻量级水平。

(5)静态代码分析工具,无需运行,无需测试用例 扫描整个项目,分析以下潜在的问题,分类指出问题描述、问题位置,

3.lib
在手机上一般只要支持armabi就可以了对于x86的不需要,所以引入第三方库的时候把用不到的so删除掉。

4.使用一套资源
对于绝大对数APP来说,只需要取一套设计图就足够了。鉴于现在分辨率的趋势,建议取720p的资源,放到xhdpi目录。 
相对于多套资源,只使用720P的一套资源,在视觉上差别不大,很多大公司的产品也是如此,但却能显著的减少资源占用大小,顺便也能减轻设计师的出图工作量了。 
注意,这里不是说把不是xhdpi的目录都删除,而是强调保留一套设计资源就够了。

5.开启shrinkResources去除无用资源
在gradle使用shrinkResources去除无用资源,效果非常好。

android {
    buildTypes {
        release {
            shrinkResources true
        }
    }
}

6.缩小大图
如果经过上述步骤之后,你的工程里面还有一些大图,考虑是否有必要维持这样的大尺寸,是否能适当的缩小。 
事实上,由于设计师出图的原因,我们拿到的很多图片完全可以适当的缩小而对视觉影响是极小的。

7.支持插件化
插件化技术支持动态的加载代码和动态的加载资源,把APP的一部分分离出来了,对于业务庞大的项目来说非常有用,极大的分解了APP大小。 
因为插件化技术需要一定的技术保障和服务端系统支持,有一定的风险,如无必要(比如一些小型项目,也没什么扩展业务)就不需要了,建议酌情选择。

a.表情包在线化
虽然应用的表情不多,只有50来个,但是如果能把这部分表情放到网上,不仅能有效减小apk大小,还可以方便后期扩展支持:


8.清理第三方库和冗余代码
版本迭代过程中,因为删减功能经常有冗余代码和第三方库留下,这或多或少都会增加包体,这种情况没有捷径,
只能每个文件查找,这是苦力活。还有要查看第三方库有没可能精简,比如谷歌分基础、广告和分析包,网络库、supportv4等,

.去除重复库
发现两个地方:

现在发现七牛的SDK引用了android-async-http-1.4.6.jar,虽然不大,只有95.4k,但是感觉完全可以写一个轻量级的jar,控制在10~20k就足够了,具体可以在现有的网络库上实现。
自己工程使用的是UIL,但是引入的第三方库引用了picasso,两个重复的图片下载库也是完全没用必要的。

9.使用HTML5进行界面开发
       项目中针对新闻、咨询类需求的详情页,可以使用HTML5进行开发,这样可以大大减少使用原生控件开发带来的额外空间开销。

相关文章: