從Eclipse到AndroidStudio(四)Gradle基本配置


轉載地址:http://www.jianshu.com/p/cd8fe9b16369#


我們還是以AndroidStudio 2.1.1爲例來講。

用AndroidStudio就逃不開跟Gradle打交道,有人說這個東西很簡單,就是一些配置,不用管,但我認爲不是,引入一個工程編譯都無法通過,而你又不知道錯在哪,這怎麼行呢?還是有必要了解一下的。其實我自己也不是很熟悉Gradle,這裏只能是把我瞭解的簡單說一下,如有不正確歡迎指正。

一、基本概念

那麼什麼是Gradle呢?我不想複製網上那些話了,太難懂。其實我理解的話,在AndroidStudio中,它就是個打包apk的工具,它可以把你寫的Java代碼、C++代碼和資源文件經過編譯、鏈接等操作,最終打包成一個apk,有人把這個過程叫做“構建(build)”,好吧,我們也這麼叫,Gradle就是用來構建項目的一個工具。

這裏先給大家推薦一個鏈接,講的相當不錯,我當初也是看這篇文章的:

Grade入門

我們下面也是基於這篇文章做一個簡單的概括。

二、Gradle與Ant、Maven之間的關係

其實在AndroidStudio出來之前,我們在eclipse中也有構建項目的概念,當時用的其實是一款叫做ant的工具,google給我們集成到SDK中了,是Apach基金組織推出的一個構建項目的工具,我們當初之所以能把一大堆Java代碼和圖片打包成一個apk主要靠它。

然後熟悉J2EE開發的同學可能用過一款叫做maven的工具,什麼叫maven呢?maven也是Apach基金組織推出的一款工具,簡單的說就是幫我們下載jar包、並且通過配置xml文件使jar包能被我們的Java代碼引用的一個工具,我們用eclipse做Android開發時其實很少有用到maven,都是直接從網上下載個jar包拷到工程目錄下用。那麼在使用Gradle之後,我們在Android項目中也可以用maven了,想用什麼jar包,直接填寫在gradle配置文件中,jar包就會自動幫我們下載到工程中,還能通過配置讓jar包時刻保持最新版本,如果你網絡條件好的話,用maven還是比較方便的。

那麼Gradle其實就是融合了ant和maven的功能,即能構建項目,又能從網上的maven網站中自動幫我們下載jar包。

三、AndroidStudio中與Gradle相關的文件

打開AndroidStudio,新建一個工程,就可以看到如下目錄結構:


AndroidStudio中跟Gradle配置相關的文件

如果你看到的目錄結構跟圖中不一樣,請點擊目錄頂端的區域,切換工程視圖顯示方式,默認的視圖形式的名稱叫做Android,推薦使用Project。

(1)從圖中可以看出,在app模塊下,有一個build.gradle文件,這個gradle文件是整個項目中最重要的一個gradle文件,我們今後主要跟這個文件打交道;

(2)grade-wrapper.properties文件,這個文件中主要是告訴開發工具,如果我們的電腦中找不到Gradle工具,那麼要到哪個網址去下載Gradle工具,下載哪個版本的;

(3)整個工程目錄下的build.gradle文件,這個文件跟模塊下的build.gradle文件名字相同,但是是負責整個工程所有模塊的構建的(一個工程有可能包含多個模塊,比如你的項目中還可能有一個Library);

(4)settings.gradle文件,這個文件最簡單,就是告訴gradle工具我這個工程中包含哪幾個模塊;

OK,現在一個一個來解釋這幾個文件中的內容,不按上邊的顯示順序了,先挑簡單的來說吧:

1、先來說一下settings.gradle,因爲這個文件是最簡單的,打開這個文件,你會看到如下內容:



settings.gradle

看到了吧,只有一行,include ':app',意思是我們這個工程中目前只有一個模塊,模塊的名字叫做app,書寫格式是include關鍵字後邊跟一對單引號,單引號中是模塊名稱,名稱前邊還加了一個冒號,不要問爲什麼,這就是規定,如果你的工程中有多個模塊,那麼就是多對單引號,比如

include ':app',':library'

中間用英文逗號隔開即可;

