2016-03-12 00:30:56 +00:00
|
|
|
// 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
|
2016-04-12 21:26:22 +00:00
|
|
|
import com.google.common.base.Joiner
|
2016-03-12 00:30:56 +00:00
|
|
|
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
|
2016-06-06 19:56:04 +00:00
|
|
|
import org.gradle.api.file.CopySpec
|
2016-03-12 00:30:56 +00:00
|
|
|
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> {
|
2016-06-06 19:56:04 +00:00
|
|
|
private File flutterRoot
|
|
|
|
private String buildMode
|
2016-05-28 00:12:52 +00:00
|
|
|
private String localEngine
|
2016-03-12 00:30:56 +00:00
|
|
|
|
|
|
|
@Override
|
|
|
|
void apply(Project project) {
|
|
|
|
Properties properties = new Properties()
|
|
|
|
properties.load(project.rootProject.file("local.properties").newDataInputStream())
|
|
|
|
|
2016-06-06 19:56:04 +00:00
|
|
|
String flutterRootPath = properties.getProperty("flutter.sdk")
|
|
|
|
if (flutterRootPath == null) {
|
2016-03-12 00:30:56 +00:00
|
|
|
throw new GradleException("flutter.sdk must be defined in local.properties")
|
|
|
|
}
|
2016-06-06 19:56:04 +00:00
|
|
|
flutterRoot = project.file(flutterRootPath)
|
|
|
|
if (!flutterRoot.isDirectory()) {
|
2016-03-12 00:30:56 +00:00
|
|
|
throw new GradleException("flutter.sdk must point to the Flutter SDK directory")
|
|
|
|
}
|
|
|
|
|
2016-06-06 19:56:04 +00:00
|
|
|
buildMode = properties.getProperty("flutter.buildMode")
|
|
|
|
if (buildMode == null) {
|
|
|
|
buildMode = "release"
|
|
|
|
}
|
|
|
|
if (!["debug", "profile", "release"].contains(buildMode)) {
|
|
|
|
throw new GradleException("flutter.buildMode must be one of \"debug\", \"profile\", or \"release\" but was \"${buildMode}\"")
|
|
|
|
}
|
|
|
|
|
2016-04-12 21:26:22 +00:00
|
|
|
File flutterJar
|
|
|
|
String flutterJarPath = properties.getProperty("flutter.jar")
|
|
|
|
if (flutterJarPath != null) {
|
|
|
|
flutterJar = project.file(flutterJarPath)
|
|
|
|
if (!flutterJar.isFile()) {
|
|
|
|
throw new GradleException("flutter.jar must point to a Flutter engine JAR")
|
|
|
|
}
|
|
|
|
} else {
|
2016-06-06 19:56:04 +00:00
|
|
|
// TODO(abarth): Support x64 and x86 in addition to arm.
|
|
|
|
String artifactType = "unknown";
|
|
|
|
if (buildMode == "debug") {
|
|
|
|
artifactType = "android-arm"
|
|
|
|
} else if (buildMode == "profile") {
|
|
|
|
artifactType = "android-arm-profile"
|
|
|
|
} else if (buildMode == "release") {
|
|
|
|
artifactType = "android-arm-release"
|
|
|
|
}
|
|
|
|
flutterJar = new File(flutterRoot, Joiner.on(File.separatorChar).join(
|
|
|
|
"bin", "cache", "artifacts", "engine", artifactType, "flutter.jar"))
|
2016-04-12 21:26:22 +00:00
|
|
|
if (!flutterJar.isFile()) {
|
|
|
|
project.exec {
|
2016-06-06 19:56:04 +00:00
|
|
|
executable "${flutterRoot}/bin/flutter"
|
2016-04-12 21:26:22 +00:00
|
|
|
args "precache"
|
|
|
|
}
|
|
|
|
if (!flutterJar.isFile()) {
|
|
|
|
throw new GradleException("Unable to find flutter.jar in SDK: ${flutterJar}")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-28 00:12:52 +00:00
|
|
|
localEngine = properties.getProperty("flutter.localEngine")
|
2016-03-23 20:33:11 +00:00
|
|
|
|
2016-03-12 00:30:56 +00:00
|
|
|
project.extensions.create("flutter", FlutterExtension)
|
2016-04-12 21:26:22 +00:00
|
|
|
project.dependencies.add("compile", project.files(flutterJar))
|
2016-03-12 00:30:56 +00:00
|
|
|
project.afterEvaluate this.&addFlutterTask
|
|
|
|
}
|
|
|
|
|
|
|
|
private void addFlutterTask(Project project) {
|
|
|
|
if (project.flutter.source == null) {
|
|
|
|
throw new GradleException("Must provide Flutter source directory")
|
|
|
|
}
|
|
|
|
|
2016-06-07 20:05:42 +00:00
|
|
|
String target = project.flutter.target;
|
|
|
|
if (target == null) {
|
|
|
|
target = 'lib/main.dart'
|
|
|
|
}
|
|
|
|
|
2016-03-12 00:30:56 +00:00
|
|
|
FlutterTask flutterTask = project.tasks.create("flutterBuild", FlutterTask) {
|
2016-06-06 19:56:04 +00:00
|
|
|
flutterRoot this.flutterRoot
|
|
|
|
buildMode this.buildMode
|
|
|
|
localEngine this.localEngine
|
2016-06-07 20:05:42 +00:00
|
|
|
targetPath target
|
2016-03-12 00:30:56 +00:00
|
|
|
sourceDir project.file(project.flutter.source)
|
|
|
|
intermediateDir project.file("${project.buildDir}/${AndroidProject.FD_INTERMEDIATES}/flutter")
|
|
|
|
}
|
|
|
|
|
|
|
|
project.android.applicationVariants.all { variant ->
|
2016-06-06 19:56:04 +00:00
|
|
|
Task copyFlxTask = project.tasks.create(name: "copyFlutterAssets${variant.name.capitalize()}", type: Copy) {
|
2016-03-12 00:30:56 +00:00
|
|
|
dependsOn flutterTask
|
|
|
|
dependsOn variant.mergeAssets
|
|
|
|
into variant.mergeAssets.outputDir
|
2016-06-06 19:56:04 +00:00
|
|
|
with flutterTask.assets
|
2016-03-12 00:30:56 +00:00
|
|
|
}
|
|
|
|
variant.outputs[0].processResources.dependsOn(copyFlxTask)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class FlutterExtension {
|
|
|
|
String source
|
2016-06-07 20:05:42 +00:00
|
|
|
String target
|
2016-03-12 00:30:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
class FlutterTask extends DefaultTask {
|
2016-06-06 19:56:04 +00:00
|
|
|
File flutterRoot
|
|
|
|
String buildMode
|
|
|
|
String localEngine
|
2016-06-07 20:05:42 +00:00
|
|
|
String targetPath
|
2016-03-12 00:30:56 +00:00
|
|
|
|
|
|
|
@InputDirectory
|
|
|
|
File sourceDir
|
|
|
|
|
|
|
|
@OutputDirectory
|
|
|
|
File intermediateDir
|
|
|
|
|
2016-06-06 19:56:04 +00:00
|
|
|
CopySpec getAssets() {
|
|
|
|
return project.copySpec {
|
|
|
|
from "${intermediateDir}/app.flx"
|
|
|
|
if (buildMode != 'debug') {
|
|
|
|
from "${intermediateDir}/snapshot_aot_instr"
|
|
|
|
from "${intermediateDir}/snapshot_aot_isolate"
|
|
|
|
from "${intermediateDir}/snapshot_aot_rodata"
|
|
|
|
from "${intermediateDir}/snapshot_aot_vmisolate"
|
|
|
|
}
|
|
|
|
}
|
2016-03-12 00:30:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@TaskAction
|
|
|
|
void build() {
|
|
|
|
if (!sourceDir.isDirectory()) {
|
|
|
|
throw new GradleException("Invalid Flutter source directory: ${sourceDir}")
|
|
|
|
}
|
|
|
|
|
|
|
|
intermediateDir.mkdirs()
|
2016-06-06 19:56:04 +00:00
|
|
|
|
|
|
|
if (buildMode != "debug") {
|
|
|
|
project.exec {
|
|
|
|
executable "${flutterRoot}/bin/flutter"
|
|
|
|
workingDir sourceDir
|
|
|
|
if (localEngine != null) {
|
|
|
|
args "--local-engine", localEngine
|
|
|
|
}
|
|
|
|
args "build", "aot"
|
2016-06-07 20:05:42 +00:00
|
|
|
args "--target", targetPath
|
2016-06-06 19:56:04 +00:00
|
|
|
args "--target-platform", "android-arm"
|
|
|
|
args "--output-dir", "${intermediateDir}"
|
|
|
|
args "--${buildMode}"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-12 00:30:56 +00:00
|
|
|
project.exec {
|
2016-06-06 19:56:04 +00:00
|
|
|
executable "${flutterRoot}/bin/flutter"
|
2016-03-12 00:30:56 +00:00
|
|
|
workingDir sourceDir
|
2016-05-28 00:12:52 +00:00
|
|
|
if (localEngine != null) {
|
|
|
|
args "--local-engine", localEngine
|
2016-03-23 20:33:11 +00:00
|
|
|
}
|
2016-03-19 04:44:48 +00:00
|
|
|
args "build", "flx"
|
2016-06-07 20:05:42 +00:00
|
|
|
args "--target", targetPath
|
2016-06-06 19:56:04 +00:00
|
|
|
args "--output-file", "${intermediateDir}/app.flx"
|
|
|
|
if (buildMode != "debug") {
|
|
|
|
args "--precompiled"
|
|
|
|
} else {
|
|
|
|
args "--snapshot", "${intermediateDir}/snapshot_blob.bin"
|
|
|
|
args "--depfile", "${intermediateDir}/snapshot_blob.bin.d"
|
|
|
|
}
|
2016-03-12 00:30:56 +00:00
|
|
|
args "--working-dir", "${intermediateDir}/flx"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|