「Android Tips」使用 ProGuard 移除無用輸出語句

weixin_34321977發表於2015-07-18

首先,來看一段這樣的程式碼。

if (LogUtil.sEnable) {
    Log.d(TAG, "some output");
}

從接觸 Android 開始,這樣的程式碼我在各種不同的專案裡都見過。這樣做有什麼不對的地方嗎?並沒有。可是有更好的解決方式嗎?

上述程式碼將應用的 Log 輸出用一個開關控制,如果是 Debug 版本則開啟輸出。反之如果是 Released 版本,則關閉輸出。

新的解決辦法就是通過 ProGuard 這個工具。在所有 Android 應用中,都有一個配置檔案 Proguard。通常,我們都使用這個檔案混淆我們的程式碼。但是官方文件是這樣說明的:

The ProGuard tool shrinks, optimizes, and obfuscates your code by removing unused code and renaming classes, fields, and methods with semantically obscure names. The result is a smaller sized .apk file that is more difficult to reverse engineer.

裡面提到一點,說 ProGuard 可以移除無用的程式碼,在查閱了官方文件之後會發現,-assumenosideeffects 選項會在版本構建的時候就將指定的原始碼移除。

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** i(...);
    public static *** v(...);
}

示例程式碼演示了在 Released 版本中,debug, info, verbose 三個等級的 Log 輸出將被刪除。通過自定義,不僅可以在 Log 控制輸出等級,還能減小安裝包的體積,簡直一石二鳥!

IMPORTANT


需要注意的是,必須不能有關閉優化的配置-dontoptimize,否則上述方法將無效。

相關文章