APP性能优化-APK大瘦身

随着我们的APP迭代,安装包的体积也会跟着增大。
就拿我目前所开发维护的APP来讲,版本号20,APK大小是10M,金融类的应用。虽然功能也不少,但是因为是混合开发,对于我这种“斤斤计较”的人来说,这个大小还是偏大的,应用太大不利于运营推广,并且浪费用户的流量,所以在APP的瘦身是很必要的。这片文章讲我的应用在APK瘦身中的一些经验方法,希望对你能有所帮助。

APK分析

我们来看下APK的构成,将你编译后的APK拖到AndroidStudio中,从AndroidStudio2.2版本开始我们可以使用APK Analyzer来分析APK,当然你也可以更改APK的后缀名为zip,解压之后可以看到APK的内容,如下图:

apk的组成.png

APK主要由一下几个部分组成

res:

主要存放一些图片资源和xml资源

lib:

存放各种架构的so库

classes.dex

java源码编译后生成的java字节码文件,由于超过了Android最大方法数限制,这里拆分了多个dex文件

assets

主要存放一些不需要编译处理的文件,比如我们常常为了加快WebView的访问速度,会把一些框架性不常更改的js、css和一些png等图片资源放在这里面

resources.arsc

编译后的二进制资源文件,包括图片、文本索引等

META-INF

应用签名信息

AndroidManifest.xml

描述配置文件

从图片中我们看到占比较大的几个,对其进行分析优化。

优化方式1-资源优化

图片资源压缩-res文件夹下

1.TinyPng

可以拖拽图片到网页上处理,同时提供HTTP api来处理,有数量限制,每个key每个月限500张。网上也有相关的Gradle插件来批量处理,我的项目中使用的就是这种图片压缩方式,压缩效果因图片而异,我的项目中的图片大小减小了一半左右。Mac下或者安装了Python环境的同学可以试一下这个批量压缩的脚本GcsSloop/TinyPng

2.ImageOptions

提供客户端,未使用过,具体请移步官网

需要说明的是这里的压缩虽然最大程度的保留了图片的质量,优化修改了png的一些属性等,但是对于图片质量还是有一些影响的,特别是在一些高清大图。

移除无用资源

有时候我们移除某一项功能的时候,并没有移除相应的资源文件,如果不做处理,这部分资源文件很有可能打包到我们的apk中,产生空间浪费。

1.使用AndroidStudio自带的Lint检查无用资源,然后通过脚本批量移除;

2.使用Gradle的shrinkResources在打包的时候移除未使用资源;

3.官方推荐我们在不同分辨率对应的文件夹下放置对应的资源图片,ldpi mdpi hdpi xhdpi xxhdpi xxxhdp等,但是这样做的话会极大的增加包的体积,一般来说我们只需要两三套就可以了,我现在是使用的一套图片资源,现阶段可以只保留xhdpi下的图片,关于为什么官方推荐需要多套资源图片,请自省百度,这也是个很重要的知识点;

减少多语言支持

我们的APK默认打包出来支持几十种语言,这显然是不必要,我这里只保留简体中文,当然如果你的APP在繁体中文或者海外也有推广运营的话,请保留需要的语言,这种方式能减少几百k的大小。

defaultConfig {
        resConfigs "zh"
}
资源混淆方案

我记得以前刚学反编译apk的时候,尝试反编译微信的APK,但是反编译后发现xml文件都是a、b、c这种命名,觉得很神奇。后来才知道,这是微信自己开发的资源混淆方式,原理是把冗长的资源路径变短。详情请见AndResGuard。通过这种方式我把APK又减小了0.8M。但是有一点请注意,一些通过反射获得的资源或者是某些三方库中的资源需要加入白名单,要多加测试,避免出错。

lib文件夹

1.CPU架构支持

Android目前支持的架构多达七种,每一种架构对应一种ABI:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。所有的x86、x8664、armeabi-v7a、arm64-v8a设备都支持armeabi架构的.so文件,x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。64位设备(arm64-v8a, x8664, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)。一般的应用完全可以根据自己业务需求选择使用armeabi或者armeabi-v7a一种支持就行。

ndk {
      abiFilters 'armeabi'   
}

2.动态下发

so文件可以通过动态下发的方式延迟加载,网络上有文章这么做过,我这里没用过不做说明。

dex文件

1.Gradle中设置minifyEnabled true混淆、压缩代码

2.删除一些无用库,包括一些早期的兼容库,删除一些非必需的三方库,或使用轻量级的替代库

3.插件化开发,通过下发的方式减小APP体积

其它方式

1.Proguard不保留行号信息,但是这种方式会不利于我们查找线上bug日志

2.facebook的ReDex,需要多测试

... ...

通过上面的方式,我目前开发的apk大小也从原来的10M多降到6.5M,效果还是很明显的,这其中还不包括由于一些原因未采用的方式。
我们常见的APK瘦身方法就讲完了,如果你有更多更好的方式请告诉我,当然,这都是现阶段的优化方法,随着Android的进步我们肯定会有更多的方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容