Série de aprendizado do Android Gradle (7) - Combate detalhado e prático da tarefa principal do Gradle

Prefácio

Neste artigo, falamos Gradlesobre outro conceito importanteTask

1. TaskDefinição e configuração

1.1 TaskDefinição

O primeiro: pode ser taskdefinido diretamente pela função

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

O segundo tipo: o TaskContainer
Insira a descrição da imagem aqui
é aquele que circulamos com uma moldura vermelha acima, como criá-lo? Basta chamar o createmétodo diretamente
Insira a descrição da imagem aqui

Insira a descrição da imagem aqui
Qual é a diferença entre esses dois métodos? De fato, o primeiro método será eventualmente adicionado a TaskContainerele, o que é TaskContainerequivalente à nossa Taskclasse de gerenciamento.Como é uma classe de gerenciamento, ela pode ser criada não apenas, vamos ver o código-fonte

@HasInternalProtocol
public interface TaskContainer extends TaskCollection<Task>, PolymorphicDomainObjectContainer<Task> {
	...
    @Nullable
    Task findByPath(String path);

    Task getByPath(String path) throws UnknownTaskException;

    <T extends Task> T create(String name, Class<T> type, Action<? super T> configuration) throws InvalidUserDataException;

    TaskProvider<Task> register(String name, Action<? super Task> configurationAction) throws InvalidUserDataException;

    Task replace(String name);
    ...

Depois de ler o código fonte, descobrimos que é TaskContainerprincipalmente para encontrar e adicionar, e raramente usamos outras

1.2 TaskConfiguração

Por exemplo, queremos taskconfigurar o nome e a descrição do grupo para nossos

O primeiro tipo: nós o configuramos diretamente quando definido.O
Insira a descrição da imagem aqui
segundo tipo: chama vários métodos de configuração no bloco de códigos de configuração
Insira a descrição da imagem aqui

Os mesmos agrupamentos taskserão reunidos. Vamos ver
Insira a descrição da imagem aqui
o que podemos taskconfigurar? Vamos para o Taskcódigo fonte e ver.
Insira a descrição da imagem aqui

2. TaskExecução detalhada

Insira a descrição da imagem aqui
Descobrimos que, quando executamos helloTaskisso task, ele também imprime helloTask2o conteúdo de saída. Por que? É muito simples, porque eles são executados na fase de configuração; portanto, como os fazemos executar na fase de execução? Chamada doFirstou doLastmétodo
Insira a descrição da imagem aqui
Vamos ver o resultado
Insira a descrição da imagem aqui

Em primeiro lugar doFirste doLastrealmente executados na fase de execução é então realizada do lado de fora doFirstou doLastde ter precedência sobre o fecho, os dois métodos podem gradlejá previstas taskestendida

Abaixo, contaremos nosso buildtempo em combate real
:

  • 1. Defina duas variáveis: iniciar o tempo de execução e terminar o tempo de execução; a diferença entre as duas é o resultado que queremos
  • 2. Encontre o primeiro a ser executado task, chame o doFirstmétodo e obtenha a hora de início
  • 3. Encontre o último método executado task, execute doLast, obtenha o horário final
  • 4. A diferença entre os dois
    Insira a descrição da imagem aqui
    : imprimimos para ver quanto tempo levará
    Insira a descrição da imagem aqui

3. TaskDependência e ordem de execução

Insira a descrição da imagem aqui

3.1 TaskDependência

Primeiro, definimos 3. task
Insira a descrição da imagem aqui
Primeiro, não executamos nada e taskC
Insira a descrição da imagem aqui
apenas o produzimos taskC. Vamos compará-lo com isso mais tarde . O
que queremos fazer para a nossa taskCdependência especificada?

O primeiro: adicione no momento da definição dependsOn, como adicionamos groupantes

Insira a descrição da imagem aqui
Adicione várias necessidades para usar a matriz
Insira a descrição da imagem aqui
que executamostaskC
Insira a descrição da imagem aqui

O segundo: dependsOnmétodo de chamada

Insira a descrição da imagem aqui

O terceiro: dependência dinâmica

Aqui criaremos mais alguns para demonstraçãotask

Insira a descrição da imagem aqui

Em seguida, usamos TaskContainero findAllmétodo para me encontrar alinhado com o nosso taske depois taskCconfiar neles
Insira a descrição da imagem aqui

Nós executamostaskC
Insira a descrição da imagem aqui

3.2 Taskentrada e saída

Insira a descrição da imagem aqui
TaskInputs: A Taskclasse de entrada pode ser de qualquer tipo e arquivo de dados
TaskOutputs: A Taskclasse de saída pode ser apenas um arquivo ou uma pasta e também pode ser usada como outra Task. TaskInputs
Abaixo, escrevemos um pequeno exemplo para aprender esses dois métodos.
Suponha que desejemos produzir um xmlarquivo. O conteúdo inclui o número da versão e as informações da versão. Primeiro,
Insira a descrição da imagem aqui
criamos três novos atributos estendidos:
Insira a descrição da imagem aqui
aqui também precisamos definir um File, que é nosso release.xml.
Insira a descrição da imagem aqui

Então começamos a perceber que lemos e recursos de gravação, precisamos criar os dois correspondentes task, writeTaske readTask
nós escrevemos writeTask
três atributos Queremos que nossos previamente definidos nos transmitiutask

