com.android.builder.core.JackProcessBuilder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of builder Show documentation
Show all versions of builder Show documentation
Library to build Android applications.
/*
* 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.builder.core;
import com.android.annotations.NonNull;
import com.android.ide.common.process.JavaProcessInfo;
import com.android.ide.common.process.ProcessEnvBuilder;
import com.android.ide.common.process.ProcessException;
import com.android.ide.common.process.ProcessInfoBuilder;
import com.android.sdklib.BuildToolInfo;
import com.android.sdklib.repository.FullRevision;
import com.google.common.collect.Lists;
import java.io.File;
import java.util.Collection;
import java.util.List;
/**
* A builder to create a Jack-specific ProcessInfoBuilder
*/
public class JackProcessBuilder extends ProcessEnvBuilder {
static final FullRevision JACK_MIN_REV = new FullRevision(21, 1, 0);
private boolean mDebugLog = false;
private boolean mVerbose = false;
private String mClasspath = null;
private File mDexOutputFolder = null;
private File mJackOutputFile = null;
private List mImportFiles = null;
private List mProguardFiles = null;
private String mJavaMaxHeapSize = null;
private File mMappingFile = null;
private boolean mMultiDex = false;
private int mMinSdkVersion = 21;
private File mEcjOptionFile = null;
public JackProcessBuilder() {
}
@NonNull
public JackProcessBuilder setDebugLog(boolean debugLog) {
mDebugLog = debugLog;
return this;
}
@NonNull
public JackProcessBuilder setVerbose(boolean verbose) {
mVerbose = verbose;
return this;
}
@NonNull
public JackProcessBuilder setJavaMaxHeapSize(String javaMaxHeapSize) {
mJavaMaxHeapSize = javaMaxHeapSize;
return this;
}
@NonNull
public JackProcessBuilder setClasspath(String classpath) {
mClasspath = classpath;
return this;
}
@NonNull
public JackProcessBuilder setDexOutputFolder(File dexOutputFolder) {
mDexOutputFolder = dexOutputFolder;
return this;
}
@NonNull
public JackProcessBuilder setJackOutputFile(File jackOutputFile) {
mJackOutputFile = jackOutputFile;
return this;
}
@NonNull
public JackProcessBuilder addImportFiles(@NonNull Collection importFiles) {
if (mImportFiles == null) {
mImportFiles = Lists.newArrayListWithExpectedSize(importFiles.size());
}
mImportFiles.addAll(importFiles);
return this;
}
@NonNull
public JackProcessBuilder addProguardFiles(@NonNull Collection proguardFiles) {
if (mProguardFiles == null) {
mProguardFiles = Lists.newArrayListWithExpectedSize(proguardFiles.size());
}
mProguardFiles.addAll(proguardFiles);
return this;
}
@NonNull
public JackProcessBuilder setMappingFile(File mappingFile) {
mMappingFile = mappingFile;
return this;
}
@NonNull
public JackProcessBuilder setMultiDex(boolean multiDex) {
mMultiDex = multiDex;
return this;
}
@NonNull
public JackProcessBuilder setMinSdkVersion(int minSdkVersion) {
mMinSdkVersion = minSdkVersion;
return this;
}
@NonNull
public JackProcessBuilder setEcjOptionFile(File ecjOptionFile) {
mEcjOptionFile = ecjOptionFile;
return this;
}
@NonNull
public JavaProcessInfo build(@NonNull BuildToolInfo buildToolInfo) throws ProcessException {
FullRevision revision = buildToolInfo.getRevision();
if (revision.compareTo(JACK_MIN_REV) < 0) {
throw new ProcessException(
"Jack requires Build Tools " + JACK_MIN_REV.toString() +
" or later");
}
ProcessInfoBuilder builder = new ProcessInfoBuilder();
builder.addEnvironments(mEnvironment);
String jackJar = buildToolInfo.getPath(BuildToolInfo.PathId.JACK);
if (jackJar == null || !new File(jackJar).isFile()) {
throw new IllegalStateException("jack.jar is missing");
}
builder.setClasspath(jackJar);
builder.setMain("com.android.jack.Main");
if (mJavaMaxHeapSize != null) {
builder.addJvmArg("-Xmx" + mJavaMaxHeapSize);
} else {
builder.addJvmArg("-Xmx1024M");
}
if (mDebugLog) {
builder.addArgs("--verbose", "debug");
} else if (mVerbose) {
builder.addArgs("--verbose", "info");
}
builder.addArgs("--classpath", mClasspath);
if (mImportFiles != null) {
for (File lib : mImportFiles) {
builder.addArgs("--import", lib.getAbsolutePath());
}
}
builder.addArgs("--output-dex", mDexOutputFolder.getAbsolutePath());
builder.addArgs("--output-jack", mJackOutputFile.getAbsolutePath());
builder.addArgs("-D", "jack.import.resource.policy=keep-first");
builder.addArgs("-D", "jack.reporter=sdk");
if (mProguardFiles != null && !mProguardFiles.isEmpty()) {
for (File file : mProguardFiles) {
builder.addArgs("--config-proguard", file.getAbsolutePath());
}
}
if (mMappingFile != null) {
builder.addArgs("-D", "jack.obfuscation.mapping.dump=true");
builder.addArgs("-D", "jack.obfuscation.mapping.dump.file=" + mMappingFile.getAbsolutePath());
}
if (mMultiDex) {
builder.addArgs("--multi-dex");
if (mMinSdkVersion < 21) {
builder.addArgs("legacy");
} else {
builder.addArgs("native");
}
}
builder.addArgs("@" + mEcjOptionFile.getAbsolutePath());
return builder.createJavaProcess();
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy