編譯后SDK大小減小方案

本文主要從編譯,圖片壓縮,平臺(tái)等方面對(duì)App集成sdk后所帶來(lái)的增量的減小優(yōu)化方案進(jìn)行分析。

清除無(wú)用代碼和資源

  • Code Shrinking, 代碼混淆,清除無(wú)用的代碼
    混淆可以刪除一些沒(méi)用的類,字段,方法和一些屬性,包括我們引入的一些其它庫(kù),同時(shí)混淆器也優(yōu)化了字節(jié)碼,移除了一些用不到的字節(jié)碼指令,并且用了更短的名稱混淆了留下來(lái)的一些類的名稱,字段名稱和方法名稱。
    要想混淆你的代碼,首先在你app的build.gradle文件中加入如下代碼
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

其中proguard-android.txt為系統(tǒng)SDK默認(rèn)的混淆規(guī)則,在proguard-rules.pro文件中編輯你的混淆規(guī)則。
官方文檔的提供了一點(diǎn):

To add more ProGuard rules that are specific to each build variant, add another proguardFiles property in the corresponding productFlavor block.

具體到編譯變量 這個(gè)目前沒(méi)有試,官方給了個(gè)例子:

android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                   'proguard-rules.pro'
        }
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'flavor2-rules.pro'
        }
    }
}

這樣flavor2總共用了三個(gè)混淆規(guī)則。

  • Resource Shringking 清除無(wú)用資源
    無(wú)用的代碼清除完之后,就會(huì)有很多無(wú)用的資源文件殘留,在build.gradle文件中設(shè)置shrinkResources為true.
android {
    ...
    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }s
}
  • 清除為使用的可替代資源
    上面的Gradle resource shrinker只是刪除掉代碼中為引用的資源文件,但意味著不會(huì)刪除不同配置設(shè)備的可替代資源,例如項(xiàng)目中依賴的v7、v4中包含的20種國(guó)家的語(yǔ)言,有很多都用不到,可以通過(guò)設(shè)置resconfigs刪除這些可替代的資源文件:
android {
    defaultConfig {
        ...
        resConfigs "en"
    }
}

圖片壓縮

apk中最占資源之一的就是這些資源圖片了,而且一張稍微大點(diǎn)的圖片,不但占空間,在差的手機(jī)上經(jīng)常會(huì)出現(xiàn)OOM,

  • WebP谷歌提供的一種圖片數(shù)據(jù)格式,無(wú)損壓縮后的 WebP 比 PNG 文件少了 45% 的文件大小,原生支持Android4.0以上的,其他版本需要官方的依賴庫(kù)。
  • 矢量圖SVG:一個(gè)字體TextView代替一張資源文件
    目前只試過(guò)矢量圖

使用Splits針對(duì)不同的設(shè)備編譯不同的apk

  • 針對(duì)不同的屏幕進(jìn)行拆分

針對(duì)不同密度的屏幕,同一個(gè)應(yīng)用程序拆分為hdpi版本和mdpi版本

android {
  ...
  splits { 
  //Configures screen density split settings 
    density {       
    //Enables density APK splits        
      enable true        
      /*Specifies a list of screen densities Gradle should not create APK splits for**/      
      exclude "ldpi", "tvdpi", "xxxhdpi"        
      /** Specifies a list of compatible screen size settings for the manifest**/
      compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
  }

構(gòu)建完成后可以在out/apk/目錄下看到多個(gè)版本的APK

  • 針對(duì)不同的CPU進(jìn)行拆分

按ABI拆分,根據(jù)不同的CPU類型,只用相應(yīng)的.so庫(kù),之前測(cè)試的時(shí)候是只用的一個(gè)v7a的兼容的so庫(kù)。

android {
  ...
  splits {

    // Configures screen ABI split settings
    abi {

      // Enable ABI APK splits
      enable true

      // By default all ABIs are included, so use reset() and include to specify that we only
      // want APKs for x86, armeabi-v7a, and mips

      // Resets the list of ABIs that Gradle should create APKs for to none
      reset()

      // Specifies a list of ABIs that Gradle should create APKs for
      include "x86", "armeabi-v7a", "mips"

      // Specify that we do not want to also generate a universal APK that includes all ABIs
      universalApk false
    }
  }
}

其它

...

參考文獻(xiàn):

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容