Android Studio Set of source 代碼源集

一、源集

1悬垃、定義:Android Studio 按邏輯關(guān)系將每個模塊的源代碼和資源進(jìn)行分組游昼,這個分組叫做源集。
2尝蠕、main Module 源集包括其所有構(gòu)建變體共用的代碼和資源烘豌。這句話很關(guān)鍵,意思是看彼,所有的其他構(gòu)建變體廊佩,src/main是其共同擁有的。在說明BuildType時靖榕,我們會通過案例代碼進(jìn)行介紹标锄。
3、其他源集目錄為可選項(xiàng)茁计,在您配置新的構(gòu)建變體時料皇,Android Studio 不會自動為您創(chuàng)建這些目錄,用戶可以通過File > New 菜單選項(xiàng)新建文件或目錄星压,進(jìn)行特定源集進(jìn)行創(chuàng)建践剂。

源集按照構(gòu)建類別(buildType)、產(chǎn)品傾向(productFlavor)等娜膘,分為以下幾個類型:

源集 備注
src/main/ 此源集包括所有構(gòu)建變體共用的代碼和資源逊脯。
src/<buildType>/ 創(chuàng)建此源集可加入特定構(gòu)建類型專用的代碼和資源。
src/<productFlavor>/ 創(chuàng)建此源集可加入特定產(chǎn)品風(fēng)味專用的代碼和資源竣贪。
src/<productFlavorBuildType>/ 創(chuàng)建此源集可加入特定構(gòu)建變體專用的代碼和資源军洼。

例如,要生成應(yīng)用的“完整調(diào)試”版本贾富,構(gòu)建系統(tǒng)需要合并來自以下源集的代碼歉眷、設(shè)置和資源:

src/fullDebug/(構(gòu)建變體源集)
src/debug/(構(gòu)建類型源集)
src/full/(產(chǎn)品風(fēng)味源集)
src/main/(主源集)

4、源集的Overlay機(jī)制颤枪。如果不同源集包含同一文件的不同版本汗捡,Gradle 將按以下優(yōu)先順序決定使用哪一個文件(左側(cè)源集替換右側(cè)源集的文件和設(shè)置):

構(gòu)建變體 > 構(gòu)建類型[BuildType] > 產(chǎn)品風(fēng)味[ProductFlavor] > 主源集[main] > 庫依賴項(xiàng)

在合并多個清單時,Gradle 會使用專用于試圖構(gòu)建的資源進(jìn)行編譯畏纲,這些文件包括:構(gòu)建變體的文件扇住,其他應(yīng)用版本共用的 Activity、應(yīng)用邏輯和資源盗胀,從而達(dá)到不同的構(gòu)建艘蹋,編譯不同的資源的目的。

二票灰、源集的創(chuàng)建

Gradle 會按照與 main/ 源集類似的特定組織形式來管理源集文件和目錄女阀。例如宅荤,Gradle 要求您的“調(diào)試”構(gòu)建類型所特定的 Java 類文件位于 src/debug/java/ 目錄中。

以debug為例浸策,源集構(gòu)建會有如下幾種方式:

方式一:

1冯键、打開 Project 窗格并從窗格頂端的下拉菜單中選擇 Project 視圖。
2庸汗、導(dǎo)航至 MyProject/app/src/惫确。
3、右鍵點(diǎn)擊 src 目錄并選擇 New > Folder > Java Folder蚯舱。
4改化、從 Target Source Set 旁邊的下拉菜單中,選擇 debug枉昏。
5陈肛、點(diǎn)擊 Finish。

方式二:

1凶掰、在相同的 Project 窗格中燥爷,右鍵點(diǎn)擊 src 目錄并選擇 New > XML > Values XML File。
2懦窘、為 XML 文件輸入名稱或保留默認(rèn)名稱前翎。
3、從 Target Source Set 旁邊的下拉菜單中畅涂,選擇 debug港华。
4、點(diǎn)擊 Finish午衰。
Target Source Set

以上兩種方式立宜,都可以創(chuàng)建源集,源集成功創(chuàng)建后臊岸,工程展示如下:

三橙数、源集的重定向

可以通過sourceSets {}來設(shè)定Gradle module對應(yīng)的源集路徑。

Android SourceSet表示Java,aidl和RenderScript源以及Android和非Android(Java風(fēng)格)資源的邏輯組帅戒。

3.1灯帮、屬性

屬性 描述
aidl Android AIDL源目錄為此源設(shè)置。
assets 該資源集的Android Assets目錄逻住。
compileConfigurationName 該源集合的編譯配置的名稱钟哥。
java Java源代碼由Java編譯器編譯到類輸出目錄中。
jni 這個源碼集的Android JNI源目錄瞎访。
jniLibs 這個源碼集的Android JNI libs目錄腻贰。
manifest 該源代碼集的Android Manifest文件。
name 這個源集的名稱扒秸。
packageConfigurationName 此源集合的運(yùn)行時配置的名稱播演。
providedConfigurationName 此源集合的僅編譯配置的名稱冀瓦。
renderscript 該源碼集的Android RenderScript源目錄。
res 該資源集的Android資源目錄写烤。
resources 要復(fù)制到j(luò)avaResources輸出目錄的Java資源咕幻。

3.2、方法

方法 描述
setRoot(path) 將源集的根設(shè)置為給定的路徑顶霞。源集合的所有條目都位于此根目錄下。

更多屬性以及方法詳情锣吼,請參與官方文檔

