架構(gòu)師(二)——gradle語法

項(xiàng)目結(jié)構(gòu)

在根目錄創(chuàng)建config.gradle,并把公用的字段定義好

// 添加多個(gè)自定義屬性,可以通過ext代碼塊
ext {

    username = "simon"

    // 生產(chǎn)/開發(fā)環(huán)境(正式/測(cè)試)
    isRelease = true

    // 建立Map存儲(chǔ),對(duì)象名锐秦、key都可以自定義,groovy糖果語法内舟,非常靈活
    androidId = [
            compileSdkVersion: 28,
            buildToolsVersion: "29.0.0",
            minSdkVersion    : 19,
            targetSdkVersion : 28,
            versionCode      : 1,
            versionName      : "1.0"
    ]

    appId = [
            app    : "com.netease.modular.gradle",
            library: "com.netease.modular.library"
    ]

    // 生產(chǎn)/開發(fā)環(huán)境URL
    url = [
            "debug"  : "https://11.22.33.44/debug",
            "release": "https://11.22.33.44/release"
    ]

    supportLibrary = "28.0.0" // ${xxx}
    // 第三方庫
    dependencies = [
            "appcompat" : "com.android.support:appcompat-v7:${supportLibrary}",
            "recyclerview" : "com.android.support:recyclerview-v7:${supportLibrary}",
            "constraint" : "com.android.support.constraint:constraint-layout:1.1.3"
    ]
}

接下來看app中的build.gradle

如果要在build.gradle中打印墓塌,可以使用
println("hello gradle")
println "hello gradle"

要訪問config.gradle中定義的字段羹铅,首先要在根目錄的build.gradle中加入一條語句apply from: "config.gradle",相當(dāng)于include坐漏。這樣薄疚,所有的module都可以訪問這個(gè)config.gradle
如果把字段直接放到根目錄的build.gradle里面,也是可以的仙畦,不需要apply from输涕,可以直接訪問

訪問自定義的字段
使用"${xxxxxxx}"
比如說訪問config.gradle中的username,可以使用println "${username}"
如果要修改變量的值慨畸,那就要使用全路徑:rootProject.ext.username = 163

賦值與引用

def androidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.dependencies
def url = rootProject.ext.url
//使用
compileSdkVersion androidId.compileSdkVersion

遍歷map

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // 標(biāo)準(zhǔn)寫法
    // implementation group: 'com.android.support', name:'appcompat-v7', version:'28.0.0'
    // 簡(jiǎn)寫
    // implementation 'com.android.support:appcompat-v7:28.0.0'

    // 依賴library庫
    implementation project(":library")
//    implementation support.appcompat
//    implementation support.recyclerview
//    implementation support.constraint

    // 依賴第三方庫最簡(jiǎn)潔的方式:
    support.each { k, v -> implementation v }
}

另一種寫法
在gradle.properties中定義字段莱坎,比如:
MIN_SDK_VERSION = 15
TAR_SDK_VERSION = 28
COMPILER_SDK_VESION = 28
LOGIN_IS_APPLICATION = false
MEMBER_IS_APPLICATION = false
在build.gradle中這樣使用
minSdkVersion MIN_SDK_VERSION.toInteger()
targetSdkVersion TAR_SDK_VERSION.toInteger()
if(!LOGIN_IS_APPLICATION.toBoolean()){
}

代碼中使用自定義的字段

