性能优化笔记

1. SVG

在项目 res 右键出来,New ---> Vector Asset ,SVG 图不会像位图同样由于缩放而使图片质量降低,优势在于节省空间和内存,经常用于一些简单的图标。java

image.png

image.png

  • 若是是从外部导入SVG,须要也是右键res---new---Vector Asset ,须要注意的是:Asset Type 勾选的是: Local File, 须要注意的是这个psd图片不支持渐变和透明度,以下图:android

    image.png

导入进来后,自动生成 xml .git

这里提供一个 android 全部 自带的 svg 图片的地址: megatronking.github.io/SVG-Android…github

批量转化 svg2vector 的工具,这里能够 下载 , 是一个 svg2vector-cli-1.0.1.jar. 这个是最新版本web

操做命令是:bash

java -jar svg2vector-cli-1.0.1.jar -d (svg图片所在的目录) -o (输入目录生成vector的目录)
//指定宽和高
java -jar svg2vector-cli-1.0.1.jar -d D:\svg -o D:\vector -w 24 -h 24    
    
例如:
java -jar svg2vector-cli-1.0.1.jar -d C:\Users\xuqianqian\Desktop\svg\images -o C:\Users\xuqianqian\Desktop\svg\vector-image
复制代码
  • svg 图片生成指定目录的图片。架构

    须要在咱们的app 的 build.gradle 文件中配置app

    android{
        defaultConfig{
            ...
            //将svg生成指定目录的png, 下面可指定目录
            vectorDrawables.generatedDensities('hdpi','xhdpi')
            ....    
        }
    }
    //在布局中用法
    android:src="@drawable/eye"
    复制代码

    配置完成后,咱们能够点击 Build APK(s) ,观察生成的apk 里面的文件:svg

    image.png

image.png

咱们在咱们指定的目录下drawable-hdpi 和 drawable-xhdpi发现了 咱们svg 图片生成了对应的 png 图片。这样的好处是咱们能够避免配置多套图在每一个分辨率下,用 svg 图能够自动帮咱们生成指定目录的图片。工具

SVG 兼容方式

在 Android 5.0 以前,能够向上面那么配置,那么5.0以后,若是配置呢?

vectorDrawables.useSupportLibrary=true
implementation 'com.android.support:appcompat-v7:28.0.0'
//在布局中用法
 xmlns:app="http://schemas.android.com/apk/res-auto"
 app:srcCompat="@drawable/eye"    
复制代码

经过使用 svg 图片,解决了咱们大量使用套图的问题。

2. Tint 着色器

tint 着色器就是能够改变咱们一些图标的颜色,例如:

image.png

上述那个图片是黑色的,咱们经过添加属性 android:tint="@color/colorAccent" , 就能够改变它的颜色:

image.png

咱们常常会遇到例如点击按钮变颜色啥的,之前常常弄两张图,一个常态的icon, 一个点击态的 icon. 有了这个着色器,有些icon 咱们不须要用两张图啦。例如:

res--color--tint_honor_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:color="@color/colorPrimary" android:state_pressed="true"/>
    <item android:color="@android:color/transparent"/>
</selector>
复制代码

再来一个 res-drawable-tint_honor_src.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/next" android:state_pressed="true"/>
    <item android:drawable="@drawable/next"/>
</selector>
复制代码

xml 中:

<ImageView
        android:layout_marginTop="30dp"
        android:clickable="true"
        android:focusable="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/tint_honor_src"
        android:tint="@color/tint_honor_color"
        />
复制代码

3. 资源打包

因为使用第三方库,例如 v7 包的引入,库中包含了大量国际化资源,咱们能够根据实际状况,配置咱们所须要的语言,去除其它语言,从而减小strings 文件的大小

image.png

从上图咱们看到默认帮咱们生成不少国家的语言,咱们能够只保留中文,配置以下:

//只保留咱们指定的语言
resConfigs('zh-rCN','ko')
复制代码

再次 Build APK 查看:

image.png

经测试,apk 的大小仍是有所减小的。

4. 动态库打包配置

在咱们 libs 目录下配置指定 so 库,咱们知道,真机CPU通常都是 armeabi 的, 模拟器通常都x86 的 ,还有一些 armeabi-v7a mips 等,通常要根据咱们实际状况,只保留对咱们真实有用的 cpu ,若是不进行配置,就会打包全 cpu 架构的动态库到apk中。

将so库打包到apk中:

souceSets{
    main{
        jniLibs.srcDirs = ['libs']
    }
}
复制代码

配置以下:

ndk{
    abiFilters('armeabi','armeabi-v7a')
}
复制代码

5. 移除无用资源

未避免咱们移除了重要的文件,移除以前最好备份,由于都是物理删除,没了就没了。

  • 第一种看不见的删除。按照图示操做:

    image.png

执行以后,你会发现没有用的资源文件都被删除了,在实验这个以前,你能够添加复制几个无用的资源,观察执行以后是否还在,通常执行以后就没有了,特别注意:这种操做是物理删除,不会展现哪些文件须要删除,而是一次性将其删除,删除需谨慎。

  • 第二种操做是:会给咱们列出须要删除无用的资源,以下:

    image.png

    image.png

搜索找到 unused resources , 以后会列出无用资源,例如:

image.png

上述文件都是我复制出来的,以后再决定是否删除。

6. 开启代码压缩

即对源代码进行混淆,还须要同时配置 proguard 文件,由于有些第三方库啥的一些类不能混淆,须要各自配置。

开启混淆:

buildTypes {
        release {
            minifyEnabled true // 改成true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 复制代码

7. 启用资源缩减

//以debug为例,开启资源缩减,必须将 minifyEnabled 设置为 true, 不然会报错
debug {
            minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } 复制代码

若是有想要保留或舍弃的特定资源,须要在项目中建立一个包含 标记的 xml 文件,并在tools:keep属性中指定每一个要保留的资源,在tools:discard 属性中指定每一个要舍弃的资源。这两个属性都接受逗号分隔的资源名称列表。压缩配置: res/raw/keep.xml 该文件不会打包到apk中 .

称为严格的资源检查:

示例:

<?xml version="1.0" encoding="utf-8"?>
<resources
    xmlns:tools="http://schemas.android.com/tools"
    tools:discard="@color/tint_honor_color1"
    tools:keep="@drawable/next1"
    tools:shrinkMode="strict"
    />
复制代码

使用以后,会出现什么效果呢:

对于 tint_honor_color1 咱们选择要舍弃,Build APK 以后,查看里面的文件发现就为空了,而咱们保留的

next1 文件没有为空,由于咱们保留 keep 了。

8. 启用webp

webp 格式是谷歌推出的一种有损压缩格式,这种图片格式相对于png或jpg 格式的图片损失的质量几乎能够忽略不计,可是压缩后图片的体积却比png或jpg要小不少。

能够亲自找一张大图,目前已经集成到android studio 中了,导入 android studio 中后,右键 ---conver to Webp ,就能够进行转化。亲测能够将一个4M 左右的图片 变为 400多kb. 图片质量也很高。

总结

相信通过层层处理,apk大小必定会有所减少, 不断补充。

相关文章
相关标签/搜索