最近項目中引用的第三方庫越來越多,其中一些只在開發中才需要,在正式版本中雖然沒開啓,但仍被打包進了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實踐一下
這裏我們在主工程中對moudule進行依賴,並且在module中採用debugCompile方式依賴第三方的庫
然後編譯,會發現直接提示錯誤
這是因爲主工程依賴子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中依賴也可能不同,但實現差異化構建的方法都是一樣的,這裏就不一一展開進行說明了。