Apk体积优化

1、svg的使用与优化
2、Tint着色器的使用与优化
3、资源打包配置优化
4、动态库的打包配置优化
5、移除无用的资源(物理与非物理删除)
6、代码混淆
7、webp转换(api等级18以上)
8、资源混淆

1. svg的使用与优化

可缩放的矢量图形。其实人话就是在不同大小的地方显示不变形!

res->new->vector Asset

image.png

之后会蹦出来这么个玩意


image.png

前一个红框是系统的图标,后一个是本地的图标!这样你就会生成一个以.xml为结尾的图标了!

里面的代码大概是这个样子的!

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
</vector>

使用的话,和之前的src不同了!必须这样使用!

app:srcCompat="@drawable/ic_arrow_back_black_24dp" 

2. Tint着色器的使用与优化

大家在开发的时候不知道有没有过这种体验!在使用状态选择器的时候,需要使用两张一样颜色不同的相同图片?其实使用tint属性完全可以搞定(但是这里指的是纯色的那种图片,那种花花绿绿的你还是乖乖弄吧,除非你想把他变成纯色!)
其实真的很简单,只要在展示的图片中添加

app:tint="颜色值"

这样就可以改变图片的颜色,那么状态选择器呢?怎么用呢?其实很简单了!下面我们来看代码!

先来看看两个状态选择器的代码:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_arrow_back_black_24dp" android:state_pressed="true" />
    <item android:drawable="@drawable/ic_arrow_back_black_24dp" android:state_pressed="false" />
</selector>

可能你会奇怪了,为什么两个图片是一样的?看到后面你就懂了!

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_pressed="true" />
    <item android:color="@android:color/black" />
</selector>

其实原理是这样的,状态选择器的话呢?只要你通过tint的状态选择器改变图片的颜色就可以了!

但是这里面有几个点需要注意下:

1.颜色的那个状态选择器要方法color文件夹下;
2.设置tint的时候要使用app为前缀,否则5.0以下的会报错;
3.如果你设置的是svg的图片要使用srcCompat如果是正常图片使用src就好了。

3. 资源打包配置优化

其实这个标题说的有点大,其实就是删除不必要的语言!!!

可能你们没有留意过,在你用Android Studio查看你的apk的时候,会看到这样的东西!


image.png

在我画框的地方,有很多中语言的使用?你会好奇的问?我没有设置过语言啊?这都从哪里跑出来的呢?其实实在v7包中的!其实我们一般的应用不会涉及到这些语言的!所以我们只留下其中的一种或几种就可以了。具体怎么做呢?其实就只有一行代码。。。

在app的build.gradle中的defaultConfig中添加这样一句就可以了!

resConfigs('zh-rCN'')

这里其实你还可以添加多个,直接用逗号连接就可以了!
优化后就变成下面这个样子了!!!


image.png

4. 动态库的打包配置

其实说到动态库的话,基本上就是.so引入的动态库,其实这里有很大的优化空间!其实你可以解压比较大型的项目,其实没有那么多so文件的类型!

平时我们开发的时候,基本上都是这么写的!

sourceSets{
        main{
            jniLibs.srcDirs = ['libs']
        }
    }

然后

ndk{
        abiFIlters('armeabi','armeabi-v7a','xxx'....)
    }

是不是每次像导入百度语音等第三方库的时候,说明文档上这么写的我们也就这么弄的!但是其实我们不需要这么多的架构!
这里简单说一下常用的几个

  • armeabi 真机
  • x86 模拟器

其实我们真是开发的话,直接使用armeabi就可以了,如果你做那种定制化的apk的话,把其它的加上还可以,但是如果正常的手机应用的话,这里只需要armeabi的就可以了!

如果你怎么不知道用哪个?你把比较大的项目解压一下看看人家用哪个你就用哪个!哈哈

5. 移除无用的资源(物理与非物理删除)

5.1 物理删除(无法找回,慎用)

关于物理删除其实很多都不建议这么使用,因为这个真的没有什么节操!这里说两个问题:
如果你们项目没有项目管理的话,真的不建议这么使用,因为删除之后你真的找不到了!是真的找不到了(如果git的话,拉个分支使劲磕就可以)!
如果有反射或者动态加载id的(ids.xml)的会直接删除!可能会报错!

好了,前提说好了!别到时候后删了之后找我。。。

方案一:

Refactor->Remove Unused Resource...
这里会谈个框,会有三个选项:

(Refactor)第一个是直接删除了
(Preview)第二个会在下面弹出一个提醒,让你选择性的删除
(Cancel)取消

方案二:

Analyze->Run Inspection by name
这里也会弹出个框输入
unused ressources
然后又弹出个框,这里就按照上面的圈圈点点,然后点OK这个时候你会发现底下会出现相应的无用资源这个时候你看哪个不用就直接按照右边的提示删除就好了

再次强调,这个是物理删除,删除了就没了!!!

5.2 非物理删除

其实我估计google爸爸早就考虑到这个问题了,其实还有一种非物理删除的,是在混淆的时候!相信大家在混淆的时候都写过这句吧!

shrinkResources true

开始的时候我也不知道是什么鬼,后来看别人说这个是启动资源压缩!
但是,如果你看过压缩后的apk的话,这个资源压缩是使用了一个占位符而不是把相应的文件删除!
其实这个资源压缩还有一个比较又意思的点,可以自定义要保留的内容:
res->raw->keep.xml 自定义要保留的东西

<resources 
    tools:keep="@layout/activity_main1"   保留谁这里就可以写谁
    tools:shrinkMode="strict"/> 

这个是看谷歌文档中写的!但是真的不知道为什么还要保留?处于什么原因呢?还请懂的大神指点!!!

5.3 使用Android Lint 删除没有用过得资源

image.png

然后选择分析app,点击ok


image.png

接下来就处理没有用到的资源了:


image.png

5.4清理Assert文件夹

Assert文件夹经常会放置一些不被编译的资源,时间久了,里面可能一些文件或者资源已经不用了,然而这个文件夹也是会被打包到apk里面的。所以定期清理这个里面的内容也是减小apk体积的重要一步。


image.png

6. 代码混淆

关于这个我不准备在这里讲,代码混淆网上一搜一大把!基本上一个固定模板加上你引入的第三方库的混淆就ok了(注意实体类就好了,每次我都忘)!

7.你可以使用 webp 替代 png

并且你的应用的最低支持版本大于 18,你可以使用 webp 替代 png。webp 图片比 png 体积更小但质量一样。而且 Android 支持 webp。所以你可以在 ImageView 中像加载其它光栅图片一样加载 webp 图片。这不需要改变你的布局。

你可以在工程选择 drawable 和 mipmap 文件夹,右击并选择 convert to webp。这将会打开下面这样的配置弹框。

image.png

点击 ok,将会将所有 png 图片转成 webp。如果 webp 图片比 png 更大,Android Studio 将会自动跳过这个文件。

image.png

8. 资源混淆

关于资源混淆基本上是美团和微信的两大方案,我还在整理!
微信的方案开源了!
美团的貌似是没有开源,但是在相应的技术博客中写了

基本上我现在的项目体积优化的话,就弄了这么多,还请大佬们指点!!!

感谢 https://www.jianshu.com/p/627fd3cd9df2

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