apk瘦身;如何缩小体积呢?这篇文章来教你

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

apk包含以下目录:

  • assets/: 包含了应用的资源,这些资源能够通过AssetManager对象获得。
  • lib/: 包含了针对处理器层面的被编译的代码。这个目录针对每个平台类型都有一个子目录,比如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64和mips。
  • res/: 包含了没被编译到resources.arsc的资源。
  • META-INF/: 包含CERT.SF和CERT.RSA签名文件,也包含了MANIFEST.MF文件。(译注:校验这个APK是否被人改动过)

apk包含以下文件:

  • classes.dex: 包含了能被Dalvik/Art虚拟机理解的 dex 文件格式的类。
  • resources.arsc: 包含了被编译的资源。该文件包含了res/values目录的所有配置的 xml 内容。打包工具将 xml 内容编译成二进制形式并压缩。这些内容包含了语言字符串和styles,还包含了那些内容虽然不直接存储在resources.arsc文件中,但是给定了该内容的路径,比如布局文件和图片。所以又叫 资源映射表
  • AndroidManifest.xml: 包含了主要的Android配置文件。这个文件列出了应用名称、版本、访问权限、引用的库文件。该文件使用二进制 xml 格式存储。(译注:该文件还能看到应用的minSdkVersion, targetSdkVersion等信息)

好的,现在我们已经知道apk到底是个什么东东了,接下来我们开始一步步对这些内容进行瘦身处理。

图片压缩

我们都知道,一个apk会使用大量的图片,如果图片这块能够压缩下,那效果还是非常可观的。

如下图,我们在项目中经常会用到这样的套图。

明明只是一种图片,而我们却因为大小和颜色,需要这样的一组,显然很占大小,那有没有什么方式优化下呢?

答案是有的。

谷歌的AS为我们提供了一个名为 Vector Asset Studio 的工具,可以帮助我们添加内置Material图标以及将本地的SVG(Scalable Vector Graphics 可缩放矢量图)等格式作为矢量图资源导入到项目中,会在drawable目录下生成一个根节点为vector的xml文件,而且矢量图的大小也更小,是不是非常棒啊!那下面我们来看看怎么实现的。

导入矢量图

首先我们在AS中运行Vector Asset Studio,步骤是:右键点击你工程中的res文件夹,然后选择 New --> Vector Asset,此时会弹出下面对话框,选择图中标记的对应操作即可导入内置Material图标或者SVG矢量图。

但是上面这种方式只能一张张导入图片,显然很麻烦。那有没有更好的方式了?实际上我们之所以要用这个工具导入svg图片,而不是直接将svg图片复制到drawable中,是因为安卓不支持svg,需要工具转换下,所以我们可以使用svg2vector这个第三方库进行批量转换,然后直接复制到drawable中即可,转换命令如下:

java -jar svg2vector-cli-1.0.0.jar -d . -o a -h 20 -w 20

-d 指定svg文件所在目录
-o 输出android vector图像目录
-h 设置转换后svg的高
-w 设置转换后svg的宽

适配问题

因为矢量图是在Android 5.0(API21)才开始支持的,所以这个地方我们还需要适配下。如果不适配,你的最小minSdkVersion版本又小于21,则会自动在每个drawable目录下生成对应的png图片,反而会使apk包变大,所以这里一定要注意了。我们有下面两种方式进行适配:

方式一:生成 png 格式的图片

这种方式是在drawable文件中生成对应的png,不过我们可以指定只生成哪几个。例如如下配置

我们可以在项目的build.gradle中进行如下配置,即可在指定的drawable文件中生成对应的png格式图片。

方式二:支持库

还一种方式就是使用支持库,支持库的版本需要23.2或者更高,也是在项目的build.gradle中进行配置,如下:

这种适配方式使用图片的时候,需要用 app:srcCompat 属性,而不是 android:src,如下:

通过这个方式只是解决了不同大小需要多张图片的问题,但是还需要有不同颜色的图片。这个我们怎么处理呢?不要急,这个问题谷歌工程师也为我们准备了一个工具,它就是Tint着色器。

Tint 着色器

一般我们矢量图都是使用黑色,然后由Tint着色器去修改颜色,直接在xml中使用即可,如下:

在java代码中,我们可以通过DrawableCompat去设置,如下:

那如果想要实现按键效果,通过 Tint 也能实现吗?答案是可以的。

首先我们需要创建两个选择器,一个是 drawable 选择器,一个是 color 选择器,如下:

然后就可以直接使用了,如下:

总的来说使用Tint找色器去修改矢量图的颜色还是蛮简单的吧。

通过矢量图这个方式,我们就能够减小使用图片的总大小,从而减小apk的大小。

瘦身不是一蹴而就的,所以我们接着减。

动态库移除

so库的相关知识点

说到so库,相信大部分人都有使用过,但是却不知道它到底是什么。其实so库就是由ndk编译出来的动态库。

那我们为什么要把so文件分别放在armeabi、arm64-v8a、armeabi-v7a、x86、x86_64这些文件中呢?

主要是因为我们的app运行在不同的手机中,而so库是由c\c++编译的,不是跨平台的,所以不同平台(不同CPU)需要使用不同的so库。那不同的文件是什么意思呢?我们接着往下看。

ABI

ABI 是应用程序二进制接口简称(Application Binary Interface),定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI,即:armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips,mips64。

ABISupported Instruction Set(s)
armeabiARMV5TE and later,Thumb-1
armeabi-v7aarmeabi,Thumb-2,VFPv3-D16,Other,optional
arm64-v8aAArch-64
x86x86(IA-32),MMX,SSE/2/3,SSSE3
x86_64x86-64,MMX,SSE/2/3,SSE3,SSE4.1,SSE4.2,POPCNT
mipsMIPS32r1 and later
mips64MIPS64r6

最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值