Gradle系列(三):项目实践
Gradle系列(一):Groovy基礎 Gradle系列(二):AndroidStudio的Gradle簡介 Gradle系列(三):項目實踐
前言
就我現在工作項目來看,Gradle有這么幾個方面的應用:版本號統一管理,debug/release編譯模式區分,差異化編譯,aar自動化管理等,看完我下面講解,完全可以直接運用于你們的項目中,提高生產效率。
版本號統一管理
項目中肯定會以源碼形式引入不少開源庫,我們應該確保每個moduler的版本號:minSdkVersion ,compileSdkversion等都一樣,因此有必要統一管理: 在根目錄的build.gradle添加
ext { // SDK And Tools minSdkVersion = 14 targetSdkVersion = 23 compileSdkVersion = 23 buildToolsVersion = '24.0.2' //Dependencies supportLibraryVersion = '23.2.1' } 復制代碼在項目build.gradle中引用:
apply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId 'com.mainiway.demo' minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0.0" } } 復制代碼編譯模式區分
有這樣的場景:項目中的Log需要按照編譯模式做區分,debug模式打印所有Log,發布版本只打印Error級別,怎么在代碼中區分編譯模式? 辦法:項目中有個BuildConfig文件,位置在:(備注:如果編譯過release,那么同樣release文件夾也存在這個文件,內容一樣)
BuildConfig: public final class BuildConfig {public static final boolean DEBUG = Boolean.parseBoolean("true");public static final String APPLICATION_ID = "com.lubansoft.bimview4phone";public static final String BUILD_TYPE = "debug";public static final String FLAVOR = "";public static final int VERSION_CODE = 9;public static final String VERSION_NAME = "4.0.0";// Fields from default config.public static final boolean PUBLISH_MODE = false; } 復制代碼最后一個字段是我自定義的,前面都是這個配置文件自帶的,包括是否為DEBUG,appID,versionCode等。自定義的PUBLISH_MODE就是來區分當前是否是發布模式的: 方法:在項目的build.gradle中加入:
defaultConfig {...buildConfigField "boolean", "PUBLISH_MODE", "true" //發布模式(生產環境下設為true,其他設為false)...}``` 這樣就可以在編譯期間,把值寫入到BuildConfig,在發版當天把這個值設為true即可,然后再項目根據這個值來改變Log的打印規則: ```java// 設置Log調試開關LogUtil.setDebugState(!BuildConfig.PUBLISH_MODE); 復制代碼注意:BuildConfig中有個DEBUG字段,該字段在debug模式就是true,在release模式就是false,不需要手動設置,但是release模式不一定是發布模式(也可能是打一個簽名包測試)。
差異化編譯
需求場景:項目中引用了一些Jar包,只在調試模式下用到了,在發布模式根本用不到,但是編譯到項目中又會增大APP體積,能否只在發布模式下才去編譯呢? 方法:把這些jar包不要放在libs文件夾,跟libs平級建一個目錄比如:debugLibs,然后在項目的build.gradle根據當面的PUBLISH_MODE做差異化編譯:
dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')if (!publishMode) {compile fileTree(include: ['*.jar'], dir: 'debuglibs')}... } 復制代碼統一管理aar
這一個不是所有項目都會用到,但是我強烈建議去實踐的。實際項目中都會把一些基礎控件,基礎功能抽離出來,做為單獨項目基礎庫用單獨svn分支管理,在開發項目中寫一個腳本打包成aar文件拉到本地使用,既可以復用到不同項目又可以縮短編譯時間,一舉兩得。比如基礎庫按照UI,通用邏輯,業務通用模塊生成了三個aar:
在項目中使用: repositories{flatDir{dirs '../libs'} }dependencies {...compile(name: 'base_1.2.0', ext: 'aar')compile(name: 'commombase_1.0.0', ext: 'aar')compile(name: 'uibase_1.2.0', ext: 'aar') }``` 假設現在基礎庫增加了新的模塊,就會生成新的aar,或者產品迭代了這幾個aar版本號也要迭代,難道每次都在build.gradle中手動去改嗎,完全可以自動化這個過程。 方法:可以看出我把這幾個aar放到根目錄的libs文件夾(文件夾隨意),那就獲取這個文件夾下的所有文件名,動態引用。 ```java def path = rootProject.getRootDir().getAbsolutePath() + "/libs"def configFile = new File(path) //獲取文件夾下所有文件def files = configFile.listFiles(new FilenameFilter() {boolean accept(File dir, String name) { //文件名過濾,防止出錯if (name.contains("base")) {return true;} else {return false}}})def aar1 = files[0].getName()def aar2 = files[1].getName()def aar3 = files[2].getName() //動態引用這些aarcompile(name: '$aar1', ext: 'aar')compile(name: '$aar2', ext: 'aar')compile(name: '$aar3', ext: 'aar') 復制代碼這樣夠好了嗎? 這些代碼都在build.gradle的dependencies里面,太亂了,要是可以獨立出去就好了,把獲取aar封裝成工具類。OK,gradle完全支持這么干,在根目錄建一個utils.gradle
utils.gradle: //gradle工具類 //獲取基礎庫版本號 def getAARNames() {... //具體實現不寫了,返回一個String數組return ["$lbName", "$aar1", "$aar2","$aar3"] } ext { //注意這行不能少getAARNames = this.&getAARNames } 復制代碼在build.gradle中使用:
dependencies {...//獲取aar文件名,是一個數組def aarList = getAARNames()compile(name: aarList[0], ext: 'aar')compile(name: aarList[1], ext: 'aar')compile(name: aarList[1], ext: 'aar') } 復制代碼大功告成!代碼清爽很多。
精簡開源項目目錄結構
實際中肯定會以源碼形式用到不少開源庫,特別是UI相關的我們要該里面的代碼,只能以源碼形式,那么一些都是作為moduler和我們的app并列放到一個目錄,開源庫數量達到十幾個時項目結構看起來就主次不分了,有必要精簡之。 方法:直接在根目錄建立文件夾比如thirdpart,把開源庫都放進去,然后在settings.gradle中配置項目結構:
include ':bvcommon',':app',//這是主項目,下面都是開源庫':thirdpart:PullToRefreshLibrary',':thirdpart:datetimepicker-library',':thirdpart:MultilevelTreeLibrary',':thirdpart:FFmpegAndroid',':thirdpart:autolinklibrary'... 復制代碼總結
以上是生活随笔為你收集整理的Gradle系列(三):项目实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PG fdw 跨库建立外部表 (连接其它
- 下一篇: myeclipse问题