《Android群英傳:神兵利器》— 第四章
《Android群英傳:神兵利器》個人讀書筆記,僅做學習記錄之用
第四章:與 Gradle 的愛恨情仇
Gradle 使用的是 DSL 語言,即領域特定語言
4.1 如何學習 Gradle
4.2 Gradle 初探
4.2.1 專案全域性 build.gradle
4.2.2 Module build.gradle
apply plugin 領域
- Gradle 所引入的外掛
android 領域
- 描述了該 Android module 構建過程中所用到的所有引數
dependencies 領域
- 描述了該 Android module 構建過程中所依賴的所有庫
4.2.3 local.properties
- 這裡配置了 Android Gradle 外掛所需要使用的 Android SDK 路徑
4.2.4 Gradle Task
- assemble task
用於組合專案的所有輸出,包含 assembleDubug 和 assembleRelease 兩個Task。通過執行 gradle assemable 指令,Gradle 會編譯出兩個Apk——debug 和 release - Check
用於執行檢查任務 - Build
類似一個組合指令,它執行了 Check 和 assemable 的所有工作 - Clean
用於清理所有的中間編譯結果
想要使用某個 task ,直接使用 gradle task_name 即可,例如:gradle clean
4.3 Gradle 進階
4.3.1 更改專案結構
這邊主要介紹將專案從 Eclipse 遷移到 Android Studio 的目錄結構調整。當前Android Studio 的版本已經更新到 3.3 可以說是非常完善了,而 AS 也已成為主流。
4.3.2 構建全域性配置
4.3.2.1 全域性引數
在專案根目錄的 build.gradle 中,通過 ext 領域可以指定全域性的配置資訊。
ext{
compilesdkVersion 23
buildToolsVersion '23.0.1'
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0.0.1"
}
這樣就不用在每一個 module 中單獨配置了,利於管理
4.3.2.2 引用配置
設定好全域性引數後,可以在每個 module 中使用這些配置
android {
compileSdkVersion rootProject.ext.compileSdkVersion
}
當然也可以把 ext 全域性配置寫在 allprojects 領域中,這樣每個 module 就可以直接引用申明的變量了。但這樣的話 Gradle 的版本更新通知檢查機制就會失效。不過總的來說,利大於弊。
4.3.3 構建 DefaultConfig
4.3.4 構建 BuildTypes
4.3.5 構建 SigningConfigs
4.3.6 生成簽名
Build/Generate Signed APK
6.1 配置簽名
signingConfigs {
testSigning {
keyAlias 'testSigning.keystore'
keyPassword '[email protected]'
storePassword '[email protected]'
storeFile file('../../build/security/testSigning.keystore')
}
}
4.3.6.2 使用簽名
testSigning {
applicationId "com.android.testSigning"
signingConfig signingConfigs.testSigning
}
4.3.7 Android 領域中的可選配置
4.3.7.1 compileOptions
配置編譯的選項(設定 Java 的編譯選項),通常可以在這裡指定 Java 的編譯版本
4.3.7.2 lintOptions
用於控制 Lint 程式碼檢查。通過這個選項,可以在 Lint Check 發生 error 的時候繼續編譯
4.3.8 構建 Proguard
Proguard 配置是 Android 的 apk 混淆檔案配置,它同樣也可以 精簡程式碼、資源,優化程式碼結構
buildTypes {
release {
minifyEnabled true // 是否混淆
proguardFiles 'proguard.cfg'
}
}
4.3.8 Gradle 動態引數配置
Gradle 給開發者提供了 gradle.properties 檔案來配置動態的設定引數
4.3.9 System.properties 方式
4.3.9.1 key\value 方式
4.3.9.2 屬性方式
4.3.9.3 系統引數
4.3.10 多渠道打包
所謂多渠道打包實際上就是在程式碼層面上標記不同的渠道名,從而便於統計不同的應用市場中該 App 的下載量
4.3.10.1 建立渠道佔位符
在 AndroidManifest 檔案的 Application 節點下建立
<meta-data
android:name="PRODUCT"
android:value="${CHANNEL_VALUE}"/>
${CHANNEL_VALUE} 就是要進行替換的渠道佔位符
4.3.10.2 配置 Gradle 指令碼
productFlavors {
test1{
applicationId "com.android.test1"
signingConfig signingConfigs.test1
manifestPlaceholders = [CHANNEL_VALUE: "test1"]
}
test2{
applicationId "com.android.test2"
signingConfig signingConfigs.test2
manifestPlaceholders = [CHANNEL_VALUE: "test2"]
}
test3{
applicationId "com.android.test3"
signingConfig signingConfigs.test3
manifestPlaceholders = [CHANNEL_VALUE: "test3"]
}
}
以上就是打包了三個不同的 apk
4.3.11 指令碼優化
productFlavors {
test1{
applicationId "com.android.test1"
signingConfig signingConfigs.test1
// manifestPlaceholders = [CHANNEL_VALUE: "test1"]
}
test2{
applicationId "com.android.test2"
signingConfig signingConfigs.test2
// manifestPlaceholders = [CHANNEL_VALUE: "test2"]
}
test3{
applicationId "com.android.test3"
signingConfig signingConfigs.test3
// manifestPlaceholders = [CHANNEL_VALUE: "test3"]
}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
增加的 productFlavors.all 領域對所有的 productFlavors 進行了遍歷,並使其 name 作為渠道名
4.3.12 生成重新命名包
// 編譯時輸出不同的apk名稱,
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//這裡修改apk檔名
def fileName = "${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
4.3.13 為不同版本新增不同的程式碼
4.4 Gradle 多專案依賴
Android Studio 提供了一種新的依賴方式——arr。通過 arr 方式,主專案可以像使用 jar 包一樣使用這個庫專案,並且這個 arr 專案中可以帶有資源,相當於封裝了一個可以使用完整原始碼的 jar 包。
4.4.1 jar 包依賴
jar 包依賴的重複管理,儘量將重複的 jar 包移動到主專案中,以避免重複依賴導致的編譯問題
4.4.2 SO 庫依賴
在 module/src/mian 中建立一個 jniLibs 目錄即可
4.4.3 本地庫專案依賴
4.4.3.1 建立 module
4.4.3.2 解析 Gradle 依賴庫
- build.gradle: 控制每個 module 的編譯過程
- gradle.properties: 設定 Gradle 指令碼中的引數
- local.properties: Gradle 的 SDK 相關環境變數配置
- settings.gradle: 配置 Gradle 的多專案管理
4.4.4 遠端倉庫依賴
Gradle 支援以 arr 的方式依賴遠端伺服器上的庫專案
4.4.4.1 遠端倉庫的配置
4.4.4.2 引用 Maven 中央庫
4.4.4.3 引用本地伺服器中央庫
4.4.5 本地 arr 依賴
4.4.6 使用 Gradle 上傳 arr 到 Maven 庫
4.5 Gradle 依賴管理
4.5.1 Gradle 依賴庫快取
4.5.2 利用 Gradle 的通知機制
4.5.3 利用 Gradle 的依賴檢查
4.5.4 Gradle 依賴傳遞
4.5.5 Gradle 依賴統一管理
4.6 Gradle 使用技巧
4.6.1 生成 Gradle 編譯指令碼
4.6.2 Gradle peer not authenticated
4.6.3 Gradle 效能檢測
4.6.4 Gradle 加速
在 gradle.properties 檔案中新增如下程式碼(表示開啟 Gradle 的多執行緒和多核心支援):
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
然後將 build.gradle 中 javaMaxHeapSize 值增加到 4g(表示開啟 Gradle 的增量編譯,增加編譯的記憶體資源到4g)
dexOptions {
javaMaxHeapSize "4g"
}
4.6.5 增加編譯記憶體
4.6.6 Gradle 呼叫終端指令
4.6.7 使用 Gradle 精簡資源
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles 'proguard.cfg'
}
}
其中 shrinkResources 依賴於 minifyEnabled 只有其開啟時,才會生效
4.6.8 清除 Gradle 快取
4.6.9 使用 Gradle 本地快取
Setting-Build-Build Tools-Gradle 標籤中選擇 Offline work
4.6.10 Gradle 版本問題導致的編譯錯誤
Setting-Build-Build Tools-Gradle 中設定 預設的 wrapper 或者選擇 本地的 gradle
4.6.11 Gradle 資源衝突
4.7 Gradle 自定義外掛
4.7.1 構建預設外掛
4.7.2 構建自定義外掛
4.8 Gradle 思考
4.8.1 Grovvy 初探
- Grovvy 是一種基於 JVM 的動態語言(可以在 Java 虛擬機器上執行的指令碼語言)
- Task 是 Grovvy 的核心,它是完成 Grovvy 任務的最小執行單元
4.8.2 Gradle 專案架構
4.8.3 Gradle 生命週期
- Initiliazatijon——初始化配置,即執行 settings.gradle 指令碼
- Configration——解析每個 Project 中的 build.gradle 指令碼
- Build——最後的編譯階段
4.9 使用 Android Studio 的圖形化介面
此章節涉及的內容比較多,好多有用的東西,有時間還是可以自己去看看這本書的
相關推薦
《Android群英傳:神兵利器》— 第五章
《Android群英傳:神兵利器》個人讀書筆記,僅做學習記錄之用 第五章:深藏功與名的開發者工具 5.1 AAPT 5.1.1 AAPT 初探 AAPT——Android Asset Packaging Tool。在 Android SDK 的 build-too
《Android群英傳:神兵利器》— 第四章
《Android群英傳:神兵利器》個人讀書筆記,僅做學習記錄之用 第四章:與 Gradle 的愛恨情仇 Gradle 使用的是 DSL 語言,即領域特定語言 4.1 如何學習 Gradle 4.2 Gradle 初探 4.2.1 專案全域性 bu
《Android群英傳:神兵利器》— 第三章
《Android群英傳:神兵利器》個人讀書筆記,僅做學習記錄之用 第三章:Android Studio 奇技淫巧 3.1 Android Studio 使用初探 3.2 Android Stu
[學習筆記] Android群英傳:Android Scroll分析
一.滑動效果的產生 1.Android座標系 在Android,系統將螢幕最左上角的頂點作為Android座標系的原點,從這個點向右是X軸正方向,從這個點向下是Y軸正方向,如圖 系統提供了getLocationOnScreen(intlocatio
翻譯:libevent參考手冊第四章:與事件一起工作 (六) (轉)
libevent的基本操作單元是事件。每個事件代表一組條件的集合,這些條件包括:v 檔案描述符已經就緒,可以讀取或者寫入v 檔案描述符變為就緒狀態,可以讀取或者寫入(僅對於邊沿觸發IO)v 超時事件v 發生某訊號v 使用者觸發事件所有事件具有相似的生命週期。呼叫libevent函式設定事件並且關聯到event
Android群英傳 神兵利器——出版祭
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
《Android群英傳:神兵利器》勘誤
我的新書《Android群英傳:神兵利器》剛剛上市不久,得到了很多開發者的鼓勵和肯定,我在此表示由衷的感謝! 本篇為本書的勘誤,由於時間倉促,書中難免會存在一些錯誤,特在此列出這些勘誤,也希望廣大讀者發現錯誤後,及時在本文評論中貼出來,我將收錄到下次的修訂
Android群英傳知識點回顧——第九章:Android系統信息與安全機制
class 以及 包名 bug 也有 不同的 ger class文件 訪問權限控制 9.1 Android系統信息獲取 9.1.1 android.os.Build 9.1.2 SystemProperty 9.1.3 Android系統信息實例
Android群英傳知識點回顧——第六章:Android繪圖機制與處理技巧
ride ets 常用 結合 管理 一個 sla 浮雕效果 調用 6.1 屏幕的尺寸信息 6.1.1 屏幕參數 6.1.2 系統屏幕密度 6.1.3 獨立像素密度dp 6.1.4 單位轉換 6.2 2D繪圖基礎 6.3 Android X
Android群英傳讀書筆記——第十三章:Android例項提高
第十三章目錄 13.1 移動迷宮——拼圖遊戲 13.1.1 準備工作 13.1.2 初始介面 13.1.3 拼圖介面 13.1.4 效果預覽與功能進階 13.2 魔幻矩陣——2048 13.2.1 2048概述 13.2.2 2048遊戲分析 13.2.3
Android群英傳讀書筆記——第十章:Android效能優化
第十章目錄 10.1 佈局優化 10.1.1 Android UI渲染機制 10.1.2 避免Overdraw 10.1.3 優化佈局層級 10.1.4 避免巢狀過多無用佈局 10.1.5 Hierarchy Viewer 10.2 記憶體優化
Android群英傳讀書筆記——第七章:Android動畫機制與使用技巧
第七章目錄 7.1 Android View動畫框架 7.1.1 透明度動畫 7.1.2 旋轉動畫 7.1.3 位移動畫 7.1.4 縮放動畫 7.1.5 動畫集合 7.2 Android屬性動畫分析 7.2.1 ObjectAnimato
Android群英傳讀書筆記——第十二章:Android 5.X新特性詳解
第十二章目錄 12.1 Android5.X UI設計初步 12.1.1 材料的形態模擬 12.1.2 更加真實的動畫 12.1.3 大色塊的使用 12.2 Material Design主題 12.3 Palette 12.4 檢視與陰影 12
Android群英傳讀書筆記——第九章:Android系統資訊與安全機制
第九章目錄 9.1 Android系統資訊獲取 9.1.1 android.os.Build 9.1.2 SystemProperty 9.1.3 Android系統資訊例項 9.2 Android Apk應用資訊獲取之PackageManager
Android UI開發神兵利器之Icon
mod ng- 介紹 water rac icons mark .com des 好的設計離不開Icon話不多。介紹2個國外的站點,一個用來找Icon,一個用來搞頁面設計http://dryicons.com/free-icons/http://www.webdesig
Android群英傳知識點回顧——第二章:Android開發工具新接觸
pla android開發 mem cli 啟動 touch 豌豆莢 sdcard car 2.1 Google生態系統 2.1.1 Android Studio初體驗 2.1.2 Android Studio配置 2.2 Android
Android群英傳——第五章實現滑動的7種方法(一二三)
實現滑動的基本思想: 當觸控View時,系統記下當前的座標 當手指移動時,系統記下當前移動點的座標 從而獲取了一個偏移量 通過這個偏移量修改這個View的座標 即可實現滑動的過程 要實現的效果如下: 方法一:layout方法 直接採用了基本思想:
Android群英傳——第五章實現滑動的7種方法(四)scrollTo和scrollBy
scrollTo()和scrollBy()的區別 scrollTo()代表讓View移動到一個具體的座標點:scrollTo(x,y) 移動到(x,y)點 scrollBy()則代表橫縱增量:設原點
Android群英傳學習——第七章、Android動畫機制與使用技巧
動畫能夠讓互動更加友好,特別是在提示、引導類的場景中,合理的使用動畫能讓使用者獲得更加愉悅的使用體驗。 學習本章,我們將瞭解到以下內容: ●Android檢視動畫 ●Android屬性動畫 ●Android動畫例項 一、Android View動畫框架
閱讀徐宜生《Android群英傳》的筆記——第3章 Android控制元件架構與自定義控制元件詳解(3.6-3.8)
3.6 自定義 View 在自定義 View 時,我們通常會去重寫 onDraw() 方法來繪製 View 的顯示內容。如果該 View 還需要使用 wrap_content 屬性,那麼還必須重寫 onMeasure() 方法。另外,通過自定義 attr