日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gradle系列(三):项目实践

發(fā)布時間:2023/12/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gradle系列(三):项目实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Gradle系列(一):Groovy基礎(chǔ) Gradle系列(二):AndroidStudio的Gradle簡介 Gradle系列(三):項目實踐

前言

就我現(xiàn)在工作項目來看,Gradle有這么幾個方面的應(yīng)用:版本號統(tǒng)一管理,debug/release編譯模式區(qū)分,差異化編譯,aar自動化管理等,看完我下面講解,完全可以直接運用于你們的項目中,提高生產(chǎn)效率。

版本號統(tǒng)一管理

項目中肯定會以源碼形式引入不少開源庫,我們應(yīng)該確保每個moduler的版本號:minSdkVersion ,compileSdkversion等都一樣,因此有必要統(tǒng)一管理: 在根目錄的build.gradle添加

ext { // SDK And Tools minSdkVersion = 14 targetSdkVersion = 23 compileSdkVersion = 23 buildToolsVersion = '24.0.2' //Dependencies supportLibraryVersion = '23.2.1' } 復(fù)制代碼

在項目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" } } 復(fù)制代碼
編譯模式區(qū)分

有這樣的場景:項目中的Log需要按照編譯模式做區(qū)分,debug模式打印所有Log,發(fā)布版本只打印Error級別,怎么在代碼中區(qū)分編譯模式? 辦法:項目中有個BuildConfig文件,位置在:(備注:如果編譯過release,那么同樣release文件夾也存在這個文件,內(nèi)容一樣)

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; } 復(fù)制代碼

最后一個字段是我自定義的,前面都是這個配置文件自帶的,包括是否為DEBUG,appID,versionCode等。自定義的PUBLISH_MODE就是來區(qū)分當(dāng)前是否是發(fā)布模式的: 方法:在項目的build.gradle中加入:

defaultConfig {...buildConfigField "boolean", "PUBLISH_MODE", "true" //發(fā)布模式(生產(chǎn)環(huán)境下設(shè)為true,其他設(shè)為false)...}``` 這樣就可以在編譯期間,把值寫入到BuildConfig,在發(fā)版當(dāng)天把這個值設(shè)為true即可,然后再項目根據(jù)這個值來改變Log的打印規(guī)則: ```java// 設(shè)置Log調(diào)試開關(guān)LogUtil.setDebugState(!BuildConfig.PUBLISH_MODE); 復(fù)制代碼

注意:BuildConfig中有個DEBUG字段,該字段在debug模式就是true,在release模式就是false,不需要手動設(shè)置,但是release模式不一定是發(fā)布模式(也可能是打一個簽名包測試)。

差異化編譯

需求場景:項目中引用了一些Jar包,只在調(diào)試模式下用到了,在發(fā)布模式根本用不到,但是編譯到項目中又會增大APP體積,能否只在發(fā)布模式下才去編譯呢? 方法:把這些jar包不要放在libs文件夾,跟libs平級建一個目錄比如:debugLibs,然后在項目的build.gradle根據(jù)當(dāng)面的PUBLISH_MODE做差異化編譯:

dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')if (!publishMode) {compile fileTree(include: ['*.jar'], dir: 'debuglibs')}... } 復(fù)制代碼
統(tǒng)一管理aar

這一個不是所有項目都會用到,但是我強烈建議去實踐的。實際項目中都會把一些基礎(chǔ)控件,基礎(chǔ)功能抽離出來,做為單獨項目基礎(chǔ)庫用單獨svn分支管理,在開發(fā)項目中寫一個腳本打包成aar文件拉到本地使用,既可以復(fù)用到不同項目又可以縮短編譯時間,一舉兩得。比如基礎(chǔ)庫按照UI,通用邏輯,業(yè)務(wù)通用模塊生成了三個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') }``` 假設(shè)現(xiàn)在基礎(chǔ)庫增加了新的模塊,就會生成新的aar,或者產(chǎn)品迭代了這幾個aar版本號也要迭代,難道每次都在build.gradle中手動去改嗎,完全可以自動化這個過程。 方法:可以看出我把這幾個aar放到根目錄的libs文件夾(文件夾隨意),那就獲取這個文件夾下的所有文件名,動態(tài)引用。 ```java def path = rootProject.getRootDir().getAbsolutePath() + "/libs"def configFile = new File(path) //獲取文件夾下所有文件def files = configFile.listFiles(new FilenameFilter() {@Overrideboolean 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() //動態(tài)引用這些aarcompile(name: '$aar1', ext: 'aar')compile(name: '$aar2', ext: 'aar')compile(name: '$aar3', ext: 'aar') 復(fù)制代碼

這樣夠好了嗎? 這些代碼都在build.gradle的dependencies里面,太亂了,要是可以獨立出去就好了,把獲取aar封裝成工具類。OK,gradle完全支持這么干,在根目錄建一個utils.gradle

utils.gradle:

//gradle工具類 //獲取基礎(chǔ)庫版本號 def getAARNames() {... //具體實現(xiàn)不寫了,返回一個String數(shù)組return ["$lbName", "$aar1", "$aar2","$aar3"] } ext { //注意這行不能少getAARNames = this.&getAARNames } 復(fù)制代碼

在build.gradle中使用:

dependencies {...//獲取aar文件名,是一個數(shù)組def aarList = getAARNames()compile(name: aarList[0], ext: 'aar')compile(name: aarList[1], ext: 'aar')compile(name: aarList[1], ext: 'aar') } 復(fù)制代碼

大功告成!代碼清爽很多。

精簡開源項目目錄結(jié)構(gòu)

實際中肯定會以源碼形式用到不少開源庫,特別是UI相關(guān)的我們要該里面的代碼,只能以源碼形式,那么一些都是作為moduler和我們的app并列放到一個目錄,開源庫數(shù)量達到十幾個時項目結(jié)構(gòu)看起來就主次不分了,有必要精簡之。 方法:直接在根目錄建立文件夾比如thirdpart,把開源庫都放進去,然后在settings.gradle中配置項目結(jié)構(gòu):

include ':bvcommon',':app',//這是主項目,下面都是開源庫':thirdpart:PullToRefreshLibrary',':thirdpart:datetimepicker-library',':thirdpart:MultilevelTreeLibrary',':thirdpart:FFmpegAndroid',':thirdpart:autolinklibrary'... 復(fù)制代碼

總結(jié)

以上是生活随笔為你收集整理的Gradle系列(三):项目实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。