APK瘦身全面总结——如何从32.6M到13.6M

前言

之前我简单介绍了关于svg图片瘦身的问题,在公司,瘦身这个问题是我提出来的,所以这锅我背了。公司项目是32.6M,我给自己的要求就是低于20M。上周花了一个星期瘦身,至于为什么花了一周,主要是svg适配问题我被搞蒙蔽了。然后发现还要改大量代码,想想也就算了,又换了另一种瘦身方法。很多人是因为这标题而来的,怎么可能,32.6M的居然可以变成13.6M。下面容我慢慢道来。

APK结构介绍

classes.dex

classes.dex是Java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。Android模拟器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。另,有人介绍到Dedexer是目前在网上能找到的唯一一个反编译dex文件的开源工具,需要自己编译源代码。

clases2.dex

同上,上面的是对你的java文件的编译,这个是对你所导入的jar文件的编译。

resources.arsc

编译后的二进制资源文件

AndroidMainfest.xml

该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,如要把apk上传到Google Market上,也要对这个xml做一些配置。

assets

assets目录可以存放一些配置文件(比如webview本地资源、图片资源等等),这些文件的内容在程序运行过程中可以通过相关的API获得。

lib

lib目录下的子目录armeabi存放的是一些so文件。这个地方多讲几句,都是在开发过程中摸索出来的。eclipse在打包的时候会根据文件名的命名规则(lib**.so)去打包so文件,开头和结尾必须分别为“lib”和“.so”,否则是不会打包到apk文件中的。其他非eclipse开发环境没有测试过。如果你是用SDK和NDK开发的话,这部分很重要,甚至可以通过把一些不是so文件的文件通过改名打包到apk中,具体能干些什么那就看你想干什么了!

META-INF

META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。

Res目录

这是我们存放xml drawable string color等等一些资源文件。

32.6M-->13.6M

首先,我先声明下,不然我怕会被打,目前13.6M的还在测试中,因为机型问题,目前没法测试。现在稳定包的大小是在19.8M——20.4M。

混淆和去除无用资源

在gradle使用minifyEnabled进行Proguard混淆的配置,可大大减小APP大小

删除无用图片资源

我们公司项目到现在逸代了2年了。可想而知,代码的冗余太多了。版本更新会导致很多资源用不到,然后依旧存在包中。这事我是交给老大的做的,毕竟项目他最熟。于是乎删了差不多100多张图片。因为做了图片适配。所以删除的图片资源差不多是在400张的样子。这样。我们的app包从32.6M变成了26.8M。记得刚打包测试的时候,测试经理来个句。你们这包不对啊,怎么少了6、7M。然后就回了是正常的,说我这边搞完差不多会在20M左右。测试经理:什么?在瘦个20M。这么夸张。我:........好了,不扯了,跑题了。

删除无用resource资源

这个和上面的肯定不一样的。我这边主要还是指xml。首先,我们需要点击Analyze——>Run Inspection by Name...

继续输入:unused resource

直接点ok,然后等待:

看来公司项目还能少个300k~。你们对比着你们的项目一个个的删就行了。

图片瘦身之熊猫大法

前面我也说了。用svg适配改的代码量太大了。于是乎我转用了熊猫瘦身,也就是tinypng。官方网站:https://tinypng.com。下面我从官网给大家介绍下tinypng:

TinyPNG有什么作用?

TinyPNG使用智能有损压缩技术来减小 PNG文件的文件大小。通过选择性地减少图像中的颜色数量,需要较少的字节来存储数据。效果几乎不可见,但它使文件大小有很大的差别!

为什么要使用TinyPNG?

PNG是有用的,因为它是唯一广泛支持的格式,可以存储部分透明的图像。格式使用压缩,但是文件仍然可能很大。使用TinyPNG缩小您的应用程序和网站的图像。它将使用更少的带宽和更快的加载。

它是如何工作的?

当您上传PNG(便携式网络图形)文件时,图像中的相似颜色会合并。这种技术被称为“量化”。通过减少颜色数量,24位PNG文件可以转换为更小的8位索引彩色图像。所有不必要的元数据也会被删除。结果:更好的PNG文件100%支持透明度。有你的蛋糕,吃它了!

它支持到处吗?

TinyPNG生成的文件在所有现代浏览器(包括移动设备)上完美显示。仍然需要支持Internet Explorer 6?它通常忽略PNG透明度并显示实心背景颜色。使用TinyPNG的背景变得透明了。二进制透明度没有任何解决方法!

你为什么创建Tinypng?

我们经常使用PNG图像,但对加载时间感到失望。我们创建TinyPNG在我们的使命,使我们自己的网站更快,更有趣的使用最好的压缩。在2014年,我们添加了JPEG图像的智能压缩,并在2016年,我们添加了对动画PNG的支持。

使用方法

我们看到官网的介绍,在这边上传你的jpg或者png 一次最多20张,每张最大5MB。接下来我们随便来个测试:

