您的位置:首页 > 移动开发 > Android开发

Android应用性能优化之Apk瘦身机制

2017-04-07 17:44 267 查看
个人所知道的,当然还有一些我不知道,欢迎大家留言指出,我也学习一下。

Android Studio自带工具优化

在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包



在Android Studio工具栏里,打开Refactor–>Remove Unused Resources,删除无用的资源



如果能帮我们把所有的无用资源列出来,让我们自己选择那就完美了,当然,可能图片是经过反射或字符拼接等方式获取,所以这个检测列表也不是全对,删除后很大概率编译失败或部分页面挂死、无图等问题,这个上网查了,也没有什么靠谱的结果,工具还没智能到这个地步,所以你只能一遍又一遍“编译—解决部分问题—再编译再解决”

在gradle配置,达到apk瘦身效果

删除无用的语言资源

android studio中带有几十种语言信息,如果你的应用不用支持国际化,那再国内只需要中文即可:

```
android {
defaultConfig {
resConfigs "zh"
}
}
```


开启minifyEnabled混淆代码

在gradle使用minifyEnabled进行Proguard混淆的配置,可大大减小APP大小:

android {
buildTypes {
release {
minifyEnabled true
}
}
}


开启shrinkResources去除无用资源

android {
buildTypes {
release {
shrinkResources true
}
}
}


删除没有的so文件

删除armable-v7包下的so

基本上armable的so也是兼容armable-v7的,armable-v7a的库会对图形渲染方面有很大的改进,如果没有这方面的要求,可以精简。

注意:这里不排除有极少数设备会Crash,可能和不同的so有一定的关系,请大家务必测试周全后再发布。

删除x86包下的so

x86包下的so在x86型号的手机是需要的,如果产品没用这方面的要求也可以精简。

建议实际工作的配置是只保留armable、armable-x86下的so文件,算是一个折中的方案。

使用tinypng有损压缩

tinypng官方地址:http://tinypng.com/
TinyPNG工具只支持上传PNG图片到官网上压缩,然后下载保存,在保持alpha通道的情况下对PNG的压缩可以达到1/3之内,而且用肉眼基本上分辨不出压缩的损失.




大家可以看一下压缩前后的对比!

使用一套资源

对于多数app,其实只需要一套图就可以了。鉴于现在分辨率的趋势,建议取720p的资源,放到xhdpi目录。相对于多套资源,只使用720P的一套资源,在视觉上差别不大,很多大公司的产品也是如此,但却能显著的减少资源占用大小,顺便也能减轻设计师的出图工作量了。
注意,这里不是说把不是xhdpi的目录都删除,而是强调保留一套设计资源就够了


使用微信资源压缩打包工具

微信资源压缩打包工具通过短资源名称,采用7zip对APP进行极致压缩实现减小APP的目标,效果非常的好,强烈推荐。

建议开启7zip,注意白名单的配置,否则会导致有些资源找不到,官方已经发布AndResGuard到gradle中了,非常方便:


apply plugin: 'AndResGuard'
buildscript {
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.1.7'
}
}
andResGuard {
mappingFile = null
use7zip = true
useSign = true
keepRoot = false
// add <your_application_id>.R.drawable.icon into whitelist.
// because the launcher will get thgge icon with his name
def packageName = <your_application_id>
whiteList = [
//for your icon
packageName + ".R.drawable.icon",
//for fabric
packageName + ".R.string.com.crashlytics.*",
//for umeng update
packageName + ".R.string.umeng*",
packageName + ".R.string.UM*",
packageName + ".R.string.tb_*",
packageName + ".R.layout.umeng*",
packageName + ".R.layout.tb_*",
packageName + ".R.drawable.umeng*",
packageName + ".R.drawable.tb_*",
packageName + ".R.anim.umeng*",
packageName + ".R.color.umeng*",
packageName + ".R.color.tb_*",
packageName + ".R.style.*UM*",
packageName + ".R.style.umeng*",
packageName + ".R.id.umeng*"
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
"resources.arsc"
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.1.7'
//path = "/usr/local/bin/7za"
}
}


会生成一个andresguard/resguard的Task,自动读取release签名进行重新混淆打包。


Facebook的redex优化字节码

redex是facebook发布的一款android字节码的优化工具,需要按照说明文档自行配置一下。


redex input.apk -o output.apk --sign -s <KEYSTORE> -a <KEYALIAS> -p <KEYPASS>


这一种效果是非常好的。
优化的时候:要注意先后顺序,最好先用redex优化,再用微信资源压缩打包工具在使用。
注意:据反应red
4000
ex后会有崩溃的现象,反正我是没碰到。
ReDex详情参考:https://github.com/facebook/redex


使用jpg格式

对于非透明的大图,jpg将会比png的大小有显著的优势,虽然不是绝对的,但是通常会减小到一半都不止,例如在app的启动页,活动页等之类的大图展示区采用jpg是不错的选择。


缩小大图

你的工程里面有一些大图,考虑是否有必要维持这样的大尺寸,是否能适当的缩小。因为设计师的出图,我们拿到的很多图片完全可以适当的缩小而对视觉影响是极小的。


覆盖第三库里的大图

有些第三库里引用了一些大图但是实际上并不会被我们用到,就可以考虑用1x1的透明图片覆盖


矢量图

矢量图是由点与线组成,和位图不一样,它再放大也能保持清晰度,而且使用矢量图比位图设计方案能节约30~40%的空间,现在谷歌一直在强调扁平化方式,矢量图可很好的契合该设计理念。


1.优势

占用存储空间小

随便拉伸不会出现锯齿,可以照顾不同尺寸的机型

Android Studio自带很多资源,减小UI工作量

2.劣势

只支持5.0及以上系统

与位图相比多了一层计算,需消耗更多性能

不支持.9图

不适合表现真实照片和复杂图形,一般使用在简单的icon和动画上

使用shape背景

很多纯色的渐变的圆角的图片都可以用shape实现,代码灵活可控,可以减少大量的背景图片。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  apk瘦身 性能优化