性能優化之Apk瘦身

瘦身的理由:
1、安裝包變大,導致很多用戶不願意安裝更新
2、安裝包變大,導致新用戶不願意下載
3、安裝包變大,流量使用增多,增加其他邊際成本

圖片優化:

使用矢量圖片

矢量圖片只需要放置一份
2、圖片如果比較大,繪製的時候會很長,製作複雜度高

使用WebP

體積更小,4.2.1+支持透明度

使用png

有透明度,漸變,陰影的情況下選擇png

png轉WebP

Android Studio 選中圖片-> 右鍵 ->convert to webp 即可

png轉WebP的壓縮比是很大的

WebP轉換方式

採用轉換工具

PNG壓縮

採用壓縮工具對png進行壓縮

1、可以採用ImageOptim或者Pngyu對png進行壓縮
2、AAPT會使用內置的壓縮算法來優化res/drawable目錄下的PNG圖片,但也可能會導致本來已經優化過的圖片體積變大,這裏禁用aapt優化PNG圖片

aaptOptions{
	cruncherEnabled = false
}

png和jpg圖片可以採用這個網站來壓縮

其他圖片優化

純色圖片代碼實現
減少圖片資源放置份數

放置xhdip,xxhdpi -如果只放一份會有什麼問題

能用代碼實現的圖片儘量採用代碼實現

圓形圖片、環形圖片,漸變等都可以採用代碼實現

開啓資源壓縮

開啓代碼混淆與去除無用資源

android{
	...
	buildTypes {
        release {
            shrinkResources true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

進一步資源混淆

微信開源了AndResGuard工具,對資源進一步混淆

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.0'
    }
}
andResGuard {
    // mappingFile = file("./resource_mapping.txt")
    mappingFile = null
    // 當你使用v2簽名的時候,7zip壓縮是無法生效的。
    use7zip = true
    useSign = true
    // 打開這個開關,會keep住所有資源的原始路徑,只混淆資源的名字
    keepRoot = false
   //保留不被混淆的資源文件
    whiteList = [
        // for your icon
        "R.drawable.icon",
        // for fabric
        "R.string.com.crashlytics.*",
        // for google-services
        "R.string.google_app_id",
        "R.string.gcm_defaultSenderId",
        "R.string.default_web_client_id",
        "R.string.ga_trackingId",
        "R.string.firebase_database_url",
        "R.string.google_api_key",
        "R.string.google_crash_reporting_api_key"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
    sevenzip {
         artifact = 'com.tencent.mm:SevenZip:1.2.7'
         //path = "/usr/local/bin/7za"
    }

    /**
    * 可選: 如果不設置則會默認覆蓋assemble輸出的apk
    **/
    finalApkBackupPath = "${project.rootDir}/final.apk"

    /**
    * 可選: 指定v1簽名時生成jar文件的摘要算法
    * 默認值爲“SHA1”
    **/
    digestalg = "SHA256"
}

冗餘代碼

產生的原因:

1、複製、粘貼
2、對項目不瞭解

冗餘代碼的定義:

  • 完全一致的代碼或者只修改了空格和評論
  • 結構和句法上一致的代碼,例如只修改了變量名
  • 插入和刪除了部分代碼
  • 功能和邏輯上一致的代碼,語義上的拷貝

檢測工具

1、使用工具,例如PMD
2、PMD下載地址:https://pmd.github.io/

如何檢測

下載後輸入:

./run.sh cpdgui

pmd -d /usr/src -R rulesets/java/quickstart.xml -f text
https://pmd.github.io/pmd-6.17.0/pmd_rules_java.html

Lint大法

未使用資源

1、檢測未使用的資源並刪除
2、Android Studio ->Analyze ->Run inspection by Name -> unused resource

無用代碼優化

Analyze->Run Inspection by Name->unused declaration ->Moudule app ->OK

其他lint優化

壓縮存儲文件

1、導入7zip,壓縮存儲預置資源
2、使用時,解壓到本地,比如assert中的資源

語言資源優化

在build配置中配置resConfigs指定需要的語言類型

defaultConfig{
	resConfigs "zh","en"
}
```
#### Splits根據不同的ABI以及不同的屏幕密度分別打包
https://developer.android.com/studio/build/configure-apk-splits.html

#### 重複的String,color的優化

1 、過濾重複的String
2、定義唯一的color名


#### 減少Enum使用

每減少一個ENUM文件可以減少1K左右的大小

**採用常量定義**

#### 優化引用的庫
> 去除不再使用的庫
優化過時的庫
僅僅提取使用的代碼
選用更小的外部庫




#### 音頻資源壓縮

採用音頻壓縮工具,壓縮音頻,降低採樣率,通道數等在不明顯影響效果的前提下壓縮音頻

#### So動態下發
So可以採用動態下方的方式加載。(需要考慮下載失敗了怎麼辦?)
僅僅只需要加載對應abi下的so


指定abi
Gradle中指定abiFilter
ndk{
		abiFilters "armeabi-v7a","x86"
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章