/*
* 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.tasks;
import com.android.annotations.NonNull;
import com.android.build.gradle.internal.LoggerWrapper;
import com.android.build.gradle.internal.NdkHandler;
import com.android.build.gradle.internal.core.Abi;
import com.android.build.gradle.internal.process.GradleProcessExecutor;
import com.android.build.gradle.ndk.internal.NdkNamingScheme;
import com.android.ide.common.process.LoggedProcessOutputHandler;
import com.android.ide.common.process.ProcessException;
import com.android.ide.common.process.ProcessInfoBuilder;
import org.gradle.api.Action;
import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFile;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import org.gradle.nativeplatform.SharedLibraryBinarySpec;
import java.io.File;
/**
* Task to remove debug symbols from a native library.
*/
public class StripDebugSymbolTask extends DefaultTask {
private File stripCommand;
private File inputFile;
private File outputFile;
// ----- PUBLIC API -----
@Input
public File getStripCommand() {
return stripCommand;
}
public void setStripCommand(File stripCommand) {
this.stripCommand = stripCommand;
}
@Optional
@InputFile
public File getInputFile() {
// If source set is empty, the file debuggable library is not generated.
return inputFile.exists() ? inputFile : null;
}
public void setInputFile(File inputFile) {
this.inputFile = inputFile;
}
@OutputFile
public File getOutputFile() {
return outputFile;
}
public void setOutputFile(File outputFile) {
this.outputFile = outputFile;
}
// ----- PRIVATE API -----
@TaskAction
void taskAction() throws ProcessException {
if (getInputFile() == null) {
return;
}
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
ProcessInfoBuilder builder = new ProcessInfoBuilder();
builder.setExecutable(stripCommand);
builder.addArgs("--strip-unneeded");
builder.addArgs("-o");
builder.addArgs(outputFile.toString());
builder.addArgs(inputFile.toString());
new GradleProcessExecutor(getProject()).execute(
builder.createProcess(),
new LoggedProcessOutputHandler(new LoggerWrapper(getLogger())));
}
// ----- ConfigAction -----
public static class ConfigAction implements Action<StripDebugSymbolTask> {
@NonNull
private final SharedLibraryBinarySpec binary;
@NonNull
private final File buildDir;
@NonNull
private final NdkHandler handler;
public ConfigAction(
@NonNull SharedLibraryBinarySpec binary,
@NonNull File buildDir,
@NonNull NdkHandler handler) {
this.binary = binary;
this.buildDir = buildDir;
this.handler = handler;
}
@Override
public void execute(@NonNull StripDebugSymbolTask task) {
File debugLib = binary.getSharedLibraryFile();
task.setInputFile(debugLib);
task.setOutputFile(new File(
buildDir,
NdkNamingScheme.getOutputDirectoryName(binary) + "/"
+ debugLib.getName()));
task.setStripCommand(handler.getStripCommand(
Abi.getByName(binary.getTargetPlatform().getName())));
task.dependsOn(binary);
}
}
}