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.