    inputs.property('versionCode', this.versionCode)
    inputs.property('versionName', this.versionName)
    inputs.property('versionInfo', this.versionInfo)

Especifique também a saída

    //为task指定输出
    outputs.file this.destFile

Aqui está começar a escrever a lógica real, essa lógica escrita doLast{}em

task writeTask {
    inputs.property('versionCode', this.versionCode)
    inputs.property('versionName', this.versionName)
    inputs.property('versionInfo', this.versionInfo)
    outputs.file this.destFile
    doLast {
    	// 返回一个map
        def data = inputs.getProperties() 
        File file = outputs.getFiles().getSingleFile()
        // 将map转为实体对象
        def versionMsg = new VersionMsg(data)
        def sw = new StringWriter()
        def xmlBuilder = new MarkupBuilder(sw)
        // 文件中没有内容
        if (file.text != null && file.text.size() <= 0) { 
            // 将xml数据写入到sw中
            xmlBuilder.releases { // <releases>
                release { // <releases>的子节点<release>
                    versionCode(versionMsg.versionCode)
                    // <release>的子节点<versionCode>1.0.0<versionCode>
                    versionName(versionMsg.versionName)
                    versionInfo(versionMsg.versionInfo)
                }
            }
            // 将sw里的内容写到文件中
            file.withWriter { writer ->
                writer.append(sw.toString())
            }
        } else { // 已经有其它版本信息了
            xmlBuilder.release {
                versionCode(versionMsg.versionCode)
                versionName(versionMsg.versionName)
                versionInfo(versionMsg.versionInfo)
            }
            def lines = file.readLines()
            def lengths = lines.size() - 1
            file.withWriter { writer ->
                lines.eachWithIndex { String line, int index ->
                    if (index != lengths) {
                        writer.append(line + '\r\n')
                    } else if (index == lengths) {
                        writer.append(sw.toString() + '\r\n')
                        writer.append(line + '\r\n')
                    }
                }
            }
        }
    }
}

task readTask {
    inputs.file destFile
    doLast {
        def file = inputs.files.singleFile
        println file.text
    }
}

Em seguida, escreva um teste que taskdependa desses doistask

task taskTest(dependsOn: [writeTask, readTask]) {
    doLast {
        println '任务执行完毕'
    }
}

Aqui é um lugar para nota, a writeTaskordem de execução é uma prioridade readTaskdo

3,3 Taskpela APIordem designada de execução

  • mustRunAfter: Forçado a askexecutar após a execução de um ou alguns t .
  • shouldRunAfter: Igual mustRunAfterà função, mas não obrigatória.

Aqui criamos alguns taskpara praticar
Insira a descrição da imagem aqui

Aqui nós cumprir a ordem taskX, taskY, taskZ
a ordem da saída para a virada olhar seguinte,
Insira a descrição da imagem aqui

4. Anexe ao ciclo de vida da construção

Isso é semelhante ao que explicamos antes para obter o tempo de compilação.Aqui executamos nosso projeto personalizado após a compilação do projeto.task
Insira a descrição da imagem aqui

5. TaskTipo de

Este é preciso ir para gradleo site oficial para conhecer no
site oficial
site oficial aberto, encontrado no lado esquerdoTask types
Insira a descrição da imagem aqui

Como dissemos antesCopy
Insira a descrição da imagem aqui

Publicado 87 artigos originais · Gosto 319 · Visite 1,49 milhões +

Acho que você gosta

Origin blog.csdn.net/Greathfs/article/details/102809361
Recomendado
Clasificación