app瘦身处理

本文介绍APK瘦身的方法,包括代码与资源文件优化、图片处理技巧、动态库配置策略等,探讨如何减小APK体积,提升应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.app包的大小组成

一般由代码的dex文件和.so文件以及资源文件图片(drawable,mipmap)文本(string多国语言)等资源组成。

对于代码文件的优化一般思路是取代无用代码比如开启无用代码过滤压缩平台过滤等。

对于资源文件思路是满足当前手机需要去除无用资源,资源格式转化和压缩等。

2.图片资源处理

1.图片类型

png和jpg的区别

png 资源大 编码简单 运行效率高 占用内存大 

jpg 资源小 编码复杂 运行效率低 占用内存小

WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都相当优秀、稳定和统一。

2.图片压缩方式

哈夫曼压缩算法

3.图片png压缩

压缩地址:https://tinypng.com

4.套图转svg图片

公开免费的阿里svg库:https://www.iconfont.cn

svg转化的操作

下载批量转化工具

https://github.com/MegatronKing/SVG-Android

tint改变矢量图的颜色

Tint 是 Android5.0 引入的一个属性,它可以在Android5.0 系统上,对视图进行颜色渲染。Tint的存在一定程度上减少了我们对图片的需求以及apk的大小。

使用场景主要是:1.一张矢量图适配所有颜色。2.一张图片实现 selector

5.启动图片设置成webp格式或者进行压缩将启动大图体积减少

6.Android加载图片资源的原理

1.图片大小计算:

大小 = 长*宽*图片通道

图片通道对于的大小

ALPHA_8 -- (1B)
RGB_565 -- (2B)
ARGB_4444 -- (2B)
ARGB_8888 -- (4B)
RGBA_F16 -- (8B)

3.string类型优化(国际化优化)

resConfig 'en' //只适配英文

4.动态库打包配置

armeabi,armeabi-v7a,armeabi-v8a的区别

armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。

armeabi-v7a: 第7代及以上的 ARM 处理器。现在armeabi-v7a只存在少部分老旧手机

armeabi-v8a: 第8代、64位ARM处理器。在2011年11月,ARM公司发布了新一代处理器64位架构ARMv8的部分技术细节(也就是我们常说的Cortex-A57A53)。64位ARMv8架构中包含两个执行状态:AArch32(也就是我们常说的ARMv7)和AArch64(ARMv8)。AArch64执行状态针对64位处理技术,引入了一个全新指令集A64(也就是基于收购的MIPS64架构),而AArch32执行状态将支持现有的ARM指令集。所以64位的ARM处理器中同时包含着32位的ARMv7和64位的ARMv8两种架构。

具体可以参考:https://blog.youkuaiyun.com/forever_2015/article/details/50285865

打包配置到app内的.so设置如下

ndk{
    abiFilter "armeabi-v7a"
}

打包成多个app设置app内可以包含哪些.so配置abi split分包配置

enable: 是否启用ABI拆分机制
reset():重置ABI列表为只空字符串,一半和include、exclude一起使用,如果要用必须在include和exclude前面
include:指明要包含哪些ABI,目前使用最多的伪64位处理器的arm64-v8a,其次才是armeabi-v7a
exclude:默认包含下所有ABI,可以移除一些ABI
universalApk:是否打包一个通用版本,包含所有的ABI,默认值为 false

也是可以实现的那就是 abi split分包,实现也很简单,在gradle 中添加如下配置:

enable: 是否启用ABI拆分机制
reset():重置ABI列表为只空字符串,一半和include、exclude一起使用,如果要用必须在include和exclude前面
include:指明要包含哪些ABI,目前使用最多的伪64位处理器的arm64-v8a,其次才是armeabi-v7a
exclude:默认包含下所有ABI,可以移除一些ABI
universalApk:是否打包一个通用版本,包含所有的ABI,默认值为 false

splits {
    abi {
        enable true
        reset()
        include 'arm64-v8a','armeabi-v7a'
//      exclude 'armeabi'
        universalApk true
    }
}
那么这种情况下打包会生成3个apk,我们把它们解压缩一探究竟,
第一个:app-arm64-v8a-release.apk,里面只会包含arm64-v8a文件夹中的so文件
第二个:app-armeabi-v7a-release.apk,里面只会包含armeabi-v7a文件夹中的so文件
第三个:app-universal-release.apk,里面会包含arm64-v8a和armeabi-v7a文件夹中的so文件
根据不同平台选择不同的apk

2、abiFilters过滤
先设置splits,不设置abiFilters的情况下,代码如下:
 splits {
    abi {
        enable true
        reset()
        include 'arm64-v8a','armeabi-v7a','armeabi'
//      exclude 'armeabi'
        universalApk true
    }
}
那么这种情况下打包会生成4个apk
第一个:app-arm64-v8a-release.apk,里面只会包含arm64-v8a文件夹中的so文件
第二个:app-armeabi-v7a-release.apk,里面只会包含armeabi-v7a文件夹中的so文件
第三个:app-armeabi-release.apk,里面只会包含armeabi文件夹中的so文件
第四个:app-universal-release.apk,里面会包含arm64-v8a、armeabi-v7a、armeabi文件夹中的so文件

再设置abiFilters过滤:
ndk {
    abiFilters 'arm64-v8a',"armeabi-v7a"
}
那么这种情况下仍然会打包会生成4个apk
第一个:app-arm64-v8a-release.apk,里面只会包含arm64-v8a文件夹中的so文件
第二个:app-armeabi-v7a-release.apk,里面只会包含armeabi-v7a文件夹中的so文件
第三个:app-armeabi-release.apk,里面只会包含armeabi文件夹中的so文件
第四个:app-universal-release.apk,里面会包含arm64-v8a和armeabi-v7a文件夹中的so文件

结论:abiFilters过滤就是在splits的基础之上,再选择打入universal中所包含的几种处理器架构的文件夹的
 

5.配置资源和压缩对齐

proguradFiles

去除无用资源

lint

6.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatrixData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值