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

前言

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

APK结构介绍web


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文件的开源工具,须要本身编译源代码。 shell

clases2.dex

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

resources.arsc 安全

编译后的二进制资源文件 网络

AndroidMainfest.xml

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

assets

assets目录能够存放一些配置文件(好比webview本地资源、图片资源等等),这些文件的内容在程序运行过程当中能够经过相关的API得到。 app

lib

lib目录下的子目录armeabi存放的是一些so文件。eclipse

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

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。记得刚打包测试的时候,测试经理来个句。大家这包不对啊,怎么少了六、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。 x

86:支持基于硬件的浮点运算的 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。但愿个人方法能帮助到大家。

本文写于一年半前,做者:马云飞,原文连接:https://blog.csdn.net/sw950729/article/details/64919051

更多文章请关注个人公众号:

相关文章
相关标签/搜索