blob: c484d55b805a3db80d97e7235354866445a328cf [file] [log] [blame]
/*
* Copyright (C) 2014 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.sdk;
import static com.android.SdkConstants.FN_AAPT;
import static com.android.SdkConstants.FN_AIDL;
import static com.android.SdkConstants.FN_BCC_COMPAT;
import static com.android.SdkConstants.FN_RENDERSCRIPT;
import static com.android.SdkConstants.FN_ZIPALIGN;
import com.android.SdkConstants;
import com.android.annotations.NonNull;
import com.android.builder.internal.FakeAndroidTarget;
import com.android.sdklib.BuildToolInfo;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.repository.FullRevision;
import com.android.utils.ILogger;
import com.google.common.collect.ImmutableList;
import java.io.File;
/**
* Singleton-based implementation of SdkLoader for a platform-based SDK.
*
* Platform-based SDK are in the Android source tree in AOSP, using a different
* folder layout for all the files.
*/
public class PlatformLoader implements SdkLoader {
private static PlatformLoader sLoader;
@NonNull
private final File mTreeLocation;
private File mHostToolsFolder;
private SdkInfo mSdkInfo;
@NonNull
private final ImmutableList<File> mRepositories;
public static synchronized SdkLoader getLoader(
@NonNull File treeLocation) {
if (sLoader != null && !treeLocation.equals(sLoader.mTreeLocation)) {
throw new IllegalStateException("Already created an SDK Loader with different SDK Path");
}
return sLoader = new PlatformLoader(treeLocation);
}
public static synchronized void unload() {
sLoader = null;
}
@NonNull
@Override
public TargetInfo getTargetInfo(@NonNull String targetHash,
@NonNull FullRevision buildToolRevision, @NonNull ILogger logger) {
init(logger);
IAndroidTarget androidTarget = new FakeAndroidTarget(mTreeLocation.getPath(), targetHash);
File hostTools = getHostToolsFolder();
BuildToolInfo buildToolInfo = new BuildToolInfo(
buildToolRevision,
mTreeLocation,
new File(hostTools, FN_AAPT),
new File(hostTools, FN_AIDL),
new File(mTreeLocation, "prebuilts/sdk/tools/dx"),
new File(mTreeLocation, "prebuilts/sdk/tools/lib/dx.jar"),
new File(hostTools, FN_RENDERSCRIPT),
new File(mTreeLocation, "prebuilts/sdk/renderscript/include"),
new File(mTreeLocation, "prebuilts/sdk/renderscript/clang-include"),
new File(hostTools, FN_BCC_COMPAT),
new File(hostTools, "arm-linux-androideabi-ld"),
new File(hostTools, "i686-linux-android-ld"),
new File(hostTools, "mipsel-linux-android-ld"),
new File(hostTools, FN_ZIPALIGN));
return new TargetInfo(androidTarget, buildToolInfo);
}
@NonNull
@Override
public SdkInfo getSdkInfo(@NonNull ILogger logger) {
init(logger);
return mSdkInfo;
}
@Override
@NonNull
public ImmutableList<File> getRepositories() {
return mRepositories;
}
private PlatformLoader(@NonNull File treeLocation) {
mTreeLocation = treeLocation;
mRepositories = ImmutableList.of(new File(mTreeLocation + "/prebuilts/sdk/m2repository"));
}
private synchronized void init(@NonNull ILogger logger) {
if (mSdkInfo == null) {
String host;
if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) {
host = "darwin-x86";
} else if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_LINUX) {
host = "linux";
} else {
throw new IllegalStateException(
"Windows is not supported for platform development");
}
mSdkInfo = new SdkInfo(
new File(mTreeLocation, "out/host/" + host + "/framework/annotations.jar"),
new File(mTreeLocation, "out/host/" + host + "/bin/adb"));
}
}
@NonNull
private synchronized File getHostToolsFolder() {
if (mHostToolsFolder == null) {
File tools = new File(mTreeLocation, "prebuilts/sdk/tools");
if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) {
mHostToolsFolder = new File(tools, "darwin");
} else if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_LINUX) {
mHostToolsFolder = new File(tools, "linux");
} else {
throw new IllegalStateException(
"Windows is not supported for platform development");
}
if (!mHostToolsFolder.isDirectory()) {
throw new IllegalStateException("Host tools folder missing: " +
mHostToolsFolder.getAbsolutePath());
}
}
return mHostToolsFolder;
}
}