| /* |
| * Copyright (C) 2016 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.tasks; |
| |
| import static com.android.build.gradle.internal.scope.InternalArtifactType.GENERATED_PROGUARD_FILE; |
| |
| import com.android.SdkConstants; |
| import com.android.annotations.NonNull; |
| import com.android.build.api.component.impl.ComponentPropertiesImpl; |
| import com.android.build.gradle.internal.scope.GlobalScope; |
| import com.android.build.gradle.internal.scope.InternalArtifactType; |
| import com.android.build.gradle.internal.tasks.factory.VariantTaskCreationAction; |
| import com.android.build.gradle.internal.utils.HasConfigurableValuesKt; |
| import com.android.builder.errors.EvalIssueException; |
| import java.io.IOException; |
| import org.gradle.api.Project; |
| import org.gradle.api.file.ConfigurableFileCollection; |
| import org.gradle.api.file.DirectoryProperty; |
| import org.gradle.api.tasks.CacheableTask; |
| import org.gradle.api.tasks.Input; |
| import org.gradle.api.tasks.InputFiles; |
| import org.gradle.api.tasks.Internal; |
| import org.gradle.api.tasks.PathSensitive; |
| import org.gradle.api.tasks.PathSensitivity; |
| import org.gradle.api.tasks.TaskProvider; |
| |
| /** Configuration action for a merge-Proguard-files task. */ |
| @CacheableTask |
| public abstract class MergeConsumerProguardFilesTask extends MergeFileTask { |
| |
| private boolean isDynamicFeature; |
| private boolean isBaseModule; |
| |
| @Input |
| public boolean getIsDynamicFeature() { |
| return isDynamicFeature; |
| } |
| |
| @Input |
| public boolean getIsBaseModule() { |
| return isBaseModule; |
| } |
| |
| @InputFiles |
| @PathSensitive(PathSensitivity.RELATIVE) |
| public abstract ConfigurableFileCollection getConsumerProguardFiles(); |
| |
| @Internal("only for task execution") |
| public abstract DirectoryProperty getBuildDirectory(); |
| |
| @Override |
| public void doTaskAction() throws IOException { |
| // We check for default files unless it's a base feature, which can include default files. |
| if (!isBaseModule) { |
| ExportConsumerProguardFilesTask.checkProguardFiles( |
| getBuildDirectory(), |
| isDynamicFeature, |
| getConsumerProguardFiles().getFiles(), |
| errorMessage -> { |
| throw new EvalIssueException(errorMessage); |
| }); |
| } |
| super.doTaskAction(); |
| } |
| |
| public static class CreationAction |
| extends VariantTaskCreationAction< |
| MergeConsumerProguardFilesTask, ComponentPropertiesImpl> { |
| |
| public CreationAction(@NonNull ComponentPropertiesImpl componentProperties) { |
| super(componentProperties); |
| } |
| |
| @NonNull |
| @Override |
| public String getName() { |
| return computeTaskName("merge", "ConsumerProguardFiles"); |
| } |
| |
| @NonNull |
| @Override |
| public Class<MergeConsumerProguardFilesTask> getType() { |
| return MergeConsumerProguardFilesTask.class; |
| } |
| |
| @Override |
| public void handleProvider( |
| @NonNull TaskProvider<MergeConsumerProguardFilesTask> taskProvider) { |
| super.handleProvider(taskProvider); |
| |
| creationConfig |
| .getArtifacts() |
| .setInitialProvider(taskProvider, MergeConsumerProguardFilesTask::getOutputFile) |
| .withName(SdkConstants.FN_PROGUARD_TXT) |
| .on(InternalArtifactType.MERGED_CONSUMER_PROGUARD_FILE.INSTANCE); |
| } |
| |
| @Override |
| public void configure( |
| @NonNull MergeConsumerProguardFilesTask task) { |
| super.configure(task); |
| GlobalScope globalScope = creationConfig.getGlobalScope(); |
| Project project = globalScope.getProject(); |
| |
| task.isBaseModule = creationConfig.getVariantType().isBaseModule(); |
| task.isDynamicFeature = creationConfig.getVariantType().isDynamicFeature(); |
| |
| task.getConsumerProguardFiles() |
| .from(creationConfig.getVariantScope().getConsumerProguardFilesForFeatures()); |
| |
| ConfigurableFileCollection inputFiles = |
| project.files( |
| task.getConsumerProguardFiles(), |
| creationConfig.getArtifacts().get(GENERATED_PROGUARD_FILE.INSTANCE)); |
| task.setInputFiles(inputFiles); |
| HasConfigurableValuesKt.setDisallowChanges( |
| task.getBuildDirectory(), task.getProject().getLayout().getBuildDirectory()); |
| } |
| } |
| } |