Lint: Remove SdkWrapper and AnroidModelFacade (was needed in Android Studio 1.5)

This commit is contained in:
Yan Zhulanow
2016-10-14 16:49:51 +03:00
committed by Yan Zhulanow
parent 7404b91cb3
commit fee54d9b86
9 changed files with 149 additions and 292 deletions
@@ -37,9 +37,12 @@ import com.android.ide.common.repository.ResourceVisibilityLookup;
import com.android.ide.common.res2.AbstractResourceRepository;
import com.android.ide.common.res2.ResourceItem;
import com.android.prefs.AndroidLocation;
import com.android.repository.api.ProgressIndicator;
import com.android.repository.api.ProgressIndicatorAdapter;
import com.android.sdklib.BuildToolInfo;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.SdkVersionInfo;
import com.android.sdklib.repositoryv2.AndroidSdkHandler;
import com.android.tools.klint.detector.api.Context;
import com.android.tools.klint.detector.api.Detector;
import com.android.tools.klint.detector.api.Issue;
@@ -741,9 +744,12 @@ public abstract class LintClient {
@NonNull
public IAndroidTarget[] getTargets() {
if (mTargets == null) {
SdkWrapper localSdk = getSdk();
if (localSdk != null) {
mTargets = localSdk.getTargets();
AndroidSdkHandler sdkHandler = getSdk();
if (sdkHandler != null) {
ProgressIndicator logger = getRepositoryLogger();
Collection<IAndroidTarget> targets = sdkHandler.getAndroidTargetManager(logger)
.getTargets(logger);
mTargets = targets.toArray(new IAndroidTarget[targets.size()]);
} else {
mTargets = new IAndroidTarget[0];
}
@@ -752,7 +758,7 @@ public abstract class LintClient {
return mTargets;
}
protected SdkWrapper mSdk;
protected AndroidSdkHandler mSdk;
/**
* Returns the SDK installation (used to look up platforms etc)
@@ -760,13 +766,13 @@ public abstract class LintClient {
* @return the SDK if known
*/
@Nullable
public SdkWrapper getSdk() {
if (mSdk == null) {
File sdkHome = getSdkHome();
if (sdkHome != null) {
mSdk = SdkWrapper.createLocalSdk(sdkHome);
}
}
public AndroidSdkHandler getSdk() {
if (mSdk == null) {
File sdkHome = getSdkHome();
if (sdkHome != null) {
mSdk = AndroidSdkHandler.getInstance(sdkHome);
}
}
return mSdk;
}
@@ -1217,4 +1223,33 @@ public abstract class LintClient {
public static boolean isGradle() {
return CLIENT_GRADLE.equals(sClientName);
}
@NonNull
public ProgressIndicator getRepositoryLogger() {
return new LintClient.RepoLogger();
}
private static final class RepoLogger extends ProgressIndicatorAdapter {
// Intentionally not logging these: the SDK manager is
// logging events such as package.xml parsing
// Parsing /path/to/sdk//build-tools/19.1.0/package.xml
// Parsing /path/to/sdk//build-tools/20.0.0/package.xml
// Parsing /path/to/sdk//build-tools/21.0.0/package.xml
// which we don't want to spam on the console.
// It's also warning about packages that it's encountering
// multiple times etc; that's not something we should include
// in lint command line output.
@Override
public void logError(@NonNull String s, @Nullable Throwable e) {
}
@Override
public void logInfo(@NonNull String s) {
}
@Override
public void logWarning(@NonNull String s, @Nullable Throwable e) {
}
}
}
@@ -42,6 +42,7 @@ import com.android.ide.common.res2.ResourceItem;
import com.android.resources.ResourceFolderType;
import com.android.sdklib.BuildToolInfo;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.repositoryv2.AndroidSdkHandler;
import com.android.tools.klint.client.api.LintListener.EventType;
import com.android.tools.klint.detector.api.ClassContext;
import com.android.tools.klint.detector.api.Context;
@@ -2129,7 +2130,7 @@ public class LintDriver {
@Nullable
@Override
public SdkWrapper getSdk() {
public AndroidSdkHandler getSdk() {
return mDelegate.getSdk();
}
@@ -1,104 +0,0 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* 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.tools.klint.client.api
import com.android.sdklib.IAndroidTarget
import java.io.File
class SdkWrapper(val sdk: Any) {
companion object {
val PROGRESS_INDICATOR_CLASS_NAME = "com.android.repository.api.ConsoleProgressIndicator"
@JvmStatic
fun createLocalSdk(file: File): SdkWrapper? {
try {
val clazz = Class.forName("com.android.sdklib.repository.local.LocalSdk")
return SdkWrapper(clazz.getConstructor(File::class.java).newInstance(file))
}
catch (t: Throwable) {
try {
val clazz = Class.forName("com.android.sdklib.repositoryv2.AndroidSdkHandler")
return SdkWrapper(clazz.getMethod("getInstance", File::class.java).invoke(null, file))
}
catch (t2: Throwable) {
return null
}
}
}
}
fun getTargets(): Array<IAndroidTarget>? {
try {
@Suppress("UNCHECKED_CAST")
return sdk.javaClass.getMethod("getTargets").invoke(sdk) as? Array<IAndroidTarget>
} catch (t: Throwable) {
@Suppress("UNCHECKED_CAST")
try {
val targets = sdk.javaClass
.getMethod("getAndroidTargetManager", Class.forName(PROGRESS_INDICATOR_CLASS_NAME))
.invoke(sdk, createProgressIndicator()) as? Collection<IAndroidTarget> ?: return null
return targets.toTypedArray()
}
catch (t2: Throwable) {
return null
}
}
}
fun getPlatformVersion(): String? {
try {
val pkgPlatformTools = Class.forName("com.android.sdklib.repository.descriptors.PkgType")
.getField("PKG_PLATFORM_TOOLS").get(null)
val pkgInfo = sdk.javaClass.declaredMethods
.first { it.name == "getPkgInfo" && it.parameterTypes.size == 1 }
.invoke(sdk, pkgPlatformTools)
if (pkgInfo != null) {
val desc = pkgInfo.javaClass.getMethod("getDesc").invoke(pkgInfo)
val version = desc.javaClass.getMethod("getFullRevision").invoke(desc)
if (version != null) {
return version.javaClass.getMethod("toShortString").invoke(version) as? String
}
}
else {
return null
}
} catch (t: Throwable) {
try {
val pkgPlatformTools = Class.forName("com.android.SdkConstants")
.getField("FD_PLATFORM_TOOLS").get(null)
val pkgInfo = sdk.javaClass.declaredMethods
.first { it.name == "getLocalPackage" && it.parameterTypes.size == 2 }
.invoke(sdk, pkgPlatformTools, createProgressIndicator())
if (pkgInfo != null) {
val version = pkgInfo.javaClass.getMethod("getVersion").invoke(pkgInfo)
return version.javaClass.getMethod("toShortString").invoke(version) as? String
}
else {
return null
}
}
catch (ignore: Throwable) {}
}
return null
}
private fun createProgressIndicator(): Any {
return Class.forName(PROGRESS_INDICATOR_CLASS_NAME).newInstance()
}
}
@@ -48,6 +48,7 @@ import com.android.builder.model.AndroidProject;
import com.android.builder.model.ProductFlavor;
import com.android.builder.model.ProductFlavorContainer;
import com.android.builder.model.Variant;
import com.android.ide.common.repository.GradleVersion;
import com.android.ide.common.repository.ResourceVisibilityLookup;
import com.android.resources.Density;
import com.android.resources.ResourceFolderType;
@@ -136,6 +137,7 @@ public class Project {
protected Boolean mGradleProject;
protected Boolean mSupportLib;
protected Boolean mAppCompat;
protected GradleVersion mGradleVersion;
private Map<String, String> mSuperClassMap;
private ResourceVisibilityLookup mResourceVisibility;
private BuildToolInfo mBuildTools;
@@ -190,6 +192,24 @@ public class Project {
public AndroidProject getGradleProjectModel() {
return null;
}
/**
* If this is a Gradle project with a valid Gradle model, return the version
* of the model/plugin.
*
* @return the Gradle plugin version, or null if invalid or not a Gradle project
*/
@Nullable
public GradleVersion getGradleModelVersion() {
if (mGradleVersion == null && isGradleProject()) {
AndroidProject gradleProjectModel = getGradleProjectModel();
if (gradleProjectModel != null) {
mGradleVersion = GradleVersion.tryParse(gradleProjectModel.getModelVersion());
}
}
return mGradleVersion;
}
/**
* Returns the project model for this project if it corresponds to