案例配置: 配置app/other/目錄中的源映射到 main源集的某些組件选浑,并更改 androidTest 源集的根目錄。

 android {
   ...
   sourceSets {
     // main源集(source set)的閉包配置玄叠。
     main {
       // 變更Java 的源文件夾古徒,默認(rèn)的文件夾 = 'src/main/java'.
       java.srcDirs = ['other/java']

       //如果像以下方式一樣,列出來多個文件夾读恃,那么Gradle使用所有的這些文件夾來加載資源隧膘,
       //并賦予這些文件夾相同的優(yōu)先級。如果不同的文件夾中定義了相同的資源寺惫,那么會產(chǎn)生資源合并錯誤疹吃。
       //默認(rèn)的資源文件夾是 'src/main/res'.
       res.srcDirs = ['other/res1', 'other/res2']

       //避免多個文件夾出現(xiàn)“父子”依賴關(guān)系。例如:如下情況要避免:
       //res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings']
       //應(yīng)該只指定:'other/res1'或者指定'other/res1/layouts' and 'other/res1/strings' 

       //每個源集只能有一個AndroidManifest.xml清單文件西雀,
       //默認(rèn)情況下萨驶,main源集的清單文件在src/main/ 目錄中。
       manifest.srcFile 'other/AndroidManifest.xml'
       ...
     }

     // 創(chuàng)建額外閉包塊區(qū)配置其他源集
     androidTest {

       // 如果所有的源集文件都在一個單獨(dú)的目錄中艇肴,可以使用setRoot來進(jìn)行配置腔呜。
       // 這樣子,Gradle就只會加載該區(qū)域再悼。例如:如下配置核畴,Gradle只會從src/tests/java/
       // 來獲取源集文件。
       setRoot 'src/tests'
       ...
     }
   }
 }
 ...

四冲九、源集的使用

在使用源集進(jìn)行編譯的時候谤草,要特別注意資源合并的優(yōu)先級的問題。上面也提到了娘侍,優(yōu)先級如下:

構(gòu)建變體 > 構(gòu)建類型[BuildType] > 產(chǎn)品風(fēng)味[ProductFlavor] > 主源集[main] > 庫依賴項(xiàng)

詳細(xì)說明如下:

  • Java文件咖刃。如果找到兩個或兩個以上定義相同Java 類名的源集目錄,那么Gradle 就會引發(fā)一個構(gòu)建錯誤憾筏。
    例如嚎杨,在構(gòu)建調(diào)試 APK 時,同時定義 src/debug/Utility.java 和 src/main/Utility.java氧腰,會發(fā)生編譯錯誤枫浙。 這是因?yàn)镚radle 在構(gòu)建中檢查這兩個目錄并引發(fā)了“duplicate class”錯誤刨肃。
  • 清單合并為單個清單。在合并清單時箩帚,將按照上述列表中的順序指定優(yōu)先級真友。也就是說,某個構(gòu)建類型的清單設(shè)置會替換某個產(chǎn)品風(fēng)味的清單設(shè)置紧帕,依此類推盔然。
  • value資源。values/ 目錄中的文件也會合并在一起是嗜。如果兩個文件同名愈案,例如存在兩個 strings.xml 文件,將按照上述列表中的相同順序指定優(yōu)先級鹅搪。也就是說站绪,某個源集文件中定義的值將會替換產(chǎn)品風(fēng)味中同一文件中定義的值,依此類推丽柿。
  • res/ 和 asset/ 目錄中的資源將打包到一起恢准。如果兩個或兩個以上的源- 集中定義有同名資源,將按照上述列表中的相同順序指定優(yōu)先級甫题。
  • 最后馁筐,在構(gòu)建 APK 時,Gradle 會為隨庫模塊依賴項(xiàng)包含的資源和清單分配最低的優(yōu)先級坠非。

寫作不易眯漩,耗費(fèi)心力,如果上面的內(nèi)容對你有幫助麻顶,請隨意打賞赦抖,讓我們堅持下去~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辅肾,隨后出現(xiàn)的幾起案子队萤,更是在濱河造成了極大的恐慌,老刑警劉巖矫钓,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件要尔,死亡現(xiàn)場離奇詭異,居然都是意外死亡新娜,警方通過查閱死者的電腦和手機(jī)赵辕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來概龄,“玉大人还惠,你說我怎么就攤上這事∷蕉牛” “怎么了蚕键?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵救欧,是天一觀的道長锣光。 經(jīng)常有香客問我誊爹,道長箍铭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮刀崖,結(jié)果婚禮上馆截,老公的妹妹穿的比我還像新娘。我一直安慰自己窖张,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睦霎,像睡著了一般副女。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猜欺,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天篮昧,我揣著相機(jī)與錄音窄潭,去河邊找鬼躏惋。 笑死簿姨,一個胖子當(dāng)著我的面吹牛准潭,可吹牛的內(nèi)容都是我干的惋鹅。 我是一名探鬼主播闰集,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝠检!你這毒婦竟也來了沐鼠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饲梭,沒想到半個月后乘盖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憔涉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年订框,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兜叨。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡穿扳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出国旷,到底是詐尸還是另有隱情矛物,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布跪但,位于F島的核電站履羞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屡久。R本人自食惡果不足惜忆首,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涂身。 院中可真熱鬧,春花似錦搓蚪、人聲如沸蛤售。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悴能。三九已至,卻和暖如春雳灾,著一層夾襖步出監(jiān)牢的瞬間漠酿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工谎亩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炒嘲,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓匈庭,卻偏偏與公主長得像夫凸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阱持,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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