有效減少 Android 應(yīng)用的方法數(shù)

簡評:65k 限制確實(shí)是個令人不爽的事情,這里就讓你知道是哪些庫用了大量的方法,并該

現(xiàn)在的應(yīng)用越來越大,方法數(shù)經(jīng)常達(dá)到 65k 限制。這里就介紹下如何可視化 library 方法數(shù)和減少方法數(shù)的方法。

可視化方法數(shù)

可視化各 library 方法數(shù)的簡單辦法就是使用 Dexcount Gradle Plugin,只需要在 app/build.gradle 中簡單的集成:

buildscript {
    repositories {
        mavenCentral() // or jcenter()
    }

    dependencies {
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.4'
    }
}

// make sure this line comes *after* you apply the Android plugin
apply plugin: 'com.getkeepsafe.dexcount'

在項(xiàng)目中運(yùn)行 ./gradlew assembleDebug 就會在 console 中輸出:


并會在 build/outputs/dexcount/debugChart 中生成一個可交互的圖形報(bào)告:


減少方法數(shù)

在我們選用 library 之前,有必要考慮其方法數(shù),原因有二:

  1. 更換現(xiàn)有程序中已使用的庫非常有挑戰(zhàn)性,所以最好之前就想好。
  2. 很多人引入了一個很大的 library,但只是為了做很簡單的事(Strings.isNullOrEmpty()),通常你都用不到 library 的所有方法。

這里可以用 methodscount.com 來查詢常用庫的方法數(shù)。

對于一個功能,通常都會有好幾個庫能完成這一個功能。這里以圖片加載為例:



這些庫都有各自的優(yōu)缺點(diǎn),所以清楚了解自己的需求,并選擇庫很有必要。

那對于已經(jīng)使用的庫,有沒有辦法來減少方法數(shù)呢?

我們可以用 Proguard 來剔除庫中未使用的部分。這里我們用 Guava 來舉例,首先我們需要知道項(xiàng)目實(shí)際用到了哪些部分,在 src 文件夾下運(yùn)行下面的命令:

grep -roh . -e 'com.google.common.*' | sort | uniq

也就是根據(jù)庫的前綴來查找所有的 import 語句(對于 Guava 來說就是 com.google.common)。

之后,創(chuàng)建一個 Proguard 配置:

-dontoptimize
-dontobfuscate

-keep public class com.google.common.base.** {
    public *;
}

-keep public class com.google.common.collect.** {
    public *;
}

-keep public class com.google.common.primitives.** {
    public *;
}

-keep public class com.google.common.util.** {
    public *;
}
...

執(zhí)行一個 Gradle 腳本,就可以生成一個縮小版的庫,再將其復(fù)制到項(xiàng)目的 libs 文件夾中進(jìn)行使用。

上面的技巧一定要謹(jǐn)慎使用,因?yàn)槭俏覀兪謩訄?zhí)行的,所以更容易出錯,一定要多多測試。
詳細(xì)用法可以進(jìn)一步參考作者的項(xiàng)目

原文:EFFICIENTLY REDUCING YOUR METHOD COUNT
歡迎關(guān)注知乎專欄「極光日報(bào)」,每天為 Makers 導(dǎo)讀三篇優(yōu)質(zhì)英文文章。

延伸閱讀

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

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

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