IDEA 及 Gradle 使用總結

轉自:https://www.cnblogs.com/mooreliu/p/4849898.html

IDEA 及 Gradle 使用總結

自動編譯組件

目前Android開發的主流開發工具是 Eclipse 和 IDEA

目前主流的自動化打包工具時 ant,maven,gradle。

maven工具中有自己的依賴倉庫維護,很多開源支持包在上面都有維護(國內的除外)

gradle是近年來發展起來自動化構建應用,解決 ant 構建上的繁瑣代碼,並且也支持讀取maven的配置形式,依賴maven的支持包結構

好了,平時你們使用 eclipse 發佈的時候,不要說你沒用過自動構建,eclipse 的 android項目是用ant的構建方式。如果你要加渠道發佈,你就需要自己寫 ant 的腳本。

maven自動構建,目前大多數用在 javaweb 項目,安卓項目用的不多。

eclipse 的構建應用大多使用 ant,maven,gradle也有相關支持。Android的項目默認使用 ant 進行構建

在 IDEA 中,可以使用 ant 方式構建 android應用,也能使用 gradle 方式構建,目前主流支持都是 gradle 方式。

IDEA 默認使用 gradle 工具做 android 的構建程序,你試試在新建應用的時候選擇 Application Module 而不是 Gradle:Android Module 看看,你會發現,工程項目和 eclipse 沒什麼區別。而且包含 ant 的腳本文件。(如下圖)

Gradle Module原理

IDEA 支持 ant,maven,gradle 工具來構建引用。目前 Android 應用在 as下編碼基本使用 gradle 進行構建,本章將基於這個思路講解那些內容屬於 IDEA,那些內容屬於 gradle 。

首先,我們建立一個 Gradle:Android Module 來看看 Gradle 項目結構。

得到的目錄結構如下:

其中根目錄是一個project,下面的app目錄是其中一個module。

目錄文件    作用
.gradle    gradle項目產生文件(自動編譯工具產生的文件)
.idea    IDEA項目文件(開發工具產生的文件)
app    其中一個module,複用父項目的設置,可與父項目擁有相同的配置文件
build    自動構建時生成文件的地方
gradle    自動完成gradle環境支持文件夾
.gitignore    git源碼管理文件
build.gradle    gradle 項目自動編譯的配置文件
gradle.properties    gradle 運行環境配置文件
gradlew    自動完成 gradle 環境的linux mac 腳本,配合gradle 文件夾使用
gradlew.bat    自動完成 gradle 環境的windows 腳本,配合gradle 文件夾使用
local.properties    Android SDK NDK 環境路徑配置
*.iml    IDEA 項目文件
setting.gradle    gradle 項目的子項目包含文件
.gradle .idea 是在分別在 gradle ,IDEA 運行時候會生成的文件,一般這樣的文件也不會納入源代碼管理之中。
app文件夾,是其中一個module,裏面的文件內容與父類差不多,若沒有定義,則在項目中使用父類的設置(意思就是,裏面也能包含build.gradle、gradle.properties、setting.gradle 等相關gradle文件,怎麼理解?其實每一層都是一個module,整個項目是一個大的 module 而已)
gradle 文件夾,用於保存gradle 下載路徑的配置文件位置,用於沒有gradle環境的環境初始化使用
build.gradle 項目的編譯環境配置,比如制定項目依賴的lib包。
gradle.properties 配置gradle運行環境的文件,比如配置gradle運行模式,運行時jvm虛擬機的大小
gradlew && gradlew.bat 代替gradle 命令實現自動完成gradle環境搭建。配合gradle文件夾的內容,會降到IDEA如何搭配gradlew使用。
local.properties 配置android NDK,SDK的地方,恩,非android項目可能沒有這個文件,這個路徑根據不同想電腦不同,一般也不會納入源代碼管理之中,一般可以寫一個local.properties.simple 文件,告知需要修改該文件名並寫上本地SDK NDK 路徑。simple文件納入源碼管理之中。
setting.gradle 子項目包含文件,聲明當前目錄下含有什麼module,當然你的app底下加上這樣的文件,也能繼續在app底下加module。和我第點說的,整個project就是一個大的module,每個module下面還能包含相應的module。如果你理解這個了,其實app目錄單獨作爲一個項目管理也是可以的,,把相應的配置文件配上而已,相當於主目錄應用 android 的gradle plugin (下一點會說到這個)
gitignore 該文件是源碼管理的配置文件,不在該文講解。

