Android: Re-install Qt live on version mismatch

Use version code to determine the app's version, version
name is only for display

Change-Id: I8e3a8f6b1b8fab2014a762ebabf09b3ce2e0b559
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
This commit is contained in:
Vikas Pachdha
2018-08-07 14:47:08 +02:00
parent 391cfab5d7
commit ca69b8a8a8
3 changed files with 48 additions and 15 deletions

View File

@@ -251,10 +251,27 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy(QFutureInter
QTC_ASSERT(rc, return DeployErrorCode::Failure); QTC_ASSERT(rc, return DeployErrorCode::Failure);
const bool deployQtLive = rc->id().name().startsWith(qmlProjectRunConfigIdName); const bool deployQtLive = rc->id().name().startsWith(qmlProjectRunConfigIdName);
QString packageName; QString packageName;
int packageVersion = -1;
if (deployQtLive) { if (deployQtLive) {
AndroidManager::apkInfo(m_apkPath, &packageName); // Do not install Qt live if apk is already installed or the same version is
if (AndroidManager::packageInstalled(m_serialNumber, packageName)) // being installed.
return DeployErrorCode::NoError; AndroidManager::apkInfo(m_apkPath, &packageName, &packageVersion);
if (AndroidManager::packageInstalled(m_serialNumber, packageName)) {
int installedVersion = AndroidManager::packageVersionCode(m_serialNumber,
packageName);
if (installedVersion == packageVersion) {
qCDebug(deployStepLog) << "Qt live APK already installed. APK version:"
<< packageVersion << "Installed version:"
<< installedVersion;
return DeployErrorCode::NoError;
} else {
qCDebug(deployStepLog) << "Re-installing Qt live APK. Version mismatch."
<< "APK version:" << packageVersion
<< "Installed version:" << installedVersion;
}
} else {
qCDebug(deployStepLog) << "Installing Qt live APK. APK version:" << packageVersion;
}
} }
if (m_uninstallPreviousPackageRun) { if (m_uninstallPreviousPackageRun) {

View File

@@ -70,12 +70,10 @@ namespace {
const QLatin1String AndroidDefaultPropertiesName("project.properties"); const QLatin1String AndroidDefaultPropertiesName("project.properties");
const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber"); const QLatin1String AndroidDeviceSn("AndroidDeviceSerialNumber");
const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel"); const QLatin1String ApiLevelKey("AndroidVersion.ApiLevel");
const QString packageNameRegEx("(package: name=)\\'(([a-z]{1}[a-z\\d_]*\\." const QString packageNameRegEx("(?<token>package: )(.*?)(name=)'(?<target>.*?)'");
")*[a-z][a-z\\d_]*)\\'"); const QString activityRegEx("(?<token>launchable-activity: )(.*?)(name=)'(?<target>.*?)'");
const QString activityRegEx("(launchable-activity: name=)\\'" const QString apkVersionRegEx("(?<token>package: )(.*?)(versionCode=)'(?<target>.*?)'");
"(([a-z]{1}[a-z\\d_]*\\.)*[a-z][a-z\\d_]*)\\'"); const QString versionCodeRegEx("(?<token>versionCode=)(?<version>\\d*)");
const QString apkVersionRegEx("package: name=([\\=a-z\\d_\\.\\'\\s]*)"
"\\sversionName='([\\d\\.]*)'");
Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager") Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager")
@@ -85,7 +83,7 @@ namespace {
QRegularExpression::MultilineOption); QRegularExpression::MultilineOption);
QRegularExpressionMatch match = regRx.match(output); QRegularExpressionMatch match = regRx.match(output);
if (match.hasMatch()) if (match.hasMatch())
return match.captured(2); return match.captured("target");
return QString(); return QString();
}; };
} // anonymous namespace } // anonymous namespace
@@ -161,9 +159,27 @@ bool AndroidManager::packageInstalled(const QString &deviceSerial,
return false; return false;
} }
int AndroidManager::packageVersionCode(const QString &deviceSerial,
const QString &packageName)
{
if (deviceSerial.isEmpty() || packageName.isEmpty())
return -1;
QStringList args = AndroidDeviceInfo::adbSelector(deviceSerial);
args << "shell" << "dumpsys" << "package" << packageName;
const QRegularExpression regRx(versionCodeRegEx,
QRegularExpression::CaseInsensitiveOption |
QRegularExpression::MultilineOption);
QRegularExpressionMatch match = regRx.match(runAdbCommand(args).stdOut());
if (match.hasMatch())
return match.captured("version").toInt();
return -1;
}
void AndroidManager::apkInfo(const Utils::FileName &apkPath, void AndroidManager::apkInfo(const Utils::FileName &apkPath,
QString *packageName, QString *packageName,
QVersionNumber *version, int *version,
QString *activityPath) QString *activityPath)
{ {
SdkToolResult result; SdkToolResult result;
@@ -184,7 +200,7 @@ void AndroidManager::apkInfo(const Utils::FileName &apkPath,
if (version) { if (version) {
QString versionStr = parseAaptOutput(result.stdOut(), apkVersionRegEx); QString versionStr = parseAaptOutput(result.stdOut(), apkVersionRegEx);
*version = QVersionNumber::fromString(versionStr); *version = versionStr.toInt();
} }
} }

View File

@@ -69,11 +69,11 @@ class ANDROID_EXPORT AndroidManager : public QObject
public: public:
static QString packageName(ProjectExplorer::Target *target); static QString packageName(ProjectExplorer::Target *target);
static QString packageName(const Utils::FileName &manifestFile); static QString packageName(const Utils::FileName &manifestFile);
static bool packageInstalled(const QString &deviceSerial, static bool packageInstalled(const QString &deviceSerial, const QString &packageName);
const QString &packageName); static int packageVersionCode(const QString &deviceSerial, const QString &packageName);
static void apkInfo(const Utils::FileName &apkPath, static void apkInfo(const Utils::FileName &apkPath,
QString *packageName = nullptr, QString *packageName = nullptr,
QVersionNumber *version = nullptr, int *version = nullptr,
QString *activityPath = nullptr); QString *activityPath = nullptr);
static QString intentName(ProjectExplorer::Target *target); static QString intentName(ProjectExplorer::Target *target);
static QString activityName(ProjectExplorer::Target *target); static QString activityName(ProjectExplorer::Target *target);