Android -Gradle依賴導入及相關知識

前言

近期導入了一個項目,因為種種原因始終是失敗昔汉,各種引入錯誤,不是這個就是那個,歸根到底還是對gradle相關知識不夠了解靶病,今天來整理一下会通。

升級3.x.x變化

Gradle近期變化

android studio版本升級到3.0.0已經(jīng)有一段時間了,現(xiàn)在使用的是studio 3.1.2.那么(當然默認你的build:gradle:3.1.2娄周,二者要保持一致)涕侈。升級到3.x.x之后版本,有啥變化呢煤辨?

  • 支持java8裳涛。
  • 支持kotlin,默認安裝相關插件。
  • gradle編譯速度有所加速众辨。

依賴變化

3.0.0之前 3.0.0之后 說明
compile implementation 將該依賴隱藏在內(nèi)部端三,而不對外部公開。比如:app依賴于moudle1鹃彻,而moudle1 implementation Glide庫,那么app如果直接引用moudle1郊闯,可以使用moudle1中采用implementation依賴的Glide庫嗎?答案是:不可以蛛株!(之前是可以的)团赁,app需要自己依賴Glide才可以使用.這么做的好處是雖然使用起來復雜了但是做到降低偶合興提高安全性。
api 完全等同于compile指令沒區(qū)別
provided compileOnly 只在編譯時有效谨履,不會參與打包 ,可以避免包沖突
apk runtimeOnly 只在生成apk的時候參與打包欢摄,編譯時不會參與
testCompile testImplementation testCompile 只在單元測試代碼的編譯以及最終打包測試apk時有效
debugCompile debugImplementation debugCompile 只在debug模式的編譯和最終的debug apk打包時有效
releaseCompile releaseImplementation Release compile 僅僅針對Release 模式的編譯和最終的Release apk打包

Project build.gradle

Project build.gradle

咱們一個一個解釋其含義:

  • buildscript:用來加載gradle腳本自身需要使用的資源,可以聲明的資源包括依賴項、第三方插件笋粟、maven倉庫地址等
  • repositories表示代碼倉庫的下載來源
  • jcente 是一個新的中央遠程倉庫怀挠,兼容maven中心倉庫,而且性能更優(yōu).
  • google 是google的代碼托管倉庫
  • dependencies一般是執(zhí)行Gradle需要的gradle工具矗钟。
  • classpath 執(zhí)行gradle需要的工具地址唆香,一般版本號同studio版本保持一致
  • allproject 是整個項目的配置曙痘,比如allproject 中的repositories和上面buildscript的區(qū)別就是:前者allproject是整個項目本身需要的依賴媳禁,后者是gradle腳本執(zhí)行所需依賴(Gradle插件)嘉蕾,分別是對應的maven倉庫和插件依賴等
  • task clear 運行gradle clean時,執(zhí)行此處定義的task. 該任務繼承自Delete东涡,刪除根目錄中的build目錄。

常見的遠程依賴方式

方式一

implementation 'com.android.support.constraint:constraint-layout:1.1.2'

方式二

implementation group: 'com.android.support.constraint', name: 'constraint-layout', version: '1.1.2'

方式三
   implementation('com.android.support.constraint:constraint-layout:1.1.2') {
        //不同版本同時被依賴時倘待,那么強制依賴這個版本的疮跑,默認false
        force = true
        //exclude可以設置不編譯指定的模塊,有三種寫法:
    exclude module: 'abc'
    exclude group: 'bcd'
    exclude group: 'abc', module: 'bcd'
        //禁止依賴的傳遞凸舵,gradle自動添加子依賴項,默認為true.
        transitive = true
    }

當然我們這里的exclude 的‘a(chǎn)bc’等內(nèi)容是不存在的祖娘,只是給大家演示,由此也引出了exclude的一個作用啊奄,避免依賴包沖突渐苏。那么除了采用exclude這種方式掀潮,我們還有沒有別的方法呢,答案當然是有了琼富,那就是統(tǒng)一為所有依賴指定依賴包的版本仪吧,如下:

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '28.0.0-rc01'
            }
        }
    }
}

在 project 的 build.gradle 中添加如下的代碼,該代碼的意思是:在項目構建時鞠眉,遍歷所有依賴薯鼠,然后 com.android.support 包下的依賴替換同一個版本。但此方法也有弊端:就是每次構建的時候械蹋,多了一個遍歷過程出皇,會加長構建時間。因此哗戈,推薦使用 exclude 關鍵字排除恶迈。

那我們?nèi)绾闻袛嗍悄菐讉€library的文件沖突了呢?

首先studio會先報出該錯誤,在log日志中會有某個moudle的信息谱醇。然后我們需要一個命令:

./gradlew -q <模塊名>:dependencies
如:gradlew -q app:dependencies 查看app這個module的依賴其他庫的信息暇仲,看看有沒有沖突
該命令能打印出該模塊所有的依賴樹信息,然后我們根據(jù)具體log信息副渴,采用exclud方式解決問題奈附。

本地依賴

Jar包依賴
image
arr文件的依賴
  • 首先先聲明aar包存放的路徑聲明
 repositories {
        flatDir {
            dirs 'libs' //此處聲明存放路徑為lib文件夾下
        }
    }
  • 其次依賴引入
    implementation(name: 'LibReplayDecode-release', ext: 'aar')

so文件的依賴

聲明下so文件的存放路徑即可

  sourceSets {
      main {
          //配置so加載目錄
          jniLibs.srcDirs = ['libs']

      }
  }

當然也可以在main目錄下新建jniLibs目錄,這是so文件默認的放置目錄煮剧,不過本人一般不習慣這樣斥滤,還有需要注意:并不是將so文件直接放入lib文件夾下,而是需要建立對應的ABI目錄下(Android 設備的CPU類型通常稱為”ABIs”),也就是說不同的armeabi文件是為了專門針對不同Android手機下CPU架構的兼容勉盅,存放so庫佑颇。如圖:

image

其他

用過butterknife的同志一定對annotationProcessor不陌生吧,它是一個編譯期注解的依賴。這種方式是只在編譯的時候執(zhí)行依賴的庫草娜,但是庫最終不打包到apk中挑胸。結(jié)合編譯期注解的作用,他是用來生成代碼的宰闰,本身在運行時是不需要的茬贵,那么它與我們上面說的與compileOnly的區(qū)別是什么呢?
annotationProcessor作用是編譯時生成代碼移袍,編譯完真的就不需要了解藻,compileOnly是有重復的庫,為的是剃除只保留一個庫葡盗,最終還是需要的螟左。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胶背,更是在濱河造成了極大的恐慌虫啥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奄妨,死亡現(xiàn)場離奇詭異涂籽,居然都是意外死亡,警方通過查閱死者的電腦和手機砸抛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門评雌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人直焙,你說我怎么就攤上這事景东。” “怎么了奔誓?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵斤吐,是天一觀的道長。 經(jīng)常有香客問我厨喂,道長和措,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任蜕煌,我火速辦了婚禮派阱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斜纪。我一直安慰自己贫母,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布盒刚。 她就那樣靜靜地躺著腺劣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪因块。 梳的紋絲不亂的頭發(fā)上橘原,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音贮聂,去河邊找鬼靠柑。 笑死寨辩,一個胖子當著我的面吹牛吓懈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播靡狞,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耻警,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甘穿,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腮恩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后温兼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秸滴,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年募判,在試婚紗的時候發(fā)現(xiàn)自己被綠了荡含。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡届垫,死狀恐怖释液,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情装处,我是刑警寧澤误债,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站妄迁,受9級特大地震影響寝蹈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜登淘,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一躺盛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧形帮,春花似錦槽惫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至合冀,卻和暖如春各薇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背君躺。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工峭判, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棕叫。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓林螃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俺泣。 傳聞我的和親對象是個殘疾皇子疗认,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,156評論 25 707
  • 說明 本文主要介紹和Gradle關系密切完残、相對不容易理解的配置,偏重概念介紹横漏。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,631評論 1 62
  • 參考 中文官網(wǎng)構建指南:https://developer.android.google.cn/studio/bu...
    FinalSky閱讀 5,353評論 0 16
  • 1.1批判性思維運用到極致的人谨设、哲學認識論奠基者笛卡爾,做了個偉大的思想實驗缎浇,得出兩個結(jié)論扎拣,一是普遍懷疑一是不可知...
    瞰川閱讀 1,064評論 0 2
  • 我不想去計較一些小事情,但有時候又忍不住要計較素跺。算了吧 我不想成為不快樂的人鹏秋,很多事都會隨風散去,唯愿你們會記得我...
    伊人_b9ad閱讀 318評論 0 0