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.DEBUGfalse。後來在 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

回應
    沒有新回應!
關鍵字
共用引入檔