2016/5/15

[Android] 把 Build Tool 升級到 25.1.6 編譯錯誤如何解決

最近將 Android SDK Tools 升級到 25.1.6。
今天將 Google 的官方 MVP 架構範例 clone 下來研究,正想要 Build 成 App 放在虛擬機上面跑時,遇到了編譯上的錯誤,看看錯誤訊息似乎與 ProGuard 有關。


Execution failed for task transformClassesWithNewClassShrinkerForProdDebug tools/proguard/proguard-android.txt line 43:15 extraneous input ‘[]’ expecting ‘)’

用 Google 搜尋看看有沒有人遇到跟我一樣的問題。
發現了這一篇: Proguard failing with 25.1.6 release of Android tools,發問者在下方表示:SDK Tools 更新時,自己本機端的 tools/proguard 似乎沒有隨著一起更新,於是他重新去下載了一份 SDK Manager ,再重新下載相關的檔案問題就解決了。
我也嘗試重新安裝,很遺憾我的問題並沒有被解決。
於是下意識的去看該 Project 的 build.gradle 檔案。 在 Debug Build Type 之中,開啟檔案後發現了有趣的線索:

buildTypes {
    debug {
        minifyEnabled true
        useProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguardTest-rules.pro'
    }
    // Release build type ...
}
可以看到 Google MVP 的範例檔案之中,既使是 Debug Build Type , Code Shrinking 依然是開啟的。
後來查了結果發現,原來這是 Android Plugin for Gradle 2.0 新增的特性,可以在編譯的時候將 Code Shrinking 開啟而不開啟 ProGuard ,並且可以編寫 Shrinking 的規則,就與 ProGuard 規則一樣。
它可以拿來移除掉沒有使用的 Code 但是不會對程式碼進行混淆或是最佳化。
Google 的團隊使用它與其他新的編譯特性來做編譯上的加速。
他們會將 Code Shrinking 與 Instant Run 一起使用。
詳情可以看這個網頁 Built-in shrinker
而目前這個問題的解法,就是把 Built-in shrinker 關閉,就可以正常的編譯了。
minifyEnabled false
也許還有其他的解決方式,或等 Google 更新 SDK Tools 才能真正解決。
這篇文章使用 StackEdit 來編寫,主要的需求是可以使用 Markdown ,但是看起來效果好像不太優。
想找找其他的替代方案阿…

沒有留言:

張貼留言