forked from qt-creator/qt-creator
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:
@@ -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) {
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user