diff options
| author | Sheree Morphett <[email protected]> | 2025-11-28 14:42:03 +0200 |
|---|---|---|
| committer | Sheree Morphett <[email protected]> | 2025-12-19 16:00:19 +0000 |
| commit | fc5d9e4ff2b44d6efb7a548acac3a78402c987be (patch) | |
| tree | c9ab8e19dfaf84cd55c557fa8566c96cdfd4f0ac /src/plugins/android/androidbuildapkstep.cpp | |
| parent | 492644297500f38a90bd109fd9a461ff4cece050 (diff) | |
Check file modification times to avoid unnecessary steps in builds
and deployments when nothing has changed. Timestamps are persisted
across sessions.
Fixes: QTCREATORBUG-33638
Change-Id: Id225bd2548096e4a3892d5f87066b4cff661a176
Reviewed-by: hjk <[email protected]>
Diffstat (limited to 'src/plugins/android/androidbuildapkstep.cpp')
| -rw-r--r-- | src/plugins/android/androidbuildapkstep.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 6cbe6367713..0ed1c12516a 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -1045,6 +1045,13 @@ QtTaskTree::GroupItem AndroidBuildApkStep::runRecipe() Task::Warning); return SetupResult::StopWithSuccess; } + + if (!needsApkRegeneration()) { + emit addOutput(Tr::tr("No changes detected, skipping APK regeneration."), + OutputFormat::NormalMessage); + return SetupResult::StopWithSuccess; + } + if (setupHelper()) return SetupResult::Continue; reportWarningOrError(Tr::tr("Cannot set up \"%1\", not building an APK.") @@ -1052,6 +1059,7 @@ QtTaskTree::GroupItem AndroidBuildApkStep::runRecipe() return SetupResult::StopWithError; }; const auto onDone = [this] { + updateBuildTimestamp(); if (m_openPackageLocationForRun) QTimer::singleShot(0, this, &AndroidBuildApkStep::showInGraphicalShell); }; @@ -1064,6 +1072,72 @@ QtTaskTree::GroupItem AndroidBuildApkStep::runRecipe() return root; } +bool AndroidBuildApkStep::needsApkRegeneration() +{ + const FilePath androidBuildDir = androidBuildDirectory(buildConfiguration()); + const FilePath apkOutputDir = androidBuildDir / "build/outputs/apk"; + if (!apkOutputDir.exists()) { + emit addOutput(Tr::tr("APK output directory does not exist, regenerating APK."), + OutputFormat::NormalMessage); + return true; + } + + const FilePath timestampFile = androidBuildDir / "AndroidBuildTimestamp"; + if (!m_lastBuildTime.isValid()) { + if (timestampFile.exists()) { + m_lastBuildTime = timestampFile.lastModified(); + qCDebug(buildapkstepLog) << "Loaded build timestamp from file:" << m_lastBuildTime; + } else { + emit addOutput(Tr::tr("First build in session, regenerating APK."), + OutputFormat::NormalMessage); + return true; + } + } + + if (m_inputFile.exists() && m_inputFile.lastModified() > m_lastBuildTime) { + emit addOutput(Tr::tr("Deployment settings changed since last build, regenerating APK."), + OutputFormat::NormalMessage); + return true; + } + + BuildSystem *bs = buildSystem(); + const QStringList androidAbis = bs->property(Constants::AndroidAbis).toStringList(); + for (const QString &abi : androidAbis) { + const FilePath libsDir = androidBuildDir / "libs" / abi; + if (libsDir.exists()) { + const FilePaths files = libsDir.dirEntries(QDir::Files); + for (const FilePath &file : files) { + if (file.lastModified() > m_lastBuildTime) { + emit addOutput(Tr::tr("Library %1 changed since last build, regenerating APK.") + .arg(file.fileName()), + OutputFormat::NormalMessage); + return true; + } + } + } + } + + const QString buildKey = buildConfiguration()->activeBuildKey(); + const ProjectNode *node = project()->findNodeForBuildKey(buildKey); + if (node) { + const FilePath apk = FilePath::fromString(node->data(Constants::AndroidApk).toString()); + if (!apk.isEmpty() && apk.exists() && apk.lastModified() > m_lastBuildTime) { + emit addOutput(Tr::tr("Application binary changed since last build, regenerating APK."), + OutputFormat::NormalMessage); + return true; + } + } + + return false; +} + +void AndroidBuildApkStep::updateBuildTimestamp() +{ + m_lastBuildTime = QDateTime::currentDateTime(); + const FilePath timestampFile = androidBuildDirectory(buildConfiguration()) / "AndroidBuildTimestamp"; + timestampFile.writeFileContents(QByteArray()); +} + void AndroidBuildApkStep::reportWarningOrError(const QString &message, Task::TaskType type) { qCDebug(buildapkstepLog) << message; |
