f727999ed9c5a1fa8c07d5eb526ddf408ab2abbd
[android/platform/tools/build.git] / gradle / src / main / groovy / com / android / build / gradle / DependencyChecker.groovy
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.build.gradle
17
18 import com.android.build.gradle.internal.ApplicationVariant
19 import com.android.utils.ILogger
20 import org.gradle.api.artifacts.ModuleVersionIdentifier
21
22 /**
23  * Checks for dependencies to ensure Android compatibility
24  */
25 class DependencyChecker {
26
27     final ApplicationVariant variant
28     final logger
29     final int minSdkVersion
30
31     DependencyChecker(ApplicationVariant variant, ILogger logger) {
32         this.variant = variant
33         this.logger = logger;
34         this.minSdkVersion = variant.config.getMinSdkVersion()
35     }
36
37     private boolean excluded(ModuleVersionIdentifier id) {
38         if (id.group == 'com.google.android' && id.name == 'android') {
39             int moduleLevel = getApiLevelFromMavenArtifact(id.version)
40
41             if (minSdkVersion < moduleLevel) {
42                 throw new RuntimeException(String.format(
43                         "ERROR: Android API level %d is in the dependency graph, but minSdkVersion for '%s' is %d",
44                         moduleLevel, variant.name, minSdkVersion))
45             }
46
47             logger.info("Ignoring Android API artifact: " + id)
48             return true
49         }
50
51         if ((id.group == 'org.apache.httpcomponents' && id.name == 'httpclient') ||
52                 (id.group == 'xpp3' && id.name == 'xpp3') ||
53                 (id.group == 'commons-logging' && id.name == 'commons-logging') ||
54                 (id.group == 'xerces' && id.name == 'xmlParserAPIs')) {
55
56             logger.warning(
57                     "WARNING: Dependency %s is ignored as it may be conflicting with the internal version provided by Android.\n" +
58                     "         In case of problem, please repackage with jarjar to change the class packages",
59                     id)
60             return true;
61         }
62
63         if (id.group == 'org.json' && id.name == 'json') {
64             logger.warning(
65                     "WARNING: Dependency %s is ignored as it may be conflicting with the internal version provided by Android.\n" +
66                             "         In case of problem, please repackage with jarjar to change the class packages",
67                     id)
68             return true
69         }
70
71         if (id.group == 'org.khronos' && id.name == 'opengl-api') {
72             logger.warning(
73                     "WARNING: Dependency %s is ignored as it may be conflicting with the internal version provided by Android.\n" +
74                             "         In case of problem, please repackage with jarjar to change the class packages",
75                     id)
76             return true
77         }
78
79         if (id.group == 'org.bouncycastle' && id.name.startsWith("bcprov")) {
80             if (minSdkVersion >= 11) {
81                 // this is when the version of BouncyCastle inside Android was jarjar'ed so this
82                 // is fine
83                 return false;
84             }
85
86             // TODO check which version of BC is used by the platform and the app.
87             throw new RuntimeException(String.format(
88                     "ERROR: Dependency %s is conflicting with the internal version provided by Android. To use, please repackage with jarjar to change the class packages",
89                     id))
90         }
91
92         return false
93     }
94
95
96     private int getApiLevelFromMavenArtifact(String version) {
97         switch (version) {
98             case "1.5_r3":
99             case "1.5_r4":
100                 return 3;
101             case "1.6_r2":
102                 return 4;
103             case "2.1_r1":
104             case "2.1.2":
105                 return 7;
106             case "2.2.1":
107                 return 8;
108             case "2.3.1":
109                 return 9;
110             case "2.3.3":
111                 return 10;
112             case "4.0.1.2":
113                 return 14;
114             case "4.1.1.4":
115                 return 15;
116         }
117     }
118 }