从1.4M变成570k。缩了60%。可想而知,熊猫的强大。想要一次上传全部,这tm就尴尬了。一年25美元。你们可以让你们的UI给你们图片的时候就用Tinypng压缩在发过来。不过有的公司就给你个设计稿。那就得自己亲自下手咯~ 熊猫大法VS SVG大法

我对比了熊猫和svg的压缩,前者app'大小是在20.4M,后者是在19.8M。下面上图给你们对比下:

19.8M——13.6M

前面我也说了,这个目前还在测试机型。所以稳定性还没保证。先说说是如何做的把。我们公司项目用到了百度地图SDK。所有用到了so库。

当然我这边只是部分。下面我是搜到了一些关于这些so库的介绍:

mips、armeabi、armeabi-v7a和x86到底是什么

mips:MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),

其机制是尽量利用软件办法避免流水线中的数据相关问题。

armeabi:默认选项,将创建以基于 ARM* v5TE 的设备为目标的库。 具有这种目标的浮点运算使用软件浮点运算。 使用此 ABI (二进制接口)

创建的二进制代码将可以在所有 ARM* 设备上运行。所以armeabi通用性很强。但是速度慢

armeabi-v7a:创建支持基于 ARM* v7 的设备的库,并将使用硬件 FPU 指令。armeabi-v7a是针对有浮点运算或高级扩展功能的arm v7 cpu。

x86:支持基于硬件的浮点运算的 IA-32 指令集。x86是可以兼容armeabi平台运行的,无论是armeabi-v7a还是armeabi,同时带来的也是性能上的损耗,

另外需要指出的是,打包出的x86的so,总会比armeabi平台的体积更小。

小结

如果项目只包含了 armeabi,那么在所有Android设备都可以运行; 如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行;

如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的; 如果同时包含了 armeabi, armeabi-v7a和x86,

所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。

所以,这个还是需要根据用户的机型来判断,目测我这边还在测试中,如果没问题。大小基本就在13.6M左右了。

总结

我们需要对APP瘦身的时候需要了解他的结构,就像我第一次做瘦身的时候,虽然解决了,不过对各种问题都是属于一脸蒙蔽的情况。所以,我们需要要了解apk包下每个文件都是干嘛的,做了什么,是否有用。只要你用心去做,就一定可以解决。就像我当初给自己的目标是小于20M一样。虽然现在和20M差不多。不过如果那边测试可以通过。那便是13.6M而不是20M。希望我的方法能帮助到你们。欢迎讨论~~~

原文发布于微信公众号 - 我就是马云飞(coding_ma)

原文发表时间:2017-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Material Design组件

Human Interface Guidelines — Custom Keyboards

15230
来自专栏李成熙heyli

从工程化角度讨论如何快速构建可靠React组件

前言 React 的开发也已经有2年时间了,先从QQ的家校群,转成做互动直播,主要是花样直播这一块。切换过来的时候,业务非常繁忙,接手过来的业务比较凌乱,也没有...

27960
来自专栏小文博客

抓取全站图片的几个思路

好久没更新文章,最近确实忙,今天抽点时间写写我最近忙着优化网站图片的事。由于本站使用的图床SM.MS,近期不少使用电信和联通运营商的朋友说图片加载慢,网站加载完...

27220
来自专栏张戈的专栏

实测Nginx服务器开启pagespeed加速效果

上周有一个站长问到我一个问题,问 fastcgi_cache 和 pagespeed 加速有没有冲突。略微想了下,2 个都是比较原生的主,应该不存在兼容问题。 ...

68090
来自专栏北京马哥教育

手把手教你从无到有写一个运维APP

? 由于自己现在无业游民,所以没有什么现成的环境,环境就随便找个公网的。再者当下的完成度应该算不上一个完整的 APP,但是作为参考,依瓢画葫芦绝对足够了,如果...

43260
来自专栏FreeBuf

实现一个简单的Burp验证码本地识别插件

为什么要写一个这个东西呢?虽然现在好多大网站都不用图片验证码了,但是仍然有一部分陈旧的web系统用着一些简单的图片验证码。当遇到带有验证码,而验证码的形式又非常...

21240
来自专栏FreeBuf

iOS“远程越狱”间谍软件Pegasus技术分析

上周苹果紧急发布了iOS 9.3.5,修复了三个0day漏洞,这3个漏洞能让攻击者对全球范围内的iPhone进行监听。 ? 这三个漏洞被爆出的起因是因为以为阿联...

98580
来自专栏肖洒的博客

【python】【Djang】GPS/北斗串口数据实时定位百度地图

本项目为从串口读取GPS/北斗设备接收数据,进行处理后使用百度地图api实时显示定位。

1.3K20
来自专栏北京马哥教育

Linux 新手必会的21条命令合集

23470
来自专栏大数据文摘

手把手 | 范例+代码:一文带你上手Python网页抓取神器BeautifulSoup库

22630

扫码关注云+社区

领取腾讯云代金券