apk瘦身之旅,你了解多少

类比于微信,如何对Apk进行极限压缩,谈下Android压缩8大步 一、简介 随着项目的不断迭代,代码量跟资源文件不断增多。那么就会出现打包后的 APK 文件越来越大,如果突然有一天你们老板或领导叫你优化 APK 大小,你还不知道怎么优化那就有点说不过去了,这篇文章咱们就来一起分析并优化 APK 体积大小吧。 分析 APK 资源占用 二、注意: 我是在 GitHub 找了一个人气比较高的开源项目,需要的话自己可以点击下载,自己动手尝试一番. 分... 阅读详情

我们完成一个app后,都需要生成一个apk,然后上线,而apk的大小也一定程度的影响了用户是否愿意下载你的这个app,所以也就有了apk瘦身这门艺术。

目录

  • apk的结构
  • 图片压缩
    • 导入矢量图
    • 适配问题
    • Tint 着色器
  • 动态库移除
    • so库的相关知识点
    • ABI
  • 结束语

apk的结构

既然要对一个apk瘦身,首先我们就得知道apk格式的文件内容。实际上一个apk文件就是一个zip包,我们只需要将后缀改为zip,然后进行解压就可以看到里面的内容了。下面我们来看下它里面的文件以及作用:

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

各版本分析如下:

  • mips / mips64:极少用于手机可以忽略
  • x86 / x86_64:x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现 对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的
  • armeabi:ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈
  • armeabi-v7a:ARM v7 目前主流版本
  • arm64-v8a:64位支持

所以现在我们一般只要在项目的build.gradle中适配ARM v7就行了,如下:

请添加图片描述

结束语

好的,今天我们就暂时介绍到这儿,瘦身之旅长路漫漫,还有的方式我们下次分享。

未完待续。。。

有想看视频的朋友可以点击观看哦
https://www.bilibili.com/video/BV1qp4y1U731?spm_id_from=333.999.0.0

Android性能优化——APK瘦身大全 作者:猩程变  来源:掘金 瘦身原因 Apk的大小对于用户是否选择下载应用起着至关重要的影响,也会是成为用户活跃度的原因之一 APK组成 我们都知道apk是由: . asserts . lib . res . dex . META-INF . androidManifest </pre> 这几个部分构成的。 通常来说我们可以AndroidStudio自带的Analyze APK工具进行APK的资源分析. 阅读详情

相关推荐

减小 APK 大小的有效方法是在 Android Studio 中对静态内容使用 Gzip

zip 在不丢失数据的情况下压缩和解压缩文件,减小文件大小以加快传输速度。它通常用于通过 Internet 传输文件和压缩静态 Web 内容。它得到广泛支持和普遍使用。Gzip 在 Android 开发中可用于压缩静态内容文件,例如字体、图像和脚本,以减小它们的大小并提高应用程序性能。压缩这些文件可以加快应用程序的加载速度,尤其是在网络连接速度较慢或处理能力有限的设备上。此外,较小的文件大小可以减少应用程序的下载大小,使用户更容易下载和安装。

iCloudEnd的博客 890

Android性能优化之应用瘦身(APK瘦身)

APK瘦身优化的优先级相对来说是比较低的,因为优化后也并不能明显的看到有什么好处,这一块主要影响转换率,应用越小, 可能用户下载的意愿就越高,另外在进行预装时,也有大小的要求。

fumeidonga的博客 1939

我的Android进阶之旅------>Android APP终极瘦身指南

首先声明,下面文字转载于:APK瘦身实践http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/Android APP终极瘦身指南http://www.jayfeng.com/2016/03/01/Android-APP%E7%BB%88%E6%9E%81%E7%98%A6%E8%BA%AB%E6%8C%8

字节卷动 7879

六个小技巧帮你瘦身Android APK

