系列文章目
Gradle學習之一入門介紹
Gradle學習之二Groovy核心語法
Gradle學習之三Groovy高級語法
Gradle學習之四Gradle生命周期
Gradle學習之五Project詳解
Gradle學習之六Task詳解
Gradle學習之七其他重要模塊
文章目錄
- 系列文章目
- 前言
- 一、了解Project
- 二、Project核心api
- 2.1 相關API
- 2.2 Project類常用API
- 三、屬性相關API
- 3.1 Project 默認屬性
- 3.2 定義擴展屬性
- 3.3 定義擴展屬性二
- 四、檔案屬性相關操作
- 4.1 檔案路徑api
- 4.2 檔案定位
- 4.3 檔案拷貝
- 4.4 檔案樹遍歷
- 五、其他API
- 5.1 依賴相關API
- 5.2 外部命令執行
前言

一、了解Project

雖然在專案中 AS有 Project 、 Module Library、Module App之分,但是對于Gradle來說,都是"project": 每一個module能把理解為gradle project的原因是存在build.gradle檔案

Root project 管理子project,子project負責本project的檔案輸出,并且能夠呼叫父project api ,管理其子project
二、Project核心api

2.1 相關API
在gradl專案中,每一個build.gradle會被編譯成Project位元組碼,因此在其中書寫內容,就相當于在Project類內部寫內容,
使用build.gradle列印所有的project和所有的子project:
this.getProjects()
//project api 詳解
//注意build.gradle中的方法,都是在配置階段執行的
//要想在執行階段執行, 需要配置task, 后面進行使用,
def getProjects(){
println '---------------'
println 'Root Project'
println '---------------'
this.getAllprojects().eachWithIndex { Project entry, int index ->
if(index == 0){
println "Root project ${entry.name}"
}else {
println "+--- project ${entry.name}"
}
}
}
this.getSubproject()
def getSubproject(){
println '---------------'
println 'Sub Project'
println '---------------'
this.getSubprojects().eachWithIndex { Project entry, int index ->
println "+--- project ${entry.name}"
}
}
使用build.gradle列印根project和父project:
this.getParentPro()
def getParentPro(){
this.getParent().each {println it.name}
}
this.getRootPro()
def getRootPro(){
println "The root is ${this.getRootProject().name}"
}
2.2 Project類常用API
在Android開發中,我們使用Gradle來配置和構建APP,接下來我們看一下Project的api在android專案中的應用,下述代碼是寫在專案的根build.gradle下,為子模塊提供一些通用配置,
/**
* Project api
*
* 在根工程中管理子project (雖然能夠配置子project但是不建議這么做)
* 通過傳入模塊名稱,獲取指定模塊的Gradle Project物件,從而配置它
*/
project('app'){ Project project->
apply plugin: 'com.android.application'
group 'com.zfc'
version '1.0.0'
dependencies {}
android{}
}
//該方法用于配置當前project和子project
allprojects {
group 'com.zfc'
version '1.0.0'
}
//列印驗證,是否子模塊已經有上面設定的group屬性了
println project('app').group
println project('baselibrary').group
//不包括當前project,只包含它的子project
//比如將子project上傳的maven的配置,可以在這里進行設定
subprojects { Project project->
if(project.plugins.hasPlugin("com.android.library")){
apply from: '../publicToMaven.gradle'
}
}
三、屬性相關API
3.1 Project 默認屬性
public interface Project extends Comparable<Project>, ExtensionAware, PluginAware {
//gradle默認檔案名
String DEFAULT_BUILD_FILE = "build.gradle";
//默認路徑分隔符
String PATH_SEPARATOR = ":";
//輸出的默認路徑
String DEFAULT_BUILD_DIR_NAME = "build";
String GRADLE_PROPERTIES = "gradle.properties";
}
3.2 定義擴展屬性
由于Project默認屬性有限,我們需要定義一些擴展屬性
//定義擴展屬性
ext{
}
subprojects{
//每個project都定義了擴展屬性
ext{
}
}
我們可以在優化一下,將ext定義在根gradle中,根屬性,可以被子完全繼承,可以直接使用,
最佳實踐,將擴展屬性單獨這是在一個檔案中

然后再在根gradle參考,

3.3 定義擴展屬性二
還可以在gradle.properties.但是只能定義key-value的形式
//file: gradle.properties
isNeedLoadTest = false
//file: setting.gradle
include ':app',"lib_base"
//需要注意的是gradle.properties的屬性 key或者value都是Object型別,需要進行一下轉換
if(hasProperty('isNeedLoadTest')?isNeedLoadTest.toBoolean():false){
include ':test'
}
四、檔案屬性相關操作

4.1 檔案路徑api
println getRootDir().absoulutePath() //根工程
println getBuildDir().absolutePath() //當前位置下的build檔案夾路徑
println getProjectDir().absolutePath() //當前project模塊
4.2 檔案定位
def getContent(String path){
try{
//file 從當前位置定位檔案
//project 還有 files api ,通過批量定位檔案
def f = file(path)
return f.text
}catch(GradleException e){
e.printStackTrack()
}
return null
}
4.3 檔案拷貝
//將當前檔案的path復制都 根目錄下的build的檔案
copy{
from fiile('path1')
into getRootProject().getBuildDir()
//還可以排除
exclude{
}
//重命名
rename{
}
}
4.4 檔案樹遍歷
fileTree('path'){FileTree fileTree ->
fileTree.visit{ FileTreeElement element->
copy{
from element.file
into getRootProject().getBuildDir().path+"/test"
}
}
}
上述的檔案操作,比如copy ,file等,需要在同一工程下進行操作,
五、其他API

5.1 依賴相關API
buildscript{ ScriptHandler scriptHandler->
//配置工程的倉庫地址
scriptHandler.repositories{ RepositoryHandler handler->
handler.jcenter()
handler.mavenCentral()
handler.mavenLocal()
handler.ivy{
}
handler.maven{
name 'personal'
url 'http://local.....'
credenticals{
username = 'admin'
password = 'admin123'
}
}
}
//配置工程插件地址
scriptHandler.dependencies{
classpath 'com.android.tools.buid:gradle:2.2.2'
classpath 'com.tencent'
}
}
dependencies{
//檔案夾 -> fileTree ,否則file
compile fileTree(include:['*.jar'],dir:'libs')
compile(){
//排除依賴
exclude module:'xxx'
exclude group:'yyyy'
//禁止傳遞依賴
transive false
}
}
盡量不要使用傳遞依賴,因為傳遞依賴是不確定的,
compile 完全把依賴打包進去,
provided:輔助程序,確保不會再運行時起作用才可以,
5.2 外部命令執行
如果使用外部命令
task(name: 'apkcopy'){
//doLast確保 該方法在gradle運行階段執行
doLast{
def sourcePath = this.buildDir.path + '/outputs/apk'
def destPath = '絕對目的路徑'
def cmd = 'mv -f ${sourcePath} ${destPath}'
exec{
try{
executable 'bash'
args '-c' , cmd
println 'the command is execute success.'
}catch(GradleException e){
e.printStackTrace()
println 'the command is execute failed.'
}
}
}
}
./gradlew apkcopy
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/179679.html
標籤:其他
