Chapter7:使用Gradle創建任務

Chapter7:使用Gradle創建任務

7.1瞭解Groovy

  • 變量

    //字符串可用單引號/雙引號;雙引號可以插入表達式
    def name = 'Andy'
    println(name)
    //包含一個單獨變量的佔位符表達式:$前綴
    def greeting = "Hello, $name!"
    println(greeting)
    //包含一個方法或多個變量的佔位符表達式:$前綴+花括號包裹
    def name_size =  "Your name is ${name.size()} characters long"
    println(name_size)
    //字符串差值允許動態執行代碼:
    def method = 'toString'
    println new Date()."$method"()
    
  • 類和成員變量

    class MyGroovyClass{
        String greeting
    
        String getGreeting() {
            return greeting
        }
    
        void setGreeting(String greeting) {
            this.greeting = greeting
        }
    }
    
    def instance = new MyGroovyClass()
    instance.setGreeting("Hello")
    //也可以省略括號:println instance.getGreeting
    println instance.getGreeting()
    
  • 方法

    //def 定義方法,隱含一個返回值,即方法體的最後一行
    def square(def num){
        num*num
    }
    println square(4)
    
    //一種更簡短的定義方式,使用了Closures
    def square = {num ->
        num*num
    }
    println square(4)
    
  • 匿名代碼塊(Closures)

    //不指定參數,會自動添加默認參數
    Closure square = {
        it*it
    }
    println square (4)
    
  • 集合:(lists 和 maps)

    //List
    List list = [1,2,3,4,5]
    
    list.each() {element->
        println(element)
    }
    
    //使用it變量化簡
    list.each() {
        println(it)
    }
    
    //Map
    Map price = [apple:10,banana:20]
    
    println price.get('apple')
    println price.banana
    
  • Gradle 中的 groovy

    apply plugin: 'com.android.application'
    //等價於
    project.apply([plugin: 'com.android.application'])
    //apply()是Project類的一個方法;Project是每個Gradle構建的基礎代碼塊;
    //apply()需要一個參數:一個Map(key爲plugin,值爲com.android.application)
    
    dependencies{
        implementation 'androidx.cardview:cardview:1.0.0'
    }
    //代碼塊是一個Closure,將dependencies()方法傳遞給Project對象
    //closure被傳遞給一個包含add()方法的DependencyHandler
    //該方法接受三個參數:一個定義配置的字符串,一個定義依賴標誌的對象,一個針對依賴特定屬性的closure
    //等價於
    project.dependencies({
        add('implementation','androidx.cardview:cardview:1.0.0',{
            //Configuration statements
        })
    })
    

7.2 瞭解任務

  • 任務屬於一個 Project 對象,並且每個任務都可以執行 task 接口。

    task hello{
    	//配置階段
    	println('Configuration') 
        
        //執行階段
    	doLast{
          println 'Execution'
        } 
    }
    

執行簡單任務

  • doFirst/doLast

    doFirst()總是添加一個動作到task的最前面,doLast()總是添加一個動作到task的最後面。

    task mindTheOrder{
    	doFirst{
    		println 'A'
    	}
    	
    	doFirst{
    		println 'B'
    	}
    	
    	doLast{
    		println 'C'
    	}
    	
    	doLast{
    		println 'D'
    	}
    }
    

任務FirstLast

  • taskAfter:(安排執行任務順序)

    task task1{
    	doLast{
    		println("task1")
    	}
    }
    
    task task2{
    	doLast{
    		println("task2")
    	}
    }
    
    task2.mustRunAfter task1
    

    taskAfter

  • dependsOn:(任務依賴)

    task task1{
    	doLast{
    		println("task1")
    	}
    }
    
    task task2{
    	doLast{
    		println("task2")
    	}
    }
    
    task2.dependsOn task1
    

    dependsOn

7.3 操控構建 variants

  • Hook 到 Android 插件的方式之一是操控構建 variants。

    android.applicationVariants.all{variant ->
    	// Do something 
    }
    

    依賴庫時使用 libraryVariants 替代 applicationVariants。

    注意:通過All()遍歷構建variant,而不是 each(),因爲each()會在構建variant被Android插件構建之前的評測階段被處罰。all()方法會在每次添加新項目到集合是被觸發。

  • 自動重命名APK

    android.applicationVariants.all{variant ->
        variant.outputs.all{output ->
            outputFileName = "app-${variant.versionName}.apk"
        }
    }
    

7.4 參考資料

  • Gradle For Android
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章