aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/android/androidbuildapkstep.cpp
diff options
context:
space:
mode:
authorSheree Morphett <[email protected]>2025-11-28 14:42:03 +0200
committerSheree Morphett <[email protected]>2025-12-19 16:00:19 +0000
commitfc5d9e4ff2b44d6efb7a548acac3a78402c987be (patch)
treec9ab8e19dfaf84cd55c557fa8566c96cdfd4f0ac /src/plugins/android/androidbuildapkstep.cpp
parent492644297500f38a90bd109fd9a461ff4cece050 (diff)
Android: Add timestamp checks to stop redundant build/deployHEADmaster
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.cpp74
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;