Android 利用Gradle實現差異化構建

最近項目中引用的第三方庫越來越多,其中一些只在開發中才需要,在正式版本中雖然沒開啓,但仍被打包進了apk包中,使apk包中增加了無用的代碼,本文便是爲了解決此問題。

dependencies的多種方式

首先我們先來回顧一下在gradle中的多種dependencies方式。


  • Compile 默認的依賴方式,任何情況下都會依賴。
  • Provided 只提供編譯時依賴,打包時不會添加進去。
  • Apk 只在打包Apk包時依賴,這個應該是比較少用到的。
  • TestCompile 只在測試時依賴
  • DebugCompile 只在Debug構建時依賴
  • ReleaseCompile 只在Release構建時依賴

實現差異化構建

這裏我們以facebook的stetho爲例子,現假如我們只需要在開發的時候使用stetho,而在正式上線時不使用,我們可以這樣寫



通常我們會在Application中進行初始化Sdk的操作

public class TestApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        if (BuildConfig.DEBUG) {
            Stetho.initializeWithDefaults(this);
        }
    }
}

這樣寫在我們將依賴方式改成debugCompile後會發現正式打包release的時候會編譯失敗,因爲正式打包時並不會將debugCompile的內容打包進去,而Application中又包含了相關的代碼,所以便會提示找不到xx類。

這裏我們在src目錄下建立debug目錄和release目錄,並在這兩個目錄下面建立一個SdkManager類。



這裏要注意debug和release的包結構需要相同,且不能在main目錄下仍有相同的類。

SdkManager的代碼很簡單,debug中的SdkManager如下:

public class SdkManager {
    public static void init(Context context) {
        Stetho.initializeWithDefaults(context);
    }
}

因爲我們release中不需要進行依賴,故release中的SdkManager便沒作其他操作,大家也可以根據實際需求,如有什麼是需要僅在release下使用的,便可以在這裏進行操作。release中的SdkManager如下:

public class SdkManager {
    public static void init(Context context) {

    }
}

然後在Application中我們只需這樣調用

public class TestApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        SdkManager.init(this);
    }
}

這樣我們便完成了簡單的差異化構建,考慮到在項目中我們很可能很多個moudule,在module中又要實現差異化構建,這裏我們也新建一個名爲testlibrary的module實踐一下


主工程的build.gradle

這裏我們在主工程中對moudule進行依賴,並且在module中採用debugCompile方式依賴第三方的庫


module的build.gradle

然後編譯,會發現直接提示錯誤



這是因爲主工程依賴子module時默認依賴的是子module的release版本,而我們的第三方庫僅在debug下進行依賴,即debug版本的主工程依賴的是release版本的module,所以肯定會編譯失敗,提示找不到xx類。那麼我們只需要讓主工程在debug版本下依賴module的debug版本,在release下依賴module的release版本即可解決問題。

首先在module的build.gradle文件中,增加 publishNonDefault true ,讓module不再按默認只構建release版本

android {
     ...
    publishNonDefault true
}
dependencies {
    ...
    debugCompile 'com.facebook.stetho:stetho:1.4.2'
}

在主工程的build.gradle中,增加如下代碼:

dependencies {
     ...
    debugCompile project(path:':testlibrary',configuration:'debug')
    releaseCompile project(path:':testlibrary',configuration:'release')
}

重新編譯,即可編譯通過。這裏我們只是舉了簡單的例子,實際開發中大家可能會有各種各樣的productFlavors,在不同的productFlavors中依賴也可能不同,但實現差異化構建的方法都是一樣的,這裏就不一一展開進行說明了。

發佈了79 篇原創文章 · 獲贊 34 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章