Android Gradle

Android 中build.gradle文件是兩個

  • app/build.gradle
  • project/build.gradle

app/build.gradle

app/build.gradle
* 上圖① ② ③ ④ ⑤分別為:項目類型(應用或者是一個libary)风范、Android編譯版本、manifest上的基本配置届腐、創(chuàng)建類型嵌莉、外部依賴
詳細介紹:
apply plugin: 'com.android.application'// 聲明是Android程序

android {
    //版本配置
    compileSdkVersion 26//是你SDK的版本號蚁孔。
    buildToolsVersion "26.0.2"http://是你構建工具的版本袱讹,其中包括了打包工具aapt矩屁、dx等等
    defaultConfig {
        //應用的包名在安卓設備和商店中是作為應用的唯一標識纪隙,所以遍膜,一旦發(fā)布了應用程序碗硬,就不應該再修改,否則將被視為完全不同的應用
        applicationId "com.suchengkeji.andeoid.gradlerdemo"
        //SDK配置
        minSdkVersion 21//app運行所需的最低sdk版本.低于minSdkVersion的手機將無法安裝
        targetSdkVersion 26 //應用的兼容模式
        versionCode 1//整數值瓢颅,代表應用程序代碼的相對版本恩尾,也就是版本更新過多少次。
        versionName "1.0"http://字符串值挽懦,代表應用程序的版本信息翰意,需要顯示給用戶。
        // dex突破65535的限制
        multiDexEnabled true//下面有介紹
    }
    buildTypes {
        release {
            // 是否進行混淆(設置是否使用優(yōu)化打包)
            minifyEnabled false
            //設置為true后信柿,生成的APK會去掉未使用的資源冀偶,減少APK的體積
             shrinkResources true
             //是否啟動zipAlign優(yōu)化
             zipAlignEnabled false
             // 混淆文件的位置(設置proguard文件(用于混淆代碼))
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    // 編譯libs目錄下的所有jar包
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //編譯所添加的外部依賴庫
    compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    // 編譯libray模塊
    compile project(':libray')
    // 編譯extras目錄下的librayTwo模塊(如果模塊在某(extras)目錄下)
    compile project(':extras:librayTwo')
}

要點:

  • Android程序聲明處:apply plugin: 'com.android.application'是最新的寫法,以前的寫法是apply plugin: 'android'
  • compileSdkVersion:是你SDK的版本號渔嚷。告訴Gradle用哪個AndroidSDK版本編譯你的應用进鸠。使用任何新添加的 API 就需要使用對應版本的 Android SDK。
    • 修改 compileSdkVersio不會改變運行時的行為形病。當你修改了compileSdkVersion的時候客年,可能會出現(xiàn)新的編譯警告、編譯錯誤漠吻,但新的compileSdkVersion不會被包含到APK 中:它純粹只是在編譯的時候使用量瓜。
  • buildToolsVersion:是你構建工具的版本,其中包括了打包工具aapt侥猩、dx等等榔至。這個需要你本地安裝該版本才行,很多人導入新的第三方庫欺劳,失敗的原因之一是buildversion的版本不對,這個可以手動更改成你本地已有的版本或者打開SDKManager去下載對應版本
  • minSdkVersion:應用可以運行的最低要求,低于minSdkVersion的手機將無法安裝铅鲤。在開發(fā)時minSdkVersion也起到一個重要角色:lint 默認會在項目中運行划提,它在你使用了高于 minSdkVersion的API 時會警告你,幫你避免調用不存在的 API 的運行時問題(比如 minSdkVersion9但你使用了 sdkVersion 10 才有的API就會警告 )邢享。
    • 如果只在較高版本的系統(tǒng)上才使用某些API鹏往,通常使用運行時檢查系統(tǒng)版本的方式解決。 比如這樣
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //......
    }
    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT&&Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        //.......
    }
    
  • applicationId:應用的包名在安卓設備和商店中是作為應用的唯一標識骇塘,所以伊履,一旦發(fā)布了應用程序韩容,就不應該再修改applicationId,否則將被視為完全不同的應用
    • application ID以前直接綁定到包名稱; 因此一些Android API在其方法名稱和參數名稱中使用術語“包名稱”唐瀑,但這實際上是application ID群凶。 例如,Context.getPackageName()方法返回application ID哄辣。 沒有必要在app代碼之外分享代碼的真實包名请梢。
    • 如果您正在使用WebView,請考慮在application ID中使用您的程序包名稱作為前綴; 否則您可能會遇到問題applicationIdSuffix breaks some WebView use cases in apps的問題力穗。
      *targetSdkVersion:是Android提供向前兼容的主要依據毅弧,在應用的targetSdkVersion沒有更新之前系統(tǒng)不會應用最新的行為變化。
    • 隨著 Android 系統(tǒng)的升級当窗,某個系統(tǒng)的API或者模塊的行為可能會發(fā)生改變够坐,但是為了保證老 APK 的行為還是和以前兼容。只要APK的targetSdkVersion不變崖面,即使這個APK安裝在新Android系統(tǒng)上咆霜,其行為還是保持老的系統(tǒng)上的行為,這樣就保證了系統(tǒng)對老應用的前向兼容性嘶朱。
      *versionCode:整數值蛾坯,代表應用程序代碼的相對版本,也就是版本更新過多少次
    • 整數值有利于其它程序比較疏遏,檢查是升級還是降級脉课。你可以把這個值設定為任何想設的值,但是财异,你必須保證后續(xù)更新版的值要比這個大倘零。系統(tǒng)不會強制要求這一行為,但是隨著版本更新值也增加是正常的行為戳寸。
    • 一般來說呈驶,你發(fā)布的第一版程序的versionCode設定為1,然后每次發(fā)布都會相應增加袖瞻,不管發(fā)布的內容是較大還是較小的聋迎。這意味著android:versionCode不像應用程序的發(fā)布版本(android:versionName)那樣顯示給用戶霉晕。應用程序和發(fā)布的服務不應該顯示這個版本值給用戶。
  • versionName:字符串值拄轻,代表應用程序的版本信息恨搓,需要顯示給用戶奶卓。
    • 與android:versionCode一樣夺姑,系統(tǒng)不會為了任何內部的目的使用這個值盏浙,除了顯示給用戶外荔茬。發(fā)布的服務也需要提取這個值來顯示給用戶。

