/* * Copyright (C) 2012 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.dependency; import com.android.annotations.NonNull; import com.android.build.gradle.internal.LoggerWrapper; import com.android.builder.model.SyncIssue; import com.android.utils.ILogger; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.logging.Logging; import java.util.List; import java.util.Map; /** * Checks for dependencies to ensure Android compatibility */ public class DependencyChecker { @NonNull private static final ILogger logger = new LoggerWrapper(Logging.getLogger(DependencyChecker.class)); @NonNull private final VariantDependencies configurationDependencies; private final boolean skipLibrariesInThePlatform; /** * Contains API levels obtained from dependencies on the legacy com.google.android:android * artifact. Keys are specific versions of the artifact, values are the corresponding API * levels. */ @NonNull private final Map<ModuleVersionIdentifier, Integer> legacyApiLevels = Maps.newHashMap(); private final List<SyncIssue> syncIssues = Lists.newArrayList(); public DependencyChecker( @NonNull VariantDependencies configurationDependencies, boolean skipLibrariesInThePlatform) { this.configurationDependencies = configurationDependencies; this.skipLibrariesInThePlatform = skipLibrariesInThePlatform; } @NonNull public Map<ModuleVersionIdentifier, Integer> getLegacyApiLevels() { return legacyApiLevels; } @NonNull public VariantDependencies getConfigurationDependencies() { return configurationDependencies; } public void addSyncIssue(SyncIssue syncIssue) { if (syncIssue != null) { syncIssues.add(syncIssue); } } @NonNull public List<SyncIssue> getSyncIssues() { return syncIssues; } public boolean excluded(ModuleVersionIdentifier id) { String group = id.getGroup(); String name = id.getName(); String version = id.getVersion(); if ("com.google.android".equals(group) && "android".equals(name)) { int moduleLevel = getApiLevelFromMavenArtifact(version); legacyApiLevels.put(id, moduleLevel); logger.info("Ignoring Android API artifact %s for %s", id, configurationDependencies.getName()); return true; } if (!skipLibrariesInThePlatform) { return false; } if (("org.apache.httpcomponents".equals(group) && "httpclient".equals(name)) || ("xpp3".equals(group) && name.equals("xpp3")) || ("commons-logging".equals(group) && "commons-logging".equals(name)) || ("xerces".equals(group) && "xmlParserAPIs".equals(name))) { logger.warning( "WARNING: Dependency %s is ignored for %s as it may be conflicting with the internal version provided by Android.\n" + " In case of problem, please repackage it with jarjar to change the class packages", id, configurationDependencies.getName()); return true; } if ("org.json".equals(group) && "json".equals(name)) { logger.warning( "WARNING: Dependency %s is ignored for %s as it may be conflicting with the internal version provided by Android.\n" + " In case of problem, please repackage with jarjar to change the class packages", id, configurationDependencies.getName()); return true; } if ("org.khronos".equals(group) && "opengl-api".equals(name)) { logger.warning( "WARNING: Dependency %s is ignored for %s as it may be conflicting with the internal version provided by Android.\n" + " In case of problem, please repackage with jarjar to change the class packages", id, configurationDependencies.getName()); return true; } return false; } private static int getApiLevelFromMavenArtifact(@NonNull String version) { if ("1.5_r3".equals(version) || "1.5_r4".equals(version)) { return 3; } else if ("1.6_r2".equals(version)) { return 4; } else if ("2.1_r1".equals(version) || version.equals("2.1.2")) { return 7; } else if ("2.2.1".equals(version)) { return 8; } else if ("2.3.1".equals(version)) { return 9; } else if ("2.3.3".equals(version)) { return 10; } else if ("4.0.1.2".equals(version)) { return 14; } else if ("4.1.1.4".equals(version)) { return 15; } return -1; } }