性能優化筆記

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大小必定會有所減少, 不斷補充。

相關文章
相關標籤/搜索