2、grade-wrapper.properties是第二簡單的文件了,打開這個文件可以看到下圖所示內容:


grade-wrapper.properties

上面已經說了,這個文件就是告訴系統如果我們的電腦上沒有Gradle工具,要到哪個網址下載,所以整個文件最重要的一行就是最後一行了,其中https\中的反斜槓是一個轉義符,不用糾結它,上面的那些distributionPath之類的配置是告訴系統如果需要下載Gradle工具的,下載完要保存在哪裏,這個不用太糾結;

3、整個工程下的build.gradle文件,打開這個文件可以看到如下所示內容:


整個工程下的build.gradle

這個文件也很簡單,主要分成兩個結點,buildscript結點是標明Gradle工具本身要怎麼配置,Gradle工具本身要從哪個maven倉庫下載,我們這裏默認使用的是一個叫做jcenter的maven倉庫,所謂maven倉庫其實就是個網站,jcenter的網址是http://jcenter.bintray.com,用瀏覽器打開可以看到裏邊按目錄存放了很多jar包和其它的庫文件,除了jcenter之外,常用的maven倉庫還有mavenCentral等。

下邊的allprojects標籤的意思是我們工程裏邊所有模塊的通用配置,這裏只規定所有模塊中要用到的jar包也都從jcenter這個maven倉庫中獲取 ,在allprojects標籤下配置的好處是你不需要再在每個模塊下的build.gradle中單獨配置了,如果你想在每個模塊下單獨指定用哪個maven倉庫,那麼你在這個全局的build.gradle中也可以不寫;

4、接下來就到最複雜的,也是最常用的了,就是我們模塊下的build.gradle文件,打開這個文件,可以看到如下圖所示內容:


模塊下的build.gradle

我挑幾個重要的點說吧,不重要的就不說了,從上往下看:

(1)apply plugin標籤

首先第一行,apply plugin,這個是Gradle工具規定的寫法,意思是我們要使用什麼插件來構建項目,後邊跟的是插件名稱,com.android.application是Google通過Gradle的api,使用Groovy語言編寫的一個插件,用於構建Android主工程,相當於eclipse中的ADT插件。

如果這個模塊是一個Library的話,應該引入的插件叫做'com.android.library',如果你熟悉Gradle的api的話也可以寫自己的插件,github上有許多輔助Android開發的插件,下載下來就是個jar包,可以引入AndroidStudio中,有興趣的可以去了解一下;

(2)版本以及包名等常規配置

再下邊的android標籤下就是我們主要關注的地方了,compileSdkVersion是我們要用Android哪個版本的api,等同於eclipse項目中project.properties文件配置的target=android-xx,xx是版本號,比如target=android-23;

buildToolsVersion,這個是構建工具的版本號,與我們在代碼中調用的api沒什麼關係,是打包用的,建議用比較新的版本,因爲我曾經用比較舊的19.0.1版本時發現很多坑;

applicationId,這個就是我們應用的唯一標識:包名。在eclipse中是配置在AndroidManifest.xml文件中的,在AndroidStudio中改爲配置在build.gradle中了,這裏注意如果你這個模塊是Library,那麼要把這行刪掉,如果你在Library模塊中也配置了applicationId的話到時候會在手機屏幕上看到兩個應用圖標,很怪;

應用版本號應該不用說了,用過eclipse的同學應該很熟悉了,無非就是把以前在AndroidManifest.xml文件中配置的東西搬到這裏來而已;

(3)buildTypes標籤,這個是重點

再下邊的buildTypes,這個標籤大有文章,表明我們可以打哪些類型的apk包,新建工程中只有一個release類型,意思是正式發佈的apk要怎麼打包。

buildTypes下除了release標籤,默認的還有一個叫做debug的標籤。在這些標籤下,我們可以指定要用到的混淆文件在哪個目錄下,簽名文件(keystore)在哪個目錄下,簽名文件的密碼之類的,如果你沒配置的話就使用默認值,如果想改的要怎麼改呢?如下圖:


自定義打包類型