buildTypes:構建類型丐黄,一般可以分為debug(主要用于開發(fā)階段)和release(生產發(fā)布階段)

        buildTypes {
        release {
            //是否進行混淆(設置是否使用優(yōu)化打包)
             minifyEnabled </strong> false
            //設置為true后孔飒,生成的APK會去掉未使用的資源,減少APK的體積
             shrinkResources true
             //是否啟動zipAlign優(yōu)化
             zipAlignEnabled false
            // 混淆文件的位置(設置proguard文件(用于混淆代碼))
            proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'</strong>
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
  • zipAlignEnabled:AndroidSDK中包含一個“zipalign”的工具桂对,它能夠對打包的應用程序進行優(yōu)化蕉斜。在你的應用程序上運行zipalign缀棍,使得在運行時Android與應用程序間的交互更加有效率睦柴。因此坦敌,這種方式能夠讓應用程序和整個系統(tǒng)運行得更快狱窘。

配置多渠道打包(風格定制 )

android{
    //配置多渠道打包(項目風格)
    productFlavors {
        huawei {
            applicationId "com.suchengkeji.andeoid.gradlerdemo.huawei"
        }
        wandoujia {
            applicationId "com.suchengkeji.andeoid.gradlerdemo.wandoujia"
        }
    }
}

配置打包簽名設置

 android{
    signingConfigs {//簽名的配置
        debug {
            storeFile file('H:\\configTest.jks')//簽名文件路徑
            storePassword "123456"http://簽名密鑰密碼
            keyAlias "configTest"http://.jks文件別名
            keyPassword "123456"  //簽名公鑰密碼
        }
        release {
            storeFile file('H:\\configTest.jks')//簽名文件路徑
            storePassword "123456"
            keyAlias "configTest"
            keyPassword "123456"  //簽名密碼
        }
    }
}
  • 配置完成打包簽名設置后再buildTypes{}中的release{}中天機打包命令行(可選設置)設置后可以通過命令打包
    • gradlew assembleRelease:這個是打包所有渠道(風格)release版本
    • gradlew assembleBaiduRelease:只要打某個渠道的

    打包后的apk文件在app–>build–>outputs—>apk中

    使用gradlew時可能出現(xiàn)沒有找到該命令,需要chmod 755 gradlew

打包命令行

project/build.gradle(根目錄下的build.gradle)

  • 用于添加子工程或模塊共用的配置項。
  • buildscript:配置此項目的構建腳本類路徑淹禾。
  • repositories:配置該項目的存儲庫铃岔。
    • 支持java 依賴庫管理(maven/ivy),用于項目的依賴汪疮。
    • 如果需要的話,從https://jcenter.bintray.com/下載code reposities智嚷。
  • dependencies:配置此項目的依賴關系。
    • 依賴包的定義盏道。支持maven/ivy,遠程载碌,本地庫,也支持單文件
    • 定義classpath恐仑,gradle會從“repositories”中下載對應版本的Gradle泉坐。如果使用gradle wrapper的話,感覺這個配置會被忽略裳仆。Wrapper會自己去下載所使用的gradle版本。
    • **不要把你的應用程序依賴這里歧斟;他們屬于個別模塊build.gradle文件
  • allprojects:該配置會被應用到所有的子工程静袖。
// 運行gradle clean時坠陈,執(zhí)行此處定義的task。
// 該任務繼承自Delete仇矾,刪除根目錄中的build目錄贮匕。
// 相當于執(zhí)行Delete.delete(rootProject.buildDir)。
// gradle使用groovy語言刻盐,調用method時可以不用加()掏膏。
task clean(type: Delete) {
    delete rootProject.buildDir
}

提下根目錄下還有一個setting.gradle:

  • 作用就是導入子工程。它支持導入多個子工程敦锌,使整個工程支持multi-project的編譯馒疹。
  • 調用include函數,將子工程app(目錄名為app)導入進來供屉。
    include ':app'(有多個時用逗號分開)

dex突破65535的限制

  • 首先是在defaultConfig節(jié)點使能多DEX功能


    dex.png
  • 然后就是在dependencies{}中引入multidex庫文件
dependencies {
    compile 'com.android.support:multidex:1.0.0'
}
  • 最后就是你的AppApplication繼承一下MultiDexApplication即可行冰。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伶丐,隨后出現(xiàn)的幾起案子悼做,更是在濱河造成了極大的恐慌,老刑警劉巖哗魂,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肛走,死亡現(xiàn)場離奇詭異,居然都是意外死亡录别,警方通過查閱死者的電腦和手機朽色,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來组题,“玉大人葫男,你說我怎么就攤上這事〈蘖校” “怎么了梢褐?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赵讯。 經常有香客問我盈咳,道長,這世上最難降的妖魔是什么边翼? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任鱼响,我火速辦了婚禮,結果婚禮上组底,老公的妹妹穿的比我還像新娘丈积。我一直安慰自己筐骇,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布桶癣。 她就那樣靜靜地躺著拥褂,像睡著了一般娘锁。 火紅的嫁衣襯著肌膚如雪牙寞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天莫秆,我揣著相機與錄音间雀,去河邊找鬼。 笑死镊屎,一個胖子當著我的面吹牛惹挟,可吹牛的內容都是我干的。 我是一名探鬼主播缝驳,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼连锯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了用狱?” 一聲冷哼從身側響起运怖,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夏伊,沒想到半個月后摇展,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡溺忧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年咏连,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲁森。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡祟滴,死狀恐怖,靈堂內的尸體忽然破棺而出歌溉,到底是詐尸還是另有隱情垄懂,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布研底,位于F島的核電站埠偿,受9級特大地震影響,放射性物質發(fā)生泄漏榜晦。R本人自食惡果不足惜冠蒋,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乾胶。 院中可真熱鬧抖剿,春花似錦朽寞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缩宜,卻和暖如春肘迎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锻煌。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工妓布, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宋梧。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓匣沼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捂龄。 傳聞我的和親對象是個殘疾皇子释涛,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,190評論 25 707
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項,請點擊這里進行查閱:DSL參考 1.1新構建系統(tǒng)...
    Chuckiefan閱讀 12,138評論 8 72
  • 這一章主要針對項目中可以用到的一些實用功能來介紹Android Gradle倦沧,比如如何隱藏我們的證書文件唇撬,降低風險...
    acc8226閱讀 7,628評論 3 25
  • 今天上中班,來到公司被質檢室的同事過去了刀脏,說是干的活出了質檢問題局荚,我接班的同事說,干吧沒事愈污,出了事有我和組長呢耀态!車...
    沉默雨佳閱讀 174評論 0 0
  • 假期里總少不了婆家各三姑六婆大集合吃一頓飯,講真暂雹,每次吃飯我都覺得食不知味度秒如年首装,幾乎每家都有娃,二胎放開...
    桔若閱讀 185評論 0 0