Android应用的大小对用户体验和应用性能至关重要。大型APK文件会增加应用的安装时间,启动时间和页面加载时间,降低了用户体验。因此,APK瘦身是Android开发中的重要任务。在本文中,我们将分享6个小技巧,帮助你优化和瘦身Android应用,提高性能和用户体验。在开始深入研究APK瘦身之前,让我们先了解为什么它如此重要。Android应用通常包含大量资源文件,如图像、音频和布局文件。优化这些资源文件是APK瘦身的第一步。应用的代码也是APK体积的一个关键因素。

Eqiqi的博客 2128

手把手教你用Keil5和Proteus8给51单片机跑个流水灯(附完整源码+安装包)

本文详细介绍了如何使用Keil5和Proteus8为51单片机实现流水灯效果,包括开发环境配置、汇编代码编写、电路设计及仿真调试。通过完整的源码和安装包,帮助初学者快速掌握C51单片机开发的核心流程,适合嵌入式开发入门学习。

weixin_42632434的博客 372

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

她是不会无条件的!! 2万+

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

转载请声明出处!

2401_89872893的博客 1115

Educoder | 计算机网络实验-Ping命令与ICMP协议分析

任务描述本关任务:捕获 Ping 程序生成的数据包。相关知识ping命令Ping 程序是一个简单的工具,允许任何人(例如:网络管理员)验证主机是否存在。源主机中的 Ping 程序将数据包发送到目标 IP 地址;如果目标是在线的,则目标主机中的 Ping 程序将会发送响应 Ping 数据包证明他在线,这两个 Ping 数据包都是 ICMP 数据包。在 Unix/Linux,序列号从 0 开始计数,依次递增。而 Windows 中 ping 程序的 ICMP 序列号是没有规律;;。

Mksg_28的博客 7627

杰哥的APK瘦身实践之旅——启动篇

很久之前就想写这个系列了,APK体积优化的文章收集了一大堆,却一直没动手去尝试,手痒得很。

m0_64420071的博客 319

硬件笔记——HDMI接口

HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。

2501_94625908的博客 543

46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)

在上章我们学习了45.qt quick-qml虚拟软键盘详解(一)_诺谦的博客-优快云博客 接下来我们便来自定义一款好看的qml软键盘.如下图所示: 支持背景更换、支持动图: 支持动态加载移除语言: 支持拖拽、自由缩小放大: 支持定位坐标: ...

抵抗时间扭曲,坚持做一件有意义的事 4674

集成环信后APK瘦身之旅

前言apk瘦身作为性能优化的一部分,它的大小决定安装的时间与占用的内存,进行针对性的瘦身也能够提高用户体验,下面我来讲一下我在集成了环信3.xSDK是怎么将暴涨的apk降下来的。(PS:集成环信后apk体积大约增加了18M左右)1.删使用Android Studio我们可以通过Lint删除没有用过的资源: 选择inspect code…项目中集成了环信SDK,看个人项目的需求来,如果不需要全盘使用它

qq_16701803的博客 371

第十六篇:Camx IFE 、OPE 各 port口功能定义

需要注意的是,类似 CSLTFEPortIdRawDump 是没有downscale功能的,所以如果遇到fov不正确的问题,可以排除下TFE这边的 output port是否被接到了 CSLTFEPortIdRawDump 上面来。我们知道Camx 的IFE 、OPE有不少的output port,各个port是有哪些功能的呢?老一点的框架平台,采用的TEF、OPE。

235

Android APK瘦身之旅

从APK的文件结构说起 APK在安装和更新之前都需要经过网络将其下载到手机,如果APK越大消耗的流量就会越多,特别是对于使用移动网络的用户来讲,消耗流量越多就代表需要花更多的钱去购买流量。同时一些第三方应用商城也会对上传的APK大小有限制,所以为了能够让产品能够更受商城和用户欢迎,APK瘦身是第一步,更小的APK标示着更多地用户愿意去下载和体验。   为了能够减小APK的大小,首先需要知道

明风的博客 1991

小龙虾们的好伙伴专栏导航

本文系统解析了OpenClaw技术架构,包括Channel层和网关层的设计实现,并与AgentSkills等技术方案进行对比。同时提供了OpenClaw的系列实用指南,涵盖小龙虾培养、客户资源管理、系统自动化巡检以及技术趋势助手构建等应用场景,帮助用户从零成本入门到高效落地应用,实现业务全流程自动化管理。

