美文网首页
Apk体积优化

Apk体积优化

作者: 南城的人 | 来源:发表于2019-05-29 17:05 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Apk体积优化

          本文链接:https://www.haomeiwen.com/subject/enxrtctx.html