Android: Make Bundle Qt Deployment the default deployment method.

Debug Deployment broke with Android 5. Also show Android 5 devices
as incompatible in the device dialog if we are using debug deployment.

Task-number: QTCREATORBUG-13419
Change-Id: Ic321cfa46eb724f87f338af9c4b50face06c7c06
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
Reviewed-by: BogDan Vatra <bogdan@kde.org>
Reviewed-by: Daniel Teske <daniel.teske@theqtcompany.com>
This commit is contained in:
Daniel Teske
2014-11-17 16:22:28 +01:00
parent 613af9dca4
commit 697b2074d3
8 changed files with 36 additions and 28 deletions

View File

@@ -72,10 +72,8 @@ AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent,
m_buildTargetSdk(AndroidConfig::apiLevelNameFor(AndroidConfigurations::currentConfig().highestAndroidSdk())) m_buildTargetSdk(AndroidConfig::apiLevelNameFor(AndroidConfigurations::currentConfig().highestAndroidSdk()))
{ {
const QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); const QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit());
if (version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0)) { if (version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0))
m_deployAction = DebugDeployment;
m_useGradle = AndroidConfigurations::currentConfig().useGrandle(); m_useGradle = AndroidConfigurations::currentConfig().useGrandle();
}
//: AndroidBuildApkStep default display name //: AndroidBuildApkStep default display name
setDefaultDisplayName(tr("Build Android APK")); setDefaultDisplayName(tr("Build Android APK"));
} }
@@ -159,12 +157,7 @@ void AndroidBuildApkStep::processFinished(int exitCode, QProcess::ExitStatus sta
bool AndroidBuildApkStep::fromMap(const QVariantMap &map) bool AndroidBuildApkStep::fromMap(const QVariantMap &map)
{ {
AndroidDeployAction defaultDeploy = BundleLibrariesDeployment; m_deployAction = AndroidDeployAction(map.value(DeployActionKey, BundleLibrariesDeployment).toInt());
const QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit());
if (version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0))
defaultDeploy = DebugDeployment;
m_deployAction = AndroidDeployAction(map.value(DeployActionKey, defaultDeploy).toInt());
if ( m_deployAction == DebugDeployment if ( m_deployAction == DebugDeployment
&& QtSupport::QtKitInformation::qtVersion(target()->kit())->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0)) { && QtSupport::QtKitInformation::qtVersion(target()->kit())->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0)) {
m_deployAction = BundleLibrariesDeployment; m_deployAction = BundleLibrariesDeployment;

View File

@@ -139,6 +139,9 @@
<property name="pixmap"> <property name="pixmap">
<pixmap resource="../coreplugin/core.qrc">:/core/images/error.png</pixmap> <pixmap resource="../coreplugin/core.qrc">:/core/images/error.png</pixmap>
</property> </property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@@ -150,7 +153,8 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text"> <property name="text">
<string>Signing an APK that uses &quot;Deploy local Qt libraries&quot; is not allowed</string> <string>Signing an APK that uses &quot;Deploy local Qt libraries&quot; is not allowed.
Deploying local Qt libraries is incompatible with Android 5</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@@ -989,7 +989,9 @@ void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs)
emit m_instance->updated(); emit m_instance->updated();
} }
AndroidDeviceInfo AndroidConfigurations::showDeviceDialog(ProjectExplorer::Project *project, int apiLevel, const QString &abi) AndroidDeviceInfo AndroidConfigurations::showDeviceDialog(ProjectExplorer::Project *project,
int apiLevel, const QString &abi,
Options options)
{ {
QString serialNumber = defaultDevice(project, abi); QString serialNumber = defaultDevice(project, abi);
if (!serialNumber.isEmpty()) { if (!serialNumber.isEmpty()) {
@@ -1005,7 +1007,7 @@ AndroidDeviceInfo AndroidConfigurations::showDeviceDialog(ProjectExplorer::Proje
return info; return info;
} }
AndroidDeviceDialog dialog(apiLevel, abi, Core::ICore::mainWindow()); AndroidDeviceDialog dialog(apiLevel, abi, options, Core::ICore::mainWindow());
if (dialog.exec() == QDialog::Accepted) { if (dialog.exec() == QDialog::Accepted) {
AndroidDeviceInfo info = dialog.device(); AndroidDeviceInfo info = dialog.device();
if (dialog.saveDeviceSelection()) { if (dialog.saveDeviceSelection()) {

View File

@@ -208,7 +208,8 @@ public:
static AndroidConfigurations *instance(); static AndroidConfigurations *instance();
static void updateAndroidDevice(); static void updateAndroidDevice();
static AndroidDeviceInfo showDeviceDialog(ProjectExplorer::Project *project, int apiLevel, const QString &abi); enum Options { None, FilterAndroid5 };
static AndroidDeviceInfo showDeviceDialog(ProjectExplorer::Project *project, int apiLevel, const QString &abi, Options options);
static void setDefaultDevice(ProjectExplorer::Project *project, const QString &abi, const QString &serialNumber); // serial number or avd name static void setDefaultDevice(ProjectExplorer::Project *project, const QString &abi, const QString &serialNumber); // serial number or avd name
static QString defaultDevice(ProjectExplorer::Project *project, const QString &abi); // serial number or avd name static QString defaultDevice(ProjectExplorer::Project *project, const QString &abi); // serial number or avd name
public slots: public slots:

View File

@@ -176,8 +176,19 @@ bool AndroidDeployQtStep::init()
emit addOutput(tr("No Android arch set by the .pro file."), ErrorOutput); emit addOutput(tr("No Android arch set by the .pro file."), ErrorOutput);
return false; return false;
} }
AndroidBuildApkStep *androidBuildApkStep
= AndroidGlobal::buildStep<AndroidBuildApkStep>(target()->activeBuildConfiguration());
if (!androidBuildApkStep) {
emit addOutput(tr("Cannot find the android build step."), ErrorOutput);
return false;
}
m_deviceAPILevel = AndroidManager::minimumSDK(target()); m_deviceAPILevel = AndroidManager::minimumSDK(target());
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(project(), m_deviceAPILevel, m_targetArch); AndroidConfigurations::Options options = AndroidConfigurations::None;
if (androidBuildApkStep->deployAction() == AndroidBuildApkStep::DebugDeployment)
options = AndroidConfigurations::FilterAndroid5;
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(project(), m_deviceAPILevel, m_targetArch, options);
if (info.serialNumber.isEmpty()) // aborted if (info.serialNumber.isEmpty()) // aborted
return false; return false;
@@ -205,12 +216,6 @@ bool AndroidDeployQtStep::init()
ProjectExplorer::ProcessParameters *pp = processParameters(); ProjectExplorer::ProcessParameters *pp = processParameters();
m_useAndroiddeployqt = version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0); m_useAndroiddeployqt = version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0);
if (m_useAndroiddeployqt) { if (m_useAndroiddeployqt) {
AndroidBuildApkStep *androidBuildApkStep
= AndroidGlobal::buildStep<AndroidBuildApkStep>(target()->activeBuildConfiguration());
if (!androidBuildApkStep) {
emit addOutput(tr("Cannot find the android build step."), ErrorOutput);
return false;
}
Utils::FileName tmp = AndroidManager::androidQtSupport(target())->androiddeployqtPath(target()); Utils::FileName tmp = AndroidManager::androidQtSupport(target())->androiddeployqtPath(target());
if (tmp.isEmpty()) { if (tmp.isEmpty()) {
emit addOutput(tr("Cannot find the androiddeployqt tool."), ErrorOutput); emit addOutput(tr("Cannot find the androiddeployqt tool."), ErrorOutput);

View File

@@ -213,7 +213,7 @@ public:
class AndroidDeviceModel : public QAbstractItemModel class AndroidDeviceModel : public QAbstractItemModel
{ {
public: public:
AndroidDeviceModel(int apiLevel, const QString &abi); AndroidDeviceModel(int apiLevel, const QString &abi, AndroidConfigurations::Options options);
QModelIndex index(int row, int column, QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const; const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &child) const; QModelIndex parent(const QModelIndex &child) const;
@@ -229,6 +229,7 @@ public:
private: private:
int m_apiLevel; int m_apiLevel;
QString m_abi; QString m_abi;
AndroidConfigurations::Options m_options;
AndroidDeviceModelNode *m_root; AndroidDeviceModelNode *m_root;
}; };
@@ -237,8 +238,8 @@ private:
///////////////// /////////////////
// AndroidDeviceModel // AndroidDeviceModel
///////////////// /////////////////
AndroidDeviceModel::AndroidDeviceModel(int apiLevel, const QString &abi) AndroidDeviceModel::AndroidDeviceModel(int apiLevel, const QString &abi, AndroidConfigurations::Options options)
: m_apiLevel(apiLevel), m_abi(abi), m_root(0) : m_apiLevel(apiLevel), m_abi(abi), m_options(options), m_root(0)
{ {
} }
@@ -347,6 +348,8 @@ void AndroidDeviceModel::setDevices(const QVector<AndroidDeviceInfo> &devices)
} else if (device.sdk < m_apiLevel) { } else if (device.sdk < m_apiLevel) {
error = AndroidDeviceDialog::tr("API Level of device is: %1.") error = AndroidDeviceDialog::tr("API Level of device is: %1.")
.arg(device.sdk); .arg(device.sdk);
} else if (device.sdk > 20 && (m_options & AndroidConfigurations::FilterAndroid5)) {
error = AndroidDeviceDialog::tr("Android 5 devices are incompatible with deploying Qt to a temporary directory.");
} else { } else {
new AndroidDeviceModelNode(compatibleDevices, device); new AndroidDeviceModelNode(compatibleDevices, device);
continue; continue;
@@ -386,9 +389,9 @@ static inline QString msgAdbListDevices()
return AndroidDeviceDialog::tr("<p>The adb tool in the Android SDK lists all connected devices if run via &quot;adb devices&quot;.</p>"); return AndroidDeviceDialog::tr("<p>The adb tool in the Android SDK lists all connected devices if run via &quot;adb devices&quot;.</p>");
} }
AndroidDeviceDialog::AndroidDeviceDialog(int apiLevel, const QString &abi, QWidget *parent) : AndroidDeviceDialog::AndroidDeviceDialog(int apiLevel, const QString &abi, AndroidConfigurations::Options options, QWidget *parent) :
QDialog(parent), QDialog(parent),
m_model(new AndroidDeviceModel(apiLevel, abi)), m_model(new AndroidDeviceModel(apiLevel, abi, options)),
m_ui(new Ui::AndroidDeviceDialog), m_ui(new Ui::AndroidDeviceDialog),
m_apiLevel(apiLevel), m_apiLevel(apiLevel),
m_abi(abi) m_abi(abi)

View File

@@ -52,7 +52,7 @@ class AndroidDeviceDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit AndroidDeviceDialog(int apiLevel, const QString &abi, QWidget *parent = 0); explicit AndroidDeviceDialog(int apiLevel, const QString &abi, AndroidConfigurations::Options opts, QWidget *parent = 0);
~AndroidDeviceDialog(); ~AndroidDeviceDialog();
AndroidDeviceInfo device(); AndroidDeviceInfo device();

View File

@@ -479,7 +479,7 @@ void AndroidManager::cleanLibsOnDevice(ProjectExplorer::Target *target)
if (targetArch.isEmpty()) if (targetArch.isEmpty())
return; return;
int deviceAPILevel = AndroidManager::minimumSDK(target); int deviceAPILevel = AndroidManager::minimumSDK(target);
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch); AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch, AndroidConfigurations::None);
if (info.serialNumber.isEmpty()) // aborted if (info.serialNumber.isEmpty()) // aborted
return; return;
@@ -509,7 +509,7 @@ void AndroidManager::installQASIPackage(ProjectExplorer::Target *target, const Q
if (targetArch.isEmpty()) if (targetArch.isEmpty())
return; return;
int deviceAPILevel = AndroidManager::minimumSDK(target); int deviceAPILevel = AndroidManager::minimumSDK(target);
AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch); AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(target->project(), deviceAPILevel, targetArch, AndroidConfigurations::None);
if (info.serialNumber.isEmpty()) // aborted if (info.serialNumber.isEmpty()) // aborted
return; return;