blob: 6f43460198019741ae5ddddd25aebdff89abb3a6 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.build.gradle.internal
import com.android.annotations.NonNull
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.internal.profile.SpanRecorders
import com.android.build.gradle.internal.scope.VariantScope
import com.android.build.gradle.internal.variant.ApplicationVariantData
import com.android.build.gradle.internal.variant.BaseVariantData
import com.android.build.gradle.internal.variant.BaseVariantOutputData
import com.android.builder.core.AndroidBuilder
import com.android.builder.profile.ExecutionType
import com.android.builder.profile.Recorder
import com.android.builder.profile.ThreadRecorder
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
/**
* TaskManager for creating tasks in an Android application project.
*/
class ApplicationTaskManager extends TaskManager {
public ApplicationTaskManager (
Project project,
AndroidBuilder androidBuilder,
BaseExtension extension,
SdkHandler sdkHandler,
DependencyManager dependencyManager,
ToolingModelBuilderRegistry toolingRegistry) {
super(project, androidBuilder, extension, sdkHandler, dependencyManager, toolingRegistry)
}
@Override
public void createTasksForVariantData(
@NonNull TaskFactory tasks,
@NonNull BaseVariantData<? extends BaseVariantOutputData> variantData) {
assert variantData instanceof ApplicationVariantData;
ApplicationVariantData appVariantData = (ApplicationVariantData) variantData;
VariantScope variantScope = variantData.getScope()
createAnchorTasks(tasks, variantScope);
createCheckManifestTask(tasks, variantScope);
handleMicroApp(tasks, variantScope);
// Add a task to process the manifest(s)
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_MERGE_MANIFEST_TASK) {
createMergeAppManifestsTask(tasks, variantScope)
}
// Add a task to create the res values
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_GENERATE_RES_VALUES_TASK) {
createGenerateResValuesTask(tasks, variantScope);
}
// Add a task to compile renderscript files.
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_CREATE_RENDERSCRIPT_TASK) {
createRenderscriptTask(tasks, variantScope);
}
// Add a task to merge the resource folders
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_MERGE_RESOURCES_TASK) {
createMergeResourcesTask(tasks, variantScope);
}
// Add a task to merge the asset folders
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_MERGE_ASSETS_TASK) {
createMergeAssetsTask(tasks, variantScope);
}
// Add a task to create the BuildConfig class
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_BUILD_CONFIG_TASK) {
createBuildConfigTask(tasks, variantScope);
}
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_PREPROCESS_RESOURCES_TASK) {
createPreprocessResourcesTask(tasks, variantScope)
}
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_PROCESS_RES_TASK) {
// Add a task to process the Android Resources and generate source files
createProcessResTask(tasks, variantScope, true /*generateResourcePackage*/);
// Add a task to process the java resources
createProcessJavaResTask(tasks, variantScope);
}
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_AIDL_TASK) {
createAidlTask(tasks, variantScope);
}
// Add a compile task
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_COMPILE_TASK) {
if (variantData.getVariantConfiguration().getUseJack()) {
createJackTask(appVariantData, null /*testedVariant*/);
} else {
createJavaCompileTask(tasks, variantScope);
createJarTask(tasks, variantScope);
createPostCompilationTasks(tasks, variantScope);
}
}
// Add NDK tasks
if (isNdkTaskNeeded) {
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_NDK_TASK) {
createNdkTasks(variantData);
}
}
variantScope.setNdkBuildable(getNdkBuildable(variantData))
variantScope.setNdkOutputDirectories(getNdkOutputDirectories(variantData))
if (variantData.getSplitHandlingPolicy() ==
BaseVariantData.SplitHandlingPolicy.RELEASE_21_AND_AFTER_POLICY) {
if (extension.getBuildToolsRevision().getMajor() < 21) {
throw new RuntimeException("Pure splits can only be used with buildtools 21 and later")
}
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_SPLIT_TASK) {
createSplitResourcesTasks(variantScope);
createSplitAbiTasks(variantScope);
}
}
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_PACKAGING_TASK) {
createPackagingTask(tasks, variantScope, true /*publishApk*/);
}
// create the lint tasks.
SpanRecorders.record(ExecutionType.APP_TASK_MANAGER_CREATE_LINT_TASK) {
createLintTasks(tasks, variantScope);
}
}
/**
* Configure variantData to generate embedded wear application.
*/
private void handleMicroApp(
@NonNull TaskFactory tasks,
@NonNull VariantScope scope) {
BaseVariantData<? extends BaseVariantOutputData> variantData = scope.variantData
if (variantData.getVariantConfiguration().getBuildType().isEmbedMicroApp()) {
// get all possible configurations for the variant. We'll take the highest priority
// of them that have a file.
List<String> wearConfigNames = variantData.getWearConfigNames();
for (String configName : wearConfigNames) {
Configuration config = project.getConfigurations().findByName(
configName);
// this shouldn't happen, but better safe.
if (config == null) {
continue;
}
Set<File> file = config.getFiles();
int count = file.size();
if (count == 1) {
createGenerateMicroApkDataTask(tasks, scope, config);
// found one, bail out.
return;
} else if (count > 1) {
throw new RuntimeException(String.format(
"Configuration '%s' resolves to more than one apk.", configName));
}
}
}
}
}