201601272241[Android] 使用 Gradle 編譯 Android subproject 的陷阱
Android 官方推薦使用 Gradle 來作為編譯工具已經有一段時間了,最近在本機上使用 Android Studio 開發 App 遇到怪異的現象,我的 debug log 沒有印出來。後來才知道 Gradle build 與 Ant build 之間對於 subproject 的 building 有某些差異。
在我的專案中,我在某個 subproject(package 為 com.autosun.sub)寫了一個 Log Utility class 內容大概像這樣子,利用 com.autosun.sub.BuildConfig.DEBUG 來決定是否輸出除錯用的 Log。
public class LogUtility { public static void info(String log) { Log.i(TAG, log); } public static void infoDebug(String log) { if (com.autosun.sub.BuildConfig.DEBUG) { info(log); } } }
然後在專案的其他地方就可以像這樣使用
LogUtility.infoDebug("This log is printed only in debug build");
當我使用 ant debug 來建置專案並執行 App 的時候,沒問題,所有的 debug log 都印出來了。可是利用 gradlew assembleDebug 建置出來的版本卻少了 debug log,反編譯 Gradle build 的 APK,發現 com.autosun.sub.BuildConfig.DEBUG 是 false。後來在 stackoverflow 網站上找到這個討論串:
BuildConfig.DEBUG always false when building library projects with gradle
http://stackoverflow.com/questions/20176284/buildconfig-debug-always-false-when-building-library-projects-with-gradle
並且官網也有註明
By default a library only publishes its release variant. This variant will be used by all projects referencing the library, no matter which variant they build themselves. This is a temporary limitation due to Gradle limitations that we are working towards removing.
原來利用 Gradle 建置 subproject 的時候,會產生 aar 檔,如果沒有自訂 flavor 的話會有 debug 與 release 兩份 aar 檔,預設都是吃 subproject 的 release build,所以即使我的 root project 是 debug build 也沒有影響。解決方法(應該說只是 workaround)有兩種。
方法一:
在 subproject(或者稱 library project)的 Gradle script 中設置為 publish 所有的 variant。
android { publishNonDefault true }
然後在 root project 的 Gradle script 裡,對 debug 與 release 個別設置 dependency。
dependencies { releaseCompile project(path: ':library', configuration: 'release') debugCompile project(path: ':library', configuration: 'debug') }
方法二:
直接在 subproject 的 Gradle script 設定 publish debug variant
android { defaultPublishConfig "debug" }
通常來說,方法一比較適用多數情況。
Reference
BuildConfig.DEBUG always false when building library projects with gradle
http://stackoverflow.com/questions/20176284/buildconfig-debug-always-false-when-building-library-projects-with-gradle
Gradle Plugin User Guide
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication
by autosun