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中依賴也可能不同,但實現差異化構建的方法都是一樣的,這里就不一一展開進行說明了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容