如上圖所示,我們需要在android標籤下調用一個signingConfigs標籤,這個標籤其實也是com.android.application插件中的,在下邊隨意增加配置,myConfig這個名字是隨意起的,默認的有兩個:release和debug,如果你想修改默認的打包配置就到這兩個標籤下改,如果想自己寫一個就像圖中這樣寫一個myConfig就可以了,裏邊寫上用哪個keystore文件,keystore的密碼,然後不要忘了在buildTypes標籤引用就可以了;

那麼這些標籤定義好之後要怎麼使用呢?最常用的使用方式就是通過命令行要調用,在AndroidStudio中自帶命令行工具,打開之後就可以自動定位到當前工程目錄下,然後在命令行輸入:

./gradlew build構建類型名稱

即可執行相應的構建任務,如下圖所示:


打開命令行工具並輸入命令

其中構建類型名稱就是我們在buildTypes下配置的構建類型標籤的名稱,並且要以大寫字母開頭(這也是規定),比如上圖中輸入

./gradlew buildDebug

就會執行我們在buildTypes下配置的debug標籤下的任務,然後在app/build/outputs/apk目錄下會生成一個apk文件,如下圖所示:


用命令行生成的apk文件

其實“任務”也是Gradle中的基本概念之一,Gradle把做一件相對完整的事情叫做一個任務,比如你在命令行輸入

./gradlew clean

就會執行"clean"任務,我們也可以自定義buildTypes,比如下圖所示的這樣:


自定義buildType

名字隨便起,然後我們在命令行輸入

./gradlew buildMyBuildType

就可以執行我們自定義的任務了;

(4)dependencies標籤

這個標籤下就是我們依賴的jar包,第三方庫,或者library工程,如下圖所示:


dependencies

這幾行是新建工程默認生成的,其中第一行

compile fileTree(dir:'libs',include: ['*.jar'])

這一行的配置很重要,表明我們工程中要用到的jar包都可以放在app下的libs目錄中,有了這一行配置,我們就可以放心的把jar包放在libs目錄下,而不需要再做額外的配置了,跟eclipse下基本一樣了,是不是很方便;

然後再往下

compile 'com.android.support:appcompat-v7:23.4.0'

這一行就是表明到maven庫中找v7支持包,仔細觀察的話,這句話中單引號中內容被冒號分成了三個部分,com.android.support是這個支持包在maven庫中的存放路徑,appcompat-v7是這個包的名稱,23.4.0是這個包的版本,有了這個配置,Gradle工具就會到我們在全局gradle文件中指定的maven庫中下載相應的支持包了,其中版本號這個東西很有意思,你可以不寫23.4.0,你可以寫成23.4.+,意思就是如果支持包出了新版本,比如出了23.4.1,那麼就用23.4這個分支下的最新版本,如果寫成23.+,就是始終使用23這個版本下最新的分支版本,如果幹脆寫成一個+號,比如像下面這樣

compile 'com.android.support:appcompat-v7:+'

就是告訴編譯器,我要始終使用最新版的v7支持包,是不是比我們手動拷貝jar包或aar包要靈活多了,不過還是不建議這樣寫,因爲gradle會始終訪問網絡去查詢有沒有新的包,國內的網速你懂的,而且你也無法確定最新的包是不是一定適合你,有沒有兼容舊版的代碼。

然後dependencies標籤下還可以配置我們引用了哪些Library模塊(對應eclipse下的Library工程),如果我們的app主模塊有引用Library工程,就一定要在dependencies標籤下指定Library,像下面這樣:

compile project(':my-library-module')

project後面括號中的內容要與前面所說的settings.gradle文件中寫的模塊名稱一致,也是以冒號開頭,並且用單引號括起來。

OK,關於Gradle配置的內容暫時先說這麼多吧,因爲我也不是很懂,更詳細的內容一定要看一下文章開頭推薦的那個鏈接Gradle入門,這篇文章講的很淺顯,也很全面。

基本上看完這幾節內容,大家應該對AndroidStudio不那麼陌生了,之後我打算寫一次我把公司的eclipse項目遷移到AndroidStudio的過程中遇到的一些坑以及解決方案,歡迎繼續關注。

參考文章:http://www.androidchina.net/2155.html



文/applixy(簡書作者)
原文鏈接:http://www.jianshu.com/p/cd8fe9b16369#
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章