头条APK瘦身之路

作者:字节跳动技术团队

链接://www.greatytc.com/p/09dc7e734346

随着版本迭代,功能增加安装包体积也会慢慢增大。

今日头条576版本APK达到了25M,通过一系列的优化,到目前的607版本为12M。本文主要是介绍头条APK瘦身中用到的一些方法。

APK分析

既然是要优化APK的大小,那首先就得看下APK文件的构成。

Android Studio在2.2版本添加 APK Analyzer功能,可以直接打开apk文件,如下图所示

image

APK文件主要有如下几部分组成:

res主要是存放图片资源lib主要是存放so库,各个cpu架构classes.dex是java源码编译后生成的java字节码文件,因方法数限制拆分了多个dexassets主要存放不需要编译处理的文件resources.arsc是编译后的二进制资源文件,包括图片、文本索引等META-INF签名信息AndroidManifest.xml描述配置文件

从APK的构成中可以看出占比较大的几个部分,可以着重对其优化

优化

res文件夹

图片资源压缩

1、ImageOptim

提供了相应客户端,支持通过客户端批量处理,mac上可以使用如下命令开启:

image

2、TinyPng

没有提供客户端,支持拖拽到网页处理;提供了HTTP API来批量处理,但是有数量限制,每个key每个月可以压缩500张。 开发了一个gradle插件来批量操作,网上也有一些类似的插件:TinyPng Gradle插件

移除无用资源

1、通过使用Lint检测删除无用资源,某些业务代码删除的时候遗漏了相应资源,可以写个脚本检测移除不再使用的资源

2、添加shrinkResources设置项(官方说明),有0.18M的优化空间,但是该设置有风险如果要使用需要做好测试

3、选择支持合适的图片,目前有ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi资源文件夹,可根据自己app的用户设备选择支持2-3种即可(当然一套也行)

高版本的gradle已不再支持通过resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi"配置支持的资源,只能人肉删除。如果你只想打包某一种屏幕密度的资源,可以使用分包策略,添加如下density配置可以只支持打包xhdpi资源(如果出现某些资源xhdpi没有,而其他文件夹包含的情况也不用担心,gradle会保留相应资源),这种配置最终会出多个apk包,具体介绍可参看官方说明。

image

4、如果想整体移除res下某个文件夹可以添加如下aaptOptions配置,而不用打包时手工删除,多个文件夹用:隔开

image

arsc文件

resource.arsc文件记录了资源id和资源的对应关系(字符串的内容,图片的相对路径等)

减少语言支持

目前包括各种语言(v7包引入),点击resources.arsc可以看到支持80种

image

可以通过修改gradle配置,去除不需要部分,这里我们保留4种

image

只保留"zh-rCN", "zh-rHK", "zh-rTW", "en" 减少不必要的语言(80种减到5种,有一个default)apk可减少0.61M

image

资源混淆

开源解决方案AndResGuard可以看下,通过使用段路径和压缩可以减小apk,需要注意的是你的项目中某些资源需要keep,减少了1.5M。

lib文件夹

架构支持

Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起)

每一个CPU架构对应一个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一种支持就行。

可以通过gradle配置

image

比如:微信、微博、QQ只保留了armeabi,Facebook、Twitter、Instagram只保留了armeabi-v7a

假设只支持了armeabi,如果有特殊要求(比如视频应用)需要用到部分armeabi-v7a的so,可以通过改名放到armeabi文件夹中,根据手机实际情况选择加载。

动态下发

比较大的so可以选择动态下发的形式延迟加载,代码上需要加一些判断逻辑。

dex文件

1、添加设置minifyEnabled true,混淆、压缩代码,这个设置现在app应该都已经添加了。

2、删除一些无用库,早期为了兼容低版本手机,添加了一些兼容库,随着时间推移APP支持的最低版本也在升高,之前的一些无用库就可以移除。

3、插件下发业务模块 添加插架框架,将部分代码延迟下发加载,这部分效果显著。

其他

极端情况下可以考虑以下两种方式,可以优化约1M的空间

debug信息

一般我们会配置Proguard保留行号等信息用于线上日志分析,极端情况下也可考虑移除这部分,会有5%-10%的效果,可以减少了0.5M,但是出于方便性暂未移除。

image

supportv7包

如果对supportv7包依赖的不多,可以直接把使用到的内容copy出来单独处理,毕竟该包会增加至少0.4M的体积,业务复杂后这部分并不好操作和后续维护,头条暂时并没有使用。

TODO

功能迭代不止,瘦身事业不息。

要维持和继续减小apk包,必须要不断优化,现在又如下思路还没有实施,可以看下

1、Google的support-v4包新版本已经做了拆分,24.2.0版本拆分成了5个module:support-compat、support-core-utils、support-core-ui、support-media-compat、support-fragment,可以根据自己需要单独引用相应的module。

v7包也会依赖v4,maven依赖有个好处,可以通过exclude单独剔除相应依赖,如下:

image

不过目前各家APP对于support包的使用较深,support包各模块也会有相关依赖关系,具体能不能使用还需要看实际情况了。

2、使用ReDex优化,这是Facebook开源的一个减小安卓app大小以提高性能的工具,集成的话有风险需要多测试,教程。

3、减少java隐藏开销,比如一些自动生成的函数等。


作者:字节跳动技术团队

链接://www.greatytc.com/p/09dc7e734346

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

推荐阅读更多精彩内容

  • 1.付出不亚于任何人的努力 2.要谦虚,不要骄傲 3:要每天反省 4:活着,就要感谢 5:积善行,思利他 6.不要...
    六项精进阿晋阅读 68评论 0 0
  • 气温急剧下降,紧接着来了一场雪。天寒地冻,白雪皑皑。北方的冬天真的来了。这两天休息,为了这冬天的到来,我忙得不可开...
    花香四季1阅读 959评论 12 11
  • 我们经常在公园的林荫大道上看到有人一边走路一边两手伸向前相碰,“嘭、嘭”发出清脆的声音,这就是我们常说的拍手掌。 ...
    沈姐说说阅读 165评论 6 5
  • 每次都是匆忙的吃早餐,还要边负责喂宝宝,什么时候记得再上图。
    唐夫人阅读 122评论 0 0