// 簽名配置(必須寫在buildTypes之前)
    signingConfigs {
        debug {
            storeFile file('C:/Users/Administrator/.android/debug.keystore')
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
        release {
            // 簽名證書文件
            storeFile file('D:/NetEase/netease.jks')
            // 簽名證書的類型
            storeType "netease"
            // 簽名證書文件的密碼
            storePassword "net163"
            // 簽名證書中密鑰別名
            keyAlias "netease"
            // 簽名證書中該密鑰的密碼
            keyPassword "net163"
            // 是否開啟V2打包
            v2SigningEnabled true
        }
    }
    buildTypes {
        debug {
            // 對(duì)構(gòu)建類型設(shè)置簽名信息
            signingConfig signingConfigs.debug
            buildConfigField("String", "debug", "\"${url.debug}\"")
        }

        release {
            minifyEnabled false
            // 對(duì)構(gòu)建類型設(shè)置簽名信息
            signingConfig signingConfigs.release
            buildConfigField("String", "debug", "\"${url.release}\"")
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

注意看這一句buildConfigField("String", "debug", ""${url.debug}"")
這個(gè)加上之后,重新build一下工程寸士,就會(huì)在BuildConfig.java中生成自定義的字段檐什,代碼中可以通過BuildConfig.debug去訪問
我們可以看到debug和release是不一樣的

app\build\generated\source\buildConfig\debug\com\netease\modular\gradle\BuildConfig.java
public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.netease.modular.gradle";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from build type: debug
  public static final String debug = "https://11.22.33.44/debug";
}
app\build\generated\source\buildConfig\release\com\netease\modular\gradle\BuildConfig.java
public final class BuildConfig {
  public static final boolean DEBUG = false;
  public static final String APPLICATION_ID = "com.netease.modular.gradle";
  public static final String BUILD_TYPE = "release";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from build type: release
  public static final String debug = "https://11.22.33.44/release";
}

一些其他配置

// 將svg圖片生成 指定維度的png圖片
// vectorDrawables.generatedDensities('xhdpi','xxhdpi')
// 使用support-v7兼容(5.0版本以上)
vectorDrawables.useSupportLibrary = true
// 只保留指定和默認(rèn)資源
resConfigs('zh-rCN')

// 配置so庫CPU架構(gòu)(真機(jī):arm,模擬器:x86)
// x86  x86_64  mips  mips64
ndk {
    //abiFilters('armeabi', 'armeabi-v7a')
    // 為了模擬器啟動(dòng)
    abiFilters('x86', 'x86_64')
}



// 源集 - 設(shè)置源集的屬性弱卡,更改源集的 Java 目錄或者自由目錄等
sourceSets {
    main {
        if (!isRelease) {
            // 如果是組件化模式乃正,需要單獨(dú)運(yùn)行時(shí)
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res']
            resources.srcDirs = ['src/main/resources']
            aidl.srcDirs = ['src/main/aidl']
            assets.srcDirs = ['src/main/assets']
        } else {
            // 集成化模式,整個(gè)項(xiàng)目打包
            manifest.srcFile 'src/main/AndroidManifest.xml'
        }
    }
}   
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婶博,一起剝皮案震驚了整個(gè)濱河市瓮具,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凡人,老刑警劉巖名党,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挠轴,居然都是意外死亡传睹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門岸晦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欧啤,“玉大人,你說我怎么就攤上這事启上⌒纤恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵冈在,是天一觀的道長(zhǎng)府框。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么迫靖? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮兴使,結(jié)果婚禮上系宜,老公的妹妹穿的比我還像新娘。我一直安慰自己发魄,他們只是感情好盹牧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著励幼,像睡著了一般汰寓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苹粟,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天有滑,我揣著相機(jī)與錄音,去河邊找鬼嵌削。 笑死毛好,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苛秕。 我是一名探鬼主播肌访,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼艇劫!你這毒婦竟也來了吼驶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤店煞,失蹤者是張志新(化名)和其女友劉穎蟹演,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浅缸,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轨帜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衩椒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚌父。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖毛萌,靈堂內(nèi)的尸體忽然破棺而出苟弛,到底是詐尸還是另有隱情,我是刑警寧澤阁将,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布膏秫,位于F島的核電站,受9級(jí)特大地震影響做盅,放射性物質(zhì)發(fā)生泄漏缤削。R本人自食惡果不足惜窘哈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亭敢。 院中可真熱鬧滚婉,春花似錦、人聲如沸帅刀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扣溺。三九已至骇窍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锥余,已是汗流浹背腹纳。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哈恰,地道東北人只估。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像着绷,于是被迫代替她去往敵國和親蛔钙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容