既然gradle 是多 module形式,那麼我們來看看 setting.gradle 配置的內容

從上面目錄的配置文件內容來看,整個project也算是一個module,如果改module底下還有module,就可以通過setting.gradle配置進來,使得該module底下的gradle,從app module底下可以看出,module最少要含有 build.gradle文件,這個module的項目編譯文件,該module依賴什麼插件對該目錄進行編譯都在此配置,比如android與android-library,其他內容可繼承父類的

Gradle 與 IDEA 的關聯性

上面介紹了gradle項目的目錄結構,以及module的模式,接下來,瞭解一下IDEA如何與gradle項目關聯上來的。

idea的項目,在建立或者導入的時候,就已經確定他是基於什麼自動構建工具的項目。新建的時候,使用 gradle androiw module 說明他是 gradle 自動構建的項目,那麼導入的時候也是一樣。我們看看下面的項目導入圖,在選擇項目地址之後,我們看到一下的內容。

如果你的項目裏面包含了gradle的相關文件,就可以選擇 import project form external model 導入IDEA了,如果項目只有源碼,沒有包含自動構建的相關信息,你只能選擇 Create project form existing sources 了,讓他生成自動構建工具需要的文件。

你可能會想,想gradle裏面的依賴包,我不知道有哪些,怎麼辦。好吧,你私下裏就罵罵作者吧,上傳了源碼不上傳自動構建相關的文件,導致項目依賴不完整,還得找資料自己完善,所以這裏也希望廣大開源代碼愛好者,在分享你的作品的時候,希望能夠分享完整的項目信息,別隻有源碼,讓人跑不起來項目(牢騷說多了)。

那麼下一步是什麼呢:

恩,是不是似曾相識?你沒看錯,在新建項目的時候也有這個選擇,這個是選擇自動編譯的工具的方式。

如果你到官方下載 gradle 綠色包,解壓到某個目錄,你可以使用 gradle distribution,並設定 Gradle home 目錄,這樣 IDEA 構建編譯項目的時候,就使用你設定的gradle版本進行。

說到這裏,我覺得該說說 use default gradle wrapper 記得新建項目的時候也是使用 use default gradle warpper,這時候,上面目錄說到的三個文件。

gradle/
gradlew
gradlew.bat
如果使用這種方法,IDEA會調用項目根目錄 gradlew 或者 gradlew.bat (根據linux,windows,osx自動選型)代替原生的 gradle 方法做自動構建。

這兩個文件做了什麼事情呢:

解析 gradle/wrapper/gradle-wrapper.properties 文件,獲取項目需要的 gradle 版本下載地址
判斷本地用戶目錄下的 ./gradle 目錄下是否存在該版本,不存在該版本,走第3點,存在走第4點
下載 gradle-wrapper.properties 指定版本,並解壓到用戶目錄的下 ./gradle 文件下
利用 ./gradle 目錄下對應的版本的 gradle 進行相應自動編譯操作
看了上面的原理,應該明白了,如果你自己下載 gradle 讓idea 導入項目的時候使用。那麼其他人就不知道你使用什麼版本的gradle版本進行自動編譯,如果使用 項目目錄自帶的 gradlew 的話,gradlew 就會自動完善 gradle 的安裝,若需要更新 gradle 的版本,只需要修改 gradle/wrapper/gradle-wrapper.properties 文件內的下載鏈接即可。而且gradlew的版本和 android 版本是需要適配的,在自己電腦維護需求不同版本的 gradlew 也是一個麻煩的事情。

而且這樣的好處也有一個,當你在新電腦上下載你的源碼進行編譯時,你完全可以不依賴IDE開發工具,直接在項目目錄下使用 ./gradlew build 即可對源碼進行編譯,因爲它會自動下載 gradle 進行調用,可以使得新電腦較快完成項目開發環境適配(對網絡依賴較強,希望帶上vpn,這就是爲什麼你們在新建項目時需要去下載gradle,還比較慢的原因,我們一起來 f-u-c-k-g-f-w)

