FlutterPlugin.groovy 4.08 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.domokit.sky.gradle

import com.android.builder.model.AndroidProject
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.Plugin
import org.gradle.api.Task
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction

class FlutterPlugin implements Plugin<Project> {
    private File sdkDir
21
    private File engineSrcDir
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

    @Override
    void apply(Project project) {
        Properties properties = new Properties()
        properties.load(project.rootProject.file("local.properties").newDataInputStream())

        String enginePath = properties.getProperty("flutter.jar")
        if (enginePath == null) {
            throw new GradleException("flutter.jar must be defined in local.properties")
        }
        FileCollection flutterEngine = project.files(enginePath)
        if (!flutterEngine.singleFile.isFile()) {
            throw new GradleException("flutter.jar must point to a Flutter engine JAR")
        }

        String sdkPath = properties.getProperty("flutter.sdk")
        if (sdkPath == null) {
            throw new GradleException("flutter.sdk must be defined in local.properties")
        }
        sdkDir = project.file(sdkPath)
        if (!sdkDir.isDirectory()) {
            throw new GradleException("flutter.sdk must point to the Flutter SDK directory")
        }

46 47 48 49 50 51 52 53
        String engineSrcPath = properties.getProperty("flutter.engineSrcPath")
        if (engineSrcPath != null) {
            engineSrcDir = project.file(engineSrcPath)
            if (!engineSrcDir.isDirectory()) {
                throw new GradleException("flutter.engineSrcPath must be a Flutter engine source directory")
            }
        }

54 55 56 57 58 59 60 61 62 63 64 65 66 67
        project.extensions.create("flutter", FlutterExtension)
        project.dependencies.add("compile", flutterEngine)
        project.afterEvaluate this.&addFlutterTask
    }

    private void addFlutterTask(Project project) {
        if (project.flutter.source == null) {
            throw new GradleException("Must provide Flutter source directory")
        }

        FlutterTask flutterTask = project.tasks.create("flutterBuild", FlutterTask) {
            sdkDir this.sdkDir
            sourceDir project.file(project.flutter.source)
            intermediateDir project.file("${project.buildDir}/${AndroidProject.FD_INTERMEDIATES}/flutter")
68
            engineSrcDir this.engineSrcDir
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
        }

        project.android.applicationVariants.all { variant ->
            Task copyFlxTask = project.tasks.create(name: "copyFlx${variant.name.capitalize()}", type: Copy) {
                dependsOn flutterTask
                dependsOn variant.mergeAssets
                from flutterTask.flxPath
                into variant.mergeAssets.outputDir
            }
            variant.outputs[0].processResources.dependsOn(copyFlxTask)
        }
    }
}

class FlutterExtension {
    String source
}

class FlutterTask extends DefaultTask {
    File sdkDir

    @InputDirectory
    File sourceDir

    @OutputDirectory
    File intermediateDir

96 97
    File engineSrcDir

98 99 100 101 102 103 104 105 106 107 108 109 110 111
    String getFlxPath() {
        return "${intermediateDir}/app.flx"
    }

    @TaskAction
    void build() {
        if (!sourceDir.isDirectory()) {
            throw new GradleException("Invalid Flutter source directory: ${sourceDir}")
        }

        intermediateDir.mkdirs()
        project.exec {
            executable "${sdkDir}/bin/flutter"
            workingDir sourceDir
112 113 114
            if (engineSrcDir != null) {
              args "--engine-src-path", engineSrcDir
            }
115
            args "build", "flx"
116 117 118 119 120 121 122
            args "-o", flxPath
            args "--snapshot", "${intermediateDir}/snapshot_blob.bin"
            args "--depfile", "${intermediateDir}/snapshot_blob.bin.d"
            args "--working-dir", "${intermediateDir}/flx"
        }
    }
}