wend的博客 214

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

(二十)Apk 瘦身

版权声明:本文为博主原创文章,未经博主允许不得转载。 本文纯个人学习笔记,由于水平有限,难免有所出错,有发现的可以交流一下。

孤独灬啸月 286

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

代数数据类型:用与和类型建模,穷尽检查让编译器兜底

编程中表达“多选一”的状态往往依赖可空字段和无数if/switch,难以抵御漏判和类型错配。代数数据类型(ADT)由“与”的积类型和“或”的和类型组合而成,将类型结构映射为数学运算,配合模式匹配与穷尽检查,能在编译期发现未处理分支。这种类型安全的设计在Rust、TypeScript、Swift、Kotlin和Java中已逐渐成为通用建模范式,适合支付系统、递归树结构等真实工程场景。本文梳理ADT的历史脉络,对比继承、枚举、Visitor等六种替代方案的局限,并通过案例展示如何用ADT构建可扩展业务模型,最后

weixin_34245749的博客 306

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

apk优化-apk瘦身

瘦身的目的,主要来自客户层面一个apk如果太大了的话给用户带来的直接影响就是用户要花费更多的流量去下载apk,如果用户是在wifi情况下还算好如果是移动数据情况下会大大降低用户体验,对于我们程序员来说,是一种优化改进技术的机会。优化之前我们来看一下我们的apk的结构 这里有个前提是我们的工程没有引入NDK 接下来我们看一个引入了.so文件的工程 这里我们逐条分析1.图片的优化(针对re

MarsKang的博客 454

Android APK瘦身终极方案:AndResGuard资源混淆实战指南 [特殊字符]

在当今移动应用竞争激烈的环境中,**APK瘦身**已成为每个Android开发者必须面对的重要课题。微信团队开源的**AndResGuard**工具,作为Android资源混淆的终极解决方案,能够显著减小APK体积,提升应用性能和安全防护能力。本文将为你详细介绍如何通过AndResGuard实现高效的APK资源优化。 ## 🔍 什么是AndResGuard? **AndResGuard**是

gitblog_00596的博客 1102

android:app瘦身之旅

随着app添加或者替换的功能越来越多,app的体量越来越大,考虑到app体量影响到的用户体验和下载欲望,项目就开始了瘦身之旅。虽然和道长一样瘦身是痛苦的,但是还好有一些成果,不像道长的体重一样……这里和小伙伴们分享一下。一、apk的组成app瘦身之前,我们首先需要了解安装包的组成结构: dex文件 我们编写的所有Java代码都会由编译器转化成dex文件 res文件夹 存放所有的资源文件 lib文

雨山的博客 1220

apk瘦身之旅,android系统工程师面试题

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。Android学习PDF+学习视频+面试文档+知识点笔记【Android高级架构视频学习资源】8)]Android学习PDF+学习视频+面试文档+知识点笔记【Android高级架构视频学习资源】

bq520111的博客 862

Flutter for OpenHarmony 实战之进阶:第七十篇 应用包体积优化与瘦身秘籍

优化项原始大小优化后收益率图片资源 (全 WebP 化)12.5 MB4.2 MB66.4%字体资源 (字符剪裁)8.8 MB0.6 MB93.2%代码 AOT (混淆与摇树)15.2 MB11.5 MB24.3%引擎分离 (HSP 化)35.0 MB共享100%瘦身不是简单的删除,而是对每一行代码和每一张图片的“精打细算”。通过本篇的实战,相信你的应用已经脱胎换骨,具备了在应用市场中“轻装上阵”的实力。从下一篇起,我们将正式开启“性能调优与鸿蒙原生挖掘”的进阶之旅。

好代码自己会说话,烂代码才需要注释来圆谎 9686
上一篇: 对于Handler是怎么进行线程通信,它的原理又是什么,你了解多少?
下一篇: IO框架学习
AndroidYingZi
博客等级 码龄6年 6粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值