當然,導入項目需要能夠選上 use default gradle wrapper 的前提是存在上面一個gradle文件夾與gradlew、gradew.bat

既然可以選擇使用 gradlew 來管理 gradle 或者手動指定 gradle 工具,那麼已經存在的項目如何更改?

這個問題,我曾在 idea 13 版本上有找到,但是在 idea 14 上面沒找到相應的變更設置。誰要是找到了,記得留言告知我一聲。

在導入項目或者新建項目的時候,idea 會根據 build.gradle 文件更新 *.iml 項目文件,有時候,你會發現,新增一個jar包,但是無法讀取jar包內容,因爲對於 gradle 來說,jar包屬於項目外依賴,包括maven拓展包,都是屬於項目外依賴,需要修改build.gradle 文件,當你加入新的 jar包,或者添加了 maven支持包,在idea上面都會提示需要進行同步

恩,上圖你看到的,是我模擬添加一個jar包之後,隨便加了一個空格,文件上提示需要進行 gradle 項目與 idea項目文件同步,點擊 sync now 之後,idea 會根據 gradle 文件重新更新 .idea 目錄以及 *.iml 文件,讓idea 可以識別引入的 資源。

這也就是爲什麼有人說加入一個jar包確沒有自動提示,而重新打開idea之後就能夠提示使用jar內的方法了,因爲重新打開idea,開發工具會重新同步 build.gradle 的內容

Gradle Android Plugin Version與 Gradle Version對應

gradle只是一個自動化編譯工具,它需要以來插件來識別這是什麼項目,用什麼方式去編譯的。我們來看看 build.gradle 與 app/build.gradle 的設置看看。

 

不知道你們會不會奇怪,在app裏面的 build.gradle 中,缺少了 buildscript 與 allproject 的設置,恩,沒錯,我刪掉了,因爲這個設置是可以繼承父項目的 build.gradle

其中父類的整個項目需要依賴插件 com.android.tools.build:gradle:0.14.2 最後是版本號。(目前AS的版本號已經是1.0.0了)

這個插件的版本號與gradle調用編譯時是有依賴關係的,插件的版本越高,需要更多gradle的新特性,新的gradle特新就需要新版本的gradle才能支持。

這時候,回到上一節的內容,如果要使用android項目自動編譯的新特性,如果選擇不同的gradle指向方式,那麼你就要做不同的處理

下載不同版本的gradle對不同的項目的不同版本做插件與gradle的對應維護,如果其他人使用你的項目,你還要告知他使用什麼版本以上的gradle才能使用這個插件。
把對應關係一次弄好之後,更新gradle/wrapper/gradle-wrapper.properties下載地址,利用gradlew自動使用相應版本的gradle,這樣gradlew版本的需求就跟着源碼管理一直保留到其他人的電腦商。
具體的插件依賴,可點擊這裏

目錄格式

先來看看eclipse的完整目錄與IDEA的完整目錄結構(當然,IDEA看的目錄時基於module的目錄設置的,而不是根據總項目的目錄設置的)

eclipse目錄

IDEA(AS)目錄

按照Android開發的目錄,區分爲以下的目錄格式:

目錄類型    Eclipse    IDEA(Android Studio)
代碼根目錄    /    src/main
adil文件    /src    [代碼根目錄]/aidl
java文件    /src    [代碼根目錄]/java
assets文件    /assets    [代碼根目錄]/assets
jni文件    /jni    [代碼根目錄]/jni
jnilibs文件    /libs    [代碼根目錄]/jniLibs
res文件    /res    [代碼根目錄]/res
AndroidMainfest.xml    AndroidMainfest.xml    [代碼根目錄]/AndroidMainfest.xml
上面所展示的內容就是目前Android用到的所有資源文件類型。爲什麼要把項目根目錄列出來?這個到後面渠道包的時候需要用到。可是也可能也會問到,爲什麼項目根目錄會有兩級。src 第一級我的理解是項目源碼相關都在這裏,第二級,認爲是主項目源碼在 main 目錄,根據系統完善性,應該針對主項目添加測試項目的源碼,所以新的代碼裏面在 main 目錄同級的地方會有 tests 目錄,用於測試項目的目錄源碼維護。如果有渠道,還可以爲渠道包新建項目目錄去坐項目自定義。

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