Add warning on mismatch minSdkVersion.
This is for both Ant and ADT. For Ant, also added a check for non-integer values when the platform is not a preview. BUG:2118374 Change-Id: Ic8ec533d66a31d9e4b51c9c38b5eaab97bca7414
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.ant;
|
package com.android.ant;
|
||||||
|
|
||||||
|
import com.android.sdklib.AndroidVersion;
|
||||||
import com.android.sdklib.IAndroidTarget;
|
import com.android.sdklib.IAndroidTarget;
|
||||||
import com.android.sdklib.ISdkLog;
|
import com.android.sdklib.ISdkLog;
|
||||||
import com.android.sdklib.SdkManager;
|
import com.android.sdklib.SdkManager;
|
||||||
@@ -160,11 +161,8 @@ public final class SetupTask extends ImportTask {
|
|||||||
}
|
}
|
||||||
System.out.println("API level: " + androidTarget.getVersion().getApiString());
|
System.out.println("API level: " + androidTarget.getVersion().getApiString());
|
||||||
|
|
||||||
// if needed check the manifest so that it matches the target
|
// always check the manifest minSdkVersion.
|
||||||
if (androidTarget.getVersion().isPreview()) {
|
checkManifest(antProject, androidTarget.getVersion());
|
||||||
// for preview, the manifest minSdkVersion node *must* match the target codename
|
|
||||||
checkManifest(antProject, androidTarget.getVersion().getCodename());
|
|
||||||
}
|
|
||||||
|
|
||||||
// sets up the properties to find android.jar/framework.aidl/target tools
|
// sets up the properties to find android.jar/framework.aidl/target tools
|
||||||
String androidJar = androidTarget.getPath(IAndroidTarget.ANDROID_JAR);
|
String androidJar = androidTarget.getPath(IAndroidTarget.ANDROID_JAR);
|
||||||
@@ -255,7 +253,12 @@ public final class SetupTask extends ImportTask {
|
|||||||
mDoImport = value;
|
mDoImport = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkManifest(Project antProject, String codename) {
|
/**
|
||||||
|
* Checks the manifest <code>minSdkVersion</code> attribute.
|
||||||
|
* @param antProject the ant project
|
||||||
|
* @param androidVersion the version of the platform the project is compiling against.
|
||||||
|
*/
|
||||||
|
private void checkManifest(Project antProject, AndroidVersion androidVersion) {
|
||||||
try {
|
try {
|
||||||
File manifest = new File(antProject.getBaseDir(), "AndroidManifest.xml");
|
File manifest = new File(antProject.getBaseDir(), "AndroidManifest.xml");
|
||||||
|
|
||||||
@@ -267,10 +270,47 @@ public final class SetupTask extends ImportTask {
|
|||||||
ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION,
|
ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION,
|
||||||
new InputSource(new FileInputStream(manifest)));
|
new InputSource(new FileInputStream(manifest)));
|
||||||
|
|
||||||
if (codename.equals(value) == false) {
|
if (androidVersion.isPreview()) {
|
||||||
throw new BuildException(String.format("For '%1$s' SDK Preview, application manifest must declare minSdkVersion to '%1$s'",
|
// in preview mode, the content of the minSdkVersion must match exactly the
|
||||||
codename));
|
// platform codename.
|
||||||
|
String codeName = androidVersion.getCodename();
|
||||||
|
if (codeName.equals(value) == false) {
|
||||||
|
throw new BuildException(String.format(
|
||||||
|
"For '%1$s' SDK Preview, attribute minSdkVersion in AndroidManifest.xml must be '%1$s'",
|
||||||
|
codeName));
|
||||||
|
}
|
||||||
|
} else if (value.length() > 0) {
|
||||||
|
// for normal platform, we'll only display warnings if the value is lower or higher
|
||||||
|
// than the target api level.
|
||||||
|
// First convert to an int.
|
||||||
|
int minSdkValue = -1;
|
||||||
|
try {
|
||||||
|
minSdkValue = Integer.parseInt(value);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// looks like it's not a number: error!
|
||||||
|
throw new BuildException(String.format(
|
||||||
|
"Attribute %1$s in AndroidManifest.xml must be an Integer!",
|
||||||
|
ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION));
|
||||||
|
}
|
||||||
|
|
||||||
|
int projectApiLevel = androidVersion.getApiLevel();
|
||||||
|
if (minSdkValue < projectApiLevel) {
|
||||||
|
System.out.println(String.format(
|
||||||
|
"WARNING: Attribute %1$s in AndroidManifest.xml (%2$d) is lower than the project target API level (%3$d)",
|
||||||
|
ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION,
|
||||||
|
minSdkValue, projectApiLevel));
|
||||||
|
} else if (minSdkValue > androidVersion.getApiLevel()) {
|
||||||
|
System.out.println(String.format(
|
||||||
|
"WARNING: Attribute %1$s in AndroidManifest.xml (%2$d) is higher than the project target API level (%3$d)",
|
||||||
|
ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION,
|
||||||
|
minSdkValue, projectApiLevel));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no minSdkVersion? display a warning
|
||||||
|
System.out.println(
|
||||||
|
"WARNING: No minSdkVersion value set. Application will install on all Android versions.");
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (XPathExpressionException e) {
|
} catch (XPathExpressionException e) {
|
||||||
throw new BuildException(e);
|
throw new BuildException(e);
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
|
|||||||
@@ -335,7 +335,7 @@ public class PreCompilerBuilder extends BaseBuilder {
|
|||||||
if (codename != null) {
|
if (codename != null) {
|
||||||
// integer minSdk when the target is a preview => fatal error
|
// integer minSdk when the target is a preview => fatal error
|
||||||
String msg = String.format(
|
String msg = String.format(
|
||||||
"Platform %1$s is a preview and requires appication manifests to set %2$s to '%1$s'",
|
"Platform %1$s is a preview and requires appication manifest to set %2$s to '%1$s'",
|
||||||
codename, ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION);
|
codename, ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION);
|
||||||
AdtPlugin.printErrorToConsole(project, msg);
|
AdtPlugin.printErrorToConsole(project, msg);
|
||||||
BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
|
BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
|
||||||
@@ -344,8 +344,18 @@ public class PreCompilerBuilder extends BaseBuilder {
|
|||||||
} else if (minSdkValue < projectVersion.getApiLevel()) {
|
} else if (minSdkValue < projectVersion.getApiLevel()) {
|
||||||
// integer minSdk is not high enough for the target => warning
|
// integer minSdk is not high enough for the target => warning
|
||||||
String msg = String.format(
|
String msg = String.format(
|
||||||
"Manifest min SDK version (%1$s) is lower than project target API level (%2$d)",
|
"Attribute %1$s (%2$d) is lower than the project target API level (%3$d)",
|
||||||
minSdkVersion, projectVersion.getApiLevel());
|
ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION,
|
||||||
|
minSdkValue, projectVersion.getApiLevel());
|
||||||
|
AdtPlugin.printBuildToConsole(AdtConstants.BUILD_VERBOSE, project, msg);
|
||||||
|
BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
|
||||||
|
IMarker.SEVERITY_WARNING);
|
||||||
|
} else if (minSdkValue > projectVersion.getApiLevel()) {
|
||||||
|
// integer minSdk is too high for the target => warning
|
||||||
|
String msg = String.format(
|
||||||
|
"Attribute %1$s (%2$d) is higher than the project target API level (%3$d)",
|
||||||
|
ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION,
|
||||||
|
minSdkValue, projectVersion.getApiLevel());
|
||||||
AdtPlugin.printBuildToConsole(AdtConstants.BUILD_VERBOSE, project, msg);
|
AdtPlugin.printBuildToConsole(AdtConstants.BUILD_VERBOSE, project, msg);
|
||||||
BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
|
BaseProjectHelper.addMarker(manifest, AdtConstants.MARKER_ADT, msg,
|
||||||
IMarker.SEVERITY_WARNING);
|
IMarker.SEVERITY_WARNING);
|
||||||
|
|||||||
Reference in New Issue
Block a user