2012-07-04 68 views
4

剛纔我想到,我們使用的ProGuard代碼優化之一,即合併類層次結構,可能根本不是一個好選擇。在Android/Dalvik上推薦使用ProGuard合併類嗎?

我的預感是合併類以減少ClassLoader的調用是有益的,至少在JVM上這是一種特別慢的操作,在我們的代碼中,我們選擇了許多較小的(通常是內部)類而不是大型的God對象類,所以ClassLoader會運行得相對頻繁。但是,考慮到所有類將被合併爲一個類的極端(可能不太可能)的情況,那麼即使加載器只會被調用一次,我們最終會將大量代碼加載到內存中,這很可能會從來沒有使用過(80/20規則適用於此,以及我猜)。

這讓我疑惑:

1)如何快速在Dalvik的真正類加載?這是一個值得減少使用類合併的操作嗎?

2)這就是說,你會推薦在Android上使用類合併嗎?

回答

4

垂直類合併會在不必要地拆分時將類/接口與其擴展/實現摺疊。這應該永遠是一個改進(規模和性能)。

對於水平類合併,我無法提供一般答案。代碼庫將會更小,但有些代碼可能會很快加載,或者極端,不必要地加載。

+1

@直接合並:只是它使調試更加困難,因爲堆棧跟蹤將指向超類中的行,當這些方法實際上定義在子類上時。任何想法如何解決這個困境?我們想要的是能夠調試錯誤報告和小應用程序大小的良好平衡。 – Matthias

+0

另外,我仍然想知道在Dalvik上加載類是否應該儘量避免,或者它是一個相對較快的操作? – Matthias