Android性能优化之躺着就能APK瘦身

目的

由于公司项目的功能不断的迭代,需求的不断增加,APK的体积也随之增大,导致用户在安装相同种类APP的时候,考虑到流量的问题,就会有选择性的下载,APK过大就很是不利。于是,APK瘦身势在必行。在网上找了很多APK瘦身优化的方案,这里做一下总结。


一、瘦身分析

APK瘦身跟减肥是一个道理,首先你要知道你为什么胖 ~ 哪个部位胖 ~

操作AndroidStudio,Build → Analyze APK
项目资源占比

肥胖结构:

  • res:包含未编译到的资源 resources.arsc,主要有图片资源文件;
  • classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类;
  • assets:包含应用可以使用AssetManager对象检索的应用资源;
  • lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a,后面会讲到原因;
  • resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像;
  • META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件;
  • AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。

可以看到,我的APK最大的占比是res资源文件和classes.dex资源文件,因项目而异,哪有肉多减哪里。


二、具体方案

1. 对lib目录下的文件进行瘦身处理

1. 修改lib配置:

module 中 build.gradle的

ndk {
       //设置支持的so库架构
      abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
}
参考图片

最后我的修改代码如下:

ndk {
     //设置支持的so库架构
     abiFilters "armeabi-v7a"
}

如果适配版本高于4.1版本,可以直接这样写,当然,如果armeabi-v7a不是设备主要ABI,那么会在性能上造成一定的影响。
参考文章:安卓app打包的时候还需要兼容armeabi么?

2. 重新编译so文件,用更小的库代替

很多优秀的第三方框架我们导入项目,但是实际上用到的仅仅是一小部分功能。这时候我们需要分析源代码,将我们需要的那部分代码提取出来,重新编译成新的so文件,再导入到我们项目中。


2. 优化res,assets文件大小

1. 手动lint检查,手动删除无用资源

在Android Studio中打开“Analyze” 然后选择"Inspect Code...",范围选择整个项目,然后点击"OK"。配置如下:

2. 使用tinypng等图片压缩工具对图片进行压缩

将大图片导入到tinypng,替换之前的图片资源,图片收缩50% - 70%

3. 大部分图片使用Webp格式代替。

可以给UI提要求,让他们将图片资源设置为Webp格式,这样的话图片资源会小很多。如果想了解更多关于webp,请点击这里webp,当然,如果对图片颜色要求不高,可以考虑转jpg,最好用webp,因为效果更佳。

4. 使用gradle开启shrinkResources(慎用,会出现无名的BUG)

移除无用资源文件,下面是我的配置:

 buildTypes {
        release {
            // 不显示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //混淆
            minifyEnabled true
            // 移除无用的resource文件
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

3. 减少chasses.dex大小

减少代码量。我们可以通过以下方法来实现:

  1. 尽量减少第三方库的引用;
  2. 去除没有调用的代码和导入;
  3. 避免使用枚举,枚举不仅仅会造成性能的问题,还会占用大量的内存;
  4. 不要重复使用功能相同的第三方库(遇到过一个项目中三个图片框架,N个网络框架),尽量做到一个功能点一个库解决。
  5. 图片和数据尽可能从网络获取,即可以减少资源占用,也可以使项目更加灵活。

三、总结

通过以上方案,项目会减少30% - 50%的大小(如果减肥能这么简单快捷就好了 o(╥﹏╥)o),APK瘦身仅仅是移动端开发性能优化的一小部分,性能优化是移动开发面试最容易问到的,也是衡量一个优秀开发人员的必修课,只有不断地学习和自我激励,才能够在这个信息时代淘汰,才能继续发展。

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

推荐阅读更多精彩内容