有效減少 Android 應用的方法數

簡評:65k 限制確實是個令人不爽的事情,這裡就讓你知道是哪些庫用了大量的方法,並該怎麼減少這些庫的方法數。

現在的應用越來越大,方法數經常達到 65k 限制。這裡就介紹下如何可視化 library 方法數和減少方法數的方法。

可視化方法數

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

buildscript {n repositories {n mavenCentral() // or jcenter()n }nn dependencies {n classpath com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.4n }n}nn// make sure this line comes *after* you apply the Android pluginnapply plugin: com.getkeepsafe.dexcountn

在項目中運行 ./gradlew assembleDebug 就會在 console 中輸出:

並會在 build/outputs/dexcount/debugChart 中生成一個可交互的圖形報告:

減少方法數

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

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

這裡可以用 methodscount.com 來查詢常用庫的方法數。

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

這些庫都有各自的優缺點,所以清楚了解自己的需求,並選擇庫很有必要。

那對於已經使用的庫,有沒有辦法來減少方法數呢?

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

grep -roh . -e com.google.common.* | sort | uniqn

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

之後,創建一個 Proguard 配置:

-dontoptimizen-dontobfuscatenn-keep public class com.google.common.base.** {n public *;n}nn-keep public class com.google.common.collect.** {n public *;n}nn-keep public class com.google.common.primitives.** {n public *;n}nn-keep public class com.google.common.util.** {n public *;n}n...n

執行一個 Gradle 腳本,就可以生成一個縮小版的庫,再將其複製到項目的 libs 文件夾中進行使用。

上面的技巧一定要謹慎使用,因為是我們手動執行的,所以更容易出錯,一定要多多測試。

詳細用法可以進一步參考作者的項目:github.com/JeroenMols/M

原文:EFFICIENTLY REDUCING YOUR METHOD COUNT

擴展閱讀:

  • 認識 android-job

歡迎關註:知乎專欄「極光日報」,每天為 Makers 導讀三篇優質英文文章。


推薦閱讀:

TAG:Android | Android开发 | 编程 |