1. 程式人生 > >Android Gradle 看這一篇就夠了

Android Gradle 看這一篇就夠了

目前, 大多數講解 Gradle 的文章都是先從複雜的 Gradle 語法開始. 而實際上, 對於 Android 人員, 掌握這些語法細節並沒有卵用, 我們僅需要能看懂隨用隨查即可. 那本文也是遵照 ‘實用’ 這個原則介紹 Android Gradle. 相信, 讀過本文, 你至少應該不在畏懼 Build Script 了.

如果你對 build.gradle 已經很熟悉, 那麼直接參考 gooogle 官方的 Android Plugin DSL Reference 即可.

下面進入主題. 先來看下 As 幫我們生成的有關於 Gradle 的幾個檔案(夾).

%e6%97%a0%e6%a0%87%e9%a2%98

如上圖, 標準的 As 專案中, 包含三大部分:

  • Top-level Gradle:用於配置所有 Module 的屬性
  • Moudle-level Gradle: 配置獨立 Moudle 的屬性
  • Gradle Wrapper: 用於統一編譯環境, 一般供 CI 使用

下面來具體看看.

Top-level Build Script

build_script

gradle script 都是 configuration scripts. 這話的意思是說, 執行起來後, 每個指令碼檔案最終都會對應到一個程式中的物件, 這個物件叫做 delegate object. 比如, build.gradle 對應為程式中的 Project. 整個 Gradle 有三種類型的代理物件, 分別是:

Type of script Delegates to instance of
Build script
Init script
Settings script

通過上面的知識我們可以知道, 在任何 build.gradle 中都有一個內建的變數 —project(就是代表這個 build.gradle 的 delegate object).project

我們可以通過 gradle -q properties 檢視指令碼中所有的內建屬性.

下面, 我們一步一步來看看這個 Top-level Build Script:

buildscript

1 2 3 4 5 6 7 8 9 10 11 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }

buildscript { }

Configures the build script classpath for this project.

The given closure is executed against this project’sScriptHandler. The ScriptHandler is passed to the closure as the closure’s delegate.

簡單來說, buildscript 就是執行構建指令碼所需要用到的依賴的 classpath. 其內部會把 configuration closure 傳遞給 ScriptHandler (你不用關心這是什麼) 然後實現設定 dependencies(構建指令碼執行所依賴的檔案) 和 repositories(依賴檔案的查詢位置).

一般而言, 這個 script block 都寫在開頭, 宣告這個指令碼本身所需要的依賴.

allprojects

1 2 3 4 5 allprojects { repositories { jcenter() } }

allprojects { }

Configures this project and each of its sub-projects.

This method executes the given closure against this project and its sub-projects. The target Project is passed to the closure as the closure’s delegate.

這個 configuration closure 裡的內容會被設定為當前 project 以及其所有 sub-project 中依賴檔案的查詢路徑.

這裡的寫法意味著, 所有的 project 都會在 jcenter() 中尋找依賴. 除此之外, 還可以指定 flatDirmavenivy 等. 可以參考 RepositoryHandler.

task clean

1 2 3 task clean(type: Delete) { delete rootProject.buildDir }

這是定義了一個新的 task, 叫做 clean. 其型別是 . 實際上, Android Plugin 內建了 clean 方法, 該方法位於 module 中. Module 中內建的 clean 方法只會清理 Module 中的檔案並刪除 Module 中的 build 目錄, 但是工程根目錄下的 build 檔案是沒人清理的, 所以這裡定義的 clean 方法即刪除專案目錄下的 build 資料夾.

順便來看一下 settings.gradle:

1 include ':app'

這檔案內容一看就懂, 是管理 sub-project. 凡是要涉及到編譯的子專案, 都要寫在這裡, 這樣 gradle 就按照這個配置遞迴編譯子專案了.

Module-level Build Script

module-level

模組級 script 用於描述該模組的編譯過程. 一般而言, Android 能用到的一共有三種:

  • Application: 對應 com.android.application. 編譯的結果是一個 apk
  • Android Library: 對應 com.android.library. 編譯結果為 aar
  • JavaLibrary: 對應的 java. 編譯結果為 jar

相關推薦

Android Gradle

目前, 大多數講解 Gradle 的文章都是先從複雜的 Gradle 語法開始. 而實際上, 對於 Android 人員, 掌握這些語法細節並沒有卵用, 我們僅需要能看懂, 隨用隨查即可. 那本文也是遵照 ‘實用’ 這個原則介紹 Android Gradle. 相信,

