diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 0b697fead2b..f72f707bf3a 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -119,6 +119,13 @@ bool AndroidBuildApkStep::init(QList &earlierSteps) if (!version) return false; + int minSDKForKit = AndroidManager::minimumSDK(target()->kit()); + if (AndroidManager::minimumSDK(target()) < minSDKForKit) { + emit addOutput(tr("The API level set for the APK is less than the minimum required by the kit." + "\nThe minimum API level required by the kit is %1.").arg(minSDKForKit), ErrorOutput); + return false; + } + JavaParser *parser = new JavaParser; parser->setProjectFileList(target()->project()->files(ProjectExplorer::Project::AllFiles)); parser->setSourceDirectory(androidPackageSourceDir()); diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 1ae0ba86e0f..3e3d5666ead 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -85,6 +85,7 @@ typedef QMap LibrariesMap; static bool openXmlFile(QDomDocument &doc, const Utils::FileName &fileName); static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc); +static int parseMinSdk(const QDomElement &manifestElem); bool AndroidManager::supportsAndroid(const ProjectExplorer::Kit *kit) { @@ -129,22 +130,37 @@ QString AndroidManager::activityName(ProjectExplorer::Target *target) return activityElem.attribute(QLatin1String("android:name")); } +/*! + Returns the minimum Android API level set for the APK. Minimum API level + of the kit is returned if the manifest file of the APK can not be found + or parsed. +*/ int AndroidManager::minimumSDK(ProjectExplorer::Target *target) { QDomDocument doc; if (!openXmlFile(doc, AndroidManager::manifestSourcePath(target))) - return 0; - QDomElement manifestElem = doc.documentElement(); - QDomElement usesSdk = manifestElem.firstChildElement(QLatin1String("uses-sdk")); - if (usesSdk.isNull()) - return 0; - if (usesSdk.hasAttribute(QLatin1String("android:minSdkVersion"))) { - bool ok; - int tmp = usesSdk.attribute(QLatin1String("android:minSdkVersion")).toInt(&ok); - if (ok) - return tmp; + return minimumSDK(target->kit()); + return parseMinSdk(doc.documentElement()); +} + +/*! + Returns the minimum Android API level required by the kit to compile. -1 is + returned if the kit does not support Android. +*/ +int AndroidManager::minimumSDK(const ProjectExplorer::Kit *kit) +{ + int minSDKVersion = -1; + if (supportsAndroid(kit)) { + QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(kit); + Utils::FileName stockManifestFilePath = + Utils::FileName::fromUserInput(version->qmakeProperty("QT_INSTALL_PREFIX") + + QLatin1String("/src/android/templates/AndroidManifest.xml")); + QDomDocument doc; + if (openXmlFile(doc, stockManifestFilePath)) { + minSDKVersion = parseMinSdk(doc.documentElement()); + } } - return 0; + return minSDKVersion; } QString AndroidManager::buildTargetSDK(ProjectExplorer::Target *target) @@ -295,6 +311,20 @@ static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc) return openXmlFile(doc, AndroidManager::manifestPath(target)); } +static int parseMinSdk(const QDomElement &manifestElem) +{ + QDomElement usesSdk = manifestElem.firstChildElement(QLatin1String("uses-sdk")); + if (usesSdk.isNull()) + return 0; + if (usesSdk.hasAttribute(QLatin1String("android:minSdkVersion"))) { + bool ok; + int tmp = usesSdk.attribute(QLatin1String("android:minSdkVersion")).toInt(&ok); + if (ok) + return tmp; + } + return 0; +} + void AndroidManager::cleanLibsOnDevice(ProjectExplorer::Target *target) { const QString targetArch = AndroidManager::targetArch(target); diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h index 344a4330de5..2bb2f51c26d 100644 --- a/src/plugins/android/androidmanager.h +++ b/src/plugins/android/androidmanager.h @@ -66,6 +66,7 @@ public: static bool signPackage(ProjectExplorer::Target *target); static int minimumSDK(ProjectExplorer::Target *target); + static int minimumSDK(const ProjectExplorer::Kit *kit); static QString targetArch(ProjectExplorer::Target *target);