Android開發之顯示(弄懂ppi、dpi、pt、px、dp、dip、sp之間的關係

版權申明】非商業目的註明出處可自由轉載 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/85165773 出自:shusheng007 文章目錄 概述 要解決的疑問 概念篇

Cookie介紹及在Android中的使用總結超詳細,

Cookie介紹 cookie的起源 早期Web開發面臨的最大問題之一是如何管理狀態。簡言之,伺服器端沒有辦法知道兩個請求是否來自於同一個瀏覽器。那時的辦法是在請求的頁面中插入一個token,並且在下一次請求中將這個token返回(至伺服器)。這就需要在form中插入一個包含toke

Android 必須知道2018年流行的框架庫及開發語言,

導語2017 已經悄悄的走了,2018 也已經匆匆的來了,我們在總結過去的同時,也要展望一下未來,來規劃一下今年要學哪些新技術。這幾年優秀Android的開源庫不斷推出,新技術層出不窮,需要我們不斷去了解和掌握,在提高自身開發水平的同時,我們需要付出更多學習精力和時間。俗話說

Android 必須知道2018年流行的框架庫及開發語言,

本文更新時間:2018年07月12日15:50:40導語    2017 已經悄悄的走了,2018 也已經匆匆的來了,我們在總結過去的同時,也要展望一下未來,來規劃一下今年要學哪些新技術。這幾年優秀Android的開源庫不斷推出,新技術層出不窮,需要我們不斷去了解和掌握,在提

Android EventBus原始碼分析,基於最新3.1.1版本,!!

Android EventBus原始碼分析,基於最新3.1.1版本,看這一篇就夠了!! 前言 上一篇文章對EventBus進行了一個介紹,並且對它的使用方式作了一個較全面的分析,建議在閱讀本文之前,先看看上篇文章的內容:EventBus使用(全面分析,細節提醒) 本篇文章主要

Android懸浮窗適配全機型,包含8.0,小米魅族華為懸浮窗許可權適配demo

相容8.0,小米,魅族,華為等難適配機型都可完美適配。 懸浮窗插入介面 在實現懸浮窗之前,我們需要知道通過什麼介面,能夠將一個控制元件放入到螢幕中去。 Android的介面繪製,都是通過WindowMananger的服務來實現的。那麼,既然要實現一個能夠在自身

【轉】【修真院“善良”系列之十八】WEB程序員從零開始到就業的全資料V1.0——只

absolute feed 自己 session rem 好的 ans 一個 css樣式 這是兩年以來,修真院收集整理的學習資料順序。以CSS15個任務,JS15個任務為基礎,分別依據要完成任務的不同的技能點,我們整理出來了這麽一篇在學習的時候需要看到的資料。這是Versi

Java中的多線程你只要

== 討論 cin 線程池。 locking nth lis dset tro 引 如果對什麽是線程、什麽是進程仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多線程只有一個目的,那就是更好的利用cpu的資源,因為所有的多線程代碼都可以用單線程來實現。

Azure IOT 設備固件更新技巧,

trigger 物聯網平臺 搭建 href ice 有效 面板 調用 創建 嫌長不看版 今天為大家準備的硬菜是:在 Azure IoT 中心創建 Node.js 控制臺應用,進行端到端模擬固件更新,為基於 Intel Edison 的設備安裝新版固件的流程。通過創建模擬設備

轉:Java中的多線程你只要

無法 線程不安全 str his ace oat 情況下 containe live 如果對什麽是線程、什麽是進程仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多線程只有一個目的,那就是更好的利用cpu的資源,因為所有的多線程代碼都可以用單線程來實現

想做好PPT折線圖,

12月 image 菊花 -c 強調 spa any border 線圖 配圖主題無關今天鄭少跟大家聊聊折線圖的使用方法,或者你有疑問,折線圖很簡單,插入修改數據不就好了嗎?如果你要是這樣想的,恭喜你,有可能你會做出下面這樣的效果。如果你要是稍微懂一點折線圖的使用方法,你就

JSON入門

jsb cart 開發包 fonts 數據 長度 gmv lock 在哪裏 什麽是JSON JSON:JavaScript Object Notation 【JavaScript 對象表示法】 JSON 是存儲和交換文本信息的語法。類似 XML。 JSON采用完全獨立於任何

分布式事務

直接 比較 hub fir demon transacti 遇到 維護 commit 前言 不知道你是否遇到過這樣的情況,去小賣鋪買東西,付了錢,但是店主因為處理了一些其他事,居然忘記你付了錢,又叫你重新付。又或者在網上購物明明已經扣款,但是卻告訴我沒有發生交易。這一系列情

python3 urllib爬蟲,你只需要

寫在最前面:以下資料均脫敏 from urllib import request import requests import urllib if __name__ == "__main__": # 介面的url session_requests = requests.se

Java中的多執行緒你只要(轉)

引 如果對什麼是執行緒、什麼是程序仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多執行緒只有一個目的,那就是更好的利用cpu的資源,因為所有的多執行緒程式碼都可以用單執行緒來實現。說這個話其實只有一半對,因為反應“多角色”的程式程式碼,最起碼每個角色要給他一個執行緒吧,否

易學筆記--Servlet和JSP--入門

第4章:作為Servlet:請求和響應/4.1 Servlet載入過程 第4章:作為Servlet:請求和響應/4.2 請求 第4章:作為Servlet:請求和響應/4.3 響應 第4章:作為Servlet:請求和響應/4.4 資源下載例項 第4章:作為Servlet:

Maven教程--入門

第1章:Maven概述/1.1 Maven的概念 第1章:Maven概述/1.2 Maven的功能 第1章:Maven概述/1.3 與其它構建相比/1.3.1 Make 第1章:Maven概述/1.3 與其它構建相比/1.3.2 Ant 第2章:Maven的安裝/2.1

Linux 問題故障定位,

1. 背景 有時候會遇到一些疑難雜症,並且監控外掛並不能一眼立馬發現問題的根源。這時候就需要登入伺服器進一步深入分析問題的根源。那麼分析問題需要有一定的技術經驗積累,並且有些問題涉及到的領域非常廣,才能定位到問題。所以,分析問題和踩坑是非常鍛鍊一個人的成長和提升自我能力。如果我們有一套好的分析工具,那將是事

C語言從入門到精通,

影響 內容 當前 位置 replace 雙精度 下標 寄存器變量 一個 No.1 計算機與程序設計語言的關系 計算機系統由硬件系統和軟件系統構成,硬件相當於人類的肉體,而軟件相當於人類的靈魂,如果脫離了靈魂,人類就是一具行屍走肉 No.2 C語言的特點 代碼簡潔,靈活性高