My app, Carburoid, was using a gradle plugin i developed, which i decided to extract into a different repository to reuse it in my next project. Now i see that this has implications on F-Droid build and i am struggling to solve them.
Instead of the strategy which i followed to build it locally, consisting in publish it on a Local Maven repo, i tried to add the plugin as Carburoid submodule by indicating in the settings.gradle.kts
kotlin
pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
google()
mavenCentral()
}
includeBuild("build-logic/plugins/android-yaml-strings") // ← I added this
}
dependencyResolutionManagement {
This also works in local but in the local fdroid server i get this error:
**== fdroid build -vl net.canvoki.carburoid**
2026-02-17 19:34:07,894 WARNING: unsafe permissions on 'config.yml' (should be 0600)!
building file list ... done
sent 84 bytes received 11 bytes 190.00 bytes/sec
total size is 5,987 speedup is 63.02
building file list ... done
sent 84 bytes received 11 bytes 190.00 bytes/sec
total size is 5,987 speedup is 63.02
2026-02-17 19:34:09,022 INFO: Building version 1.4.2 (1040200) of net.canvoki.carburoid
2026-02-17 19:34:09,025 INFO: Getting source for revision d41d7db2e25790f932ce1016ed922b385250bbae
2026-02-17 19:34:11,639 INFO: Initialising submodules
Submodule path 'build-logic/plugins/android-yaml-strings': checked out '4e7f8fc00ed73b670a2448c5b5481eeb02e08a82'
2026-02-17 19:34:12,244 INFO: Creating local.properties file at build/net.canvoki.carburoid/local.properties
2026-02-17 19:34:12,245 INFO: Creating local.properties file at build/net.canvoki.carburoid/app/local.properties
2026-02-17 19:34:12,250 INFO: Cleaned build.gradle.kts of keysigning configs at build/net.canvoki.carburoid/app/build.gradle.kts
2026-02-17 19:34:12,253 INFO: Cleaning Gradle project...
======================= {'repo_url': 'https://f-droid.org/repo', 'repo_maxage': 14, 'repo_web_base_url': 'https://f-droid.org/packages', 'repo_name': 'F-Droid', 'archive_older': 3, 'repo_keyalias': 'ciarang', 'repo_key_sha256
': '43238d512c1e5eb2d6569f4a3afbf5523418b82e0a3ed1552770abb9a9c9ccab', 'repo_pubkey': '3082035e30820246a00302010202044c49cd00300d06092a864886f70d01010505003071310b300906035504061302554b3110300e06035504081307556e6b6e6f776e3111
300f0603550407130857657468657262793110300e060355040a1307556e6b6e6f776e3110300e060355040b1307556e6b6e6f776e311930170603550403131043696172616e2047756c746e69656b73301e170d3130303732333137313032345a170d3337313230383137313032345a3
071310b300906035504061302554b3110300e06035504081307556e6b6e6f776e3111300f0603550407130857657468657262793110300e060355040a1307556e6b6e6f776e3110300e060355040b1307556e6b6e6f776e311930170603550403131043696172616e2047756c746e6965
6b7330820122300d06092a864886f70d01010105000382010f003082010a028201010096d075e47c014e7822c89fd67f795d23203e2a8843f53ba4e6b1bf5f2fd0e225938267cfcae7fbf4fe596346afbaf4070fdb91f66fbcdf2348a3d92430502824f80517b156fab00809bdc8e631b
fa9afd42d9045ab5fd6d28d9e140afc1300917b19b7c6c4df4a494cf1f7cb4a63c80d734265d735af9e4f09455f427aa65a53563f87b336ca2c19d244fcbba617ba0b19e56ed34afe0b253ab91e2fdb1271f1b9e3c3232027ed8862a112f0706e234cf236914b939bcf959821ecb2a6c1
8057e070de3428046d94b175e1d89bd795e535499a091f5bc65a79d539a8d43891ec504058acb28c08393b5718b57600a211e803f4a634e5c57f25b9b8c4422c6fd90203010001300d06092a864886f70d0101050500038201010008e4ef699e9807677ff56753da73efb2390d5ae2c17
e4db691d5df7a7b60fc071ae509c5414be7d5da74df2811e83d3668c4a0b1abc84b9fa7d96b4cdf30bba68517ad2a93e233b042972ac0553a4801c9ebe07bf57ebe9a3b3d6d663965260e50f3b8f46db0531761e60340a2bddc3426098397fda54044a17e5244549f9869b460ca5e6e21
6b6f6a2db0580b480ca2afe6ec6b46eedacfa4aa45038809ece0c5978653d6c85f678e7f5a2156d1bedd8117751e64a4b0dcd140f3040b021821a8d93aed8d01ba36db6c82372211fed714d9a32607038cdfd565bd529ffc637212aaa2c224ef22b603eccefb5bf1e085c191d4b24fe74
2b17ab3f55d4e6f05ef', 'gpgkey': '37D2C98789D8311948394E3E41E7044E1DBA2E89', 'gpghome': {'env': 'gpghome'}, 'keystore': {'env': 'keystore'}, 'keydname': 'CN=FDroid, OU=FDroid, O=fdroid.org, L=ORG, S=ORG, C=UK', 'keystorepass':
{'env': 'keystorepass'}, 'keypass': {'env': 'keypass'}, 'serverwebroot': {'env': 'serverwebroot'}, 'nonstandardwebroot': True, 'deploy_process_logs': True, 'keep_when_not_allowed': True, 'make_current_version_link': False, '
refresh_scanner': True, 'binary_transparency_remote': 'git@gitlab.com:fdroid/f-droid.org-transparency-log.git', 'keyaliases': {'com.ghostsq.commander.samba': '@com.ghostsq.commander', 'com.nextcloud.talk2': '@com.nextcloud.cl
ient', 'com.termux.api': '@com.termux', 'com.termux.boot': '@com.termux', 'com.termux.gui': '@com.termux', 'com.termux.styling': '@com.termux', 'com.termux.tasker': '@com.termux', 'com.termux.widget': '@com.termux', 'com.term
ux.window': '@com.termux', 'org.fdroid.fdroid.privileged': 'ciarang', 'org.fdroid.fdroid': 'ciarang'}, 'apk_signing_key_block_list': \['a6ccc500ff0e7421200eb66a7fe174ef1b00e52ca91727070cbedf061ff76c35', 'ce7b2b47ae2b7552c8f92c
c29124279883041fb623a5f194a82c9bf15d492aa0', '465983f7791f2abeb43ea2cbdc7f21a8260b72bc08a55c839fc1a43bc741a81e', 'e1dbadce60dc080d15b58a014b0dcf9400e24de23fa00b287a5a982bfebda2ee', 'fae9122a8721d6e2a196d2224dffcf773c9127e2bb9
56cbddb40b009192ffdfd', 'c8a2e9bccf597c2fb6dc66bee293fc13f2fc47ec77bc6b2b0d52c11f51192ab8', 'abf21f9e2af1d881cc673fddcefa6ed9c269a437bd64b279cf45844cfd589126', '28bbfe4a7b97e74681dc55c2fbb6ccb8d6c74963733f6af6ae74d8c3a6e879fd
', 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc'\], 'sdk_path': '/opt/android-sdk', 'ndk_paths': {'23.2.8568313': '/opt/android-sdk/ndk/23.2.8568313'}, 'cachedir': '/home/vagrant/.cache/fdroidserver', 'jav
a_paths': {'17': '/usr/lib/jvm/java-17-openjdk-amd64'}, 'scan_binary': False, 'ant': 'ant', 'mvn3': 'mvn', 'gradle': '/usr/local/bin/gradlew-fdroid', 'sync_from_local_copy_dir': False, 'allow_disabled_algorithms': False, 'per
\_app_repos': False, 'current_version_name_source': 'Name', 'build_server_always': False, 'smartcardoptions': \[\], 'char_limits': {'author': 256, 'name': 50, 'summary': 80, 'description': 4000, 'video': 256, 'whatsNew': 500}, '
repo_icon': 'icon.png', 'repo_description': 'This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries bui
lt from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid.', 'archive_name': 'My First F-Droid Archive Demo', 'archive_description': 'These are the apps that have been archived from the main repo
.', 'git_mirror_size_limit': 10000000000, 'scanner_signature_sources': \['suss'\], 'sdk_path_orig': '$ANDROID_HOME', 'jarsigner': '/usr/lib/jvm/java-17-openjdk-amd64/bin/jarsigner', 'keytool': '/usr/lib/jvm/java-17-openjdk-amd6
4/bin/keytool', 'apksigner': '/usr/bin/apksigner', 'cachedir_scanner': '/home/vagrant/.cache/fdroidserver/scanner', 'gradle_version_dir': '/home/vagrant/.cache/fdroidserver/gradle'}
=========================== \['/usr/local/bin/gradlew-fdroid', 'clean'\]
CACHEDIR set to /home/vagrant/.cache/fdroidserver
Update checksum from gradle-transparency-log
Found 8.14.4 via distributionUrl
Downloading missing gradle version 8.14.4
Using cache directory /home/vagrant/.cache/fdroidserver
Running /home/vagrant/.cache/fdroidserver/versions/8.14.4/bin/gradle clean
Welcome to Gradle 8.14.4!
Here are the highlights of this release:
- Java 24 support
- GraalVM Native Image toolchain selection
- Enhancements to test reporting
- Build Authoring improvements
For more details see https://docs.gradle.org/8.14.4/release-notes.html
To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/8.14.4/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle docume
ntation.
Daemon will be stopped at the end of the build
> Task :android-yaml-strings:checkKotlinGradlePluginConfigurationErrors SKIPPED
> Task :android-yaml-strings:pluginDescriptors
> Task :android-yaml-strings:processResources
> Task :android-yaml-strings:compileKotlin
> Task :android-yaml-strings:compileJava NO-SOURCE
> Task :android-yaml-strings:classes
> Task :android-yaml-strings:jar
> Configure project :shared
w: file:///build/build/net.canvoki.carburoid/shared/build.gradle.kts:14:9: 'targetSdk: Int?' is deprecated. Will be removed from library DSL in AGP 9.0. Use testOptions.targetSdk or/and lint.targetSdk instead
> Task :app:clean UP-TO-DATE
BUILD SUCCESSFUL in 1m 18s
5 actionable tasks: 4 executed, 1 up-to-date
2026-02-17 19:35:34,852 INFO: Scanning source for common problems...
2026-02-17 19:35:35,554 INFO: Removing gradle-wrapper.jar at gradle/wrapper/gradle-wrapper.jar
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin$apply$1.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin$apply$2$execute$$inlined$getByType$1.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsTaskKt$extractParams$1.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin$configure$1$1.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsTaskKt.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin$apply$3.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin$apply$3$execute$$inlined$getByType$1.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin$configure$1$taskProvider$1.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsExtension.class
2026-02-17 19:35:35,574 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/Translatable.class
2026-02-17 19:35:35,575 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin$configure$1$taskProvider$1$1.class
2026-02-17 19:35:35,575 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin.class
2026-02-17 19:35:35,575 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsTask.class
2026-02-17 19:35:35,575 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsPlugin$apply$2.class
2026-02-17 19:35:35,575 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/MismatchedParamException.class
2026-02-17 19:35:35,575 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsTask$convertYamlToAndroidXml$1.class
2026-02-17 19:35:35,575 ERROR: Found Java compiled class at build-logic/plugins/android-yaml-strings/build/classes/kotlin/main/net/canvoki/android/yamlstrings/YamlStringsTaskKt$parametersToXml$1.class
2026-02-17 19:35:35,575 ERROR: Found binary at build-logic/plugins/android-yaml-strings/build/kotlin/compileKotlin/cacheable/last-build.bin
2026-02-17 19:35:35,577 ERROR: Found binary at build-logic/plugins/android-yaml-strings/build/kotlin/compileKotlin/local-state/build-history.bin
2026-02-17 19:35:35,577 ERROR: Found binary at build-logic/plugins/android-yaml-strings/build/kotlin/compileKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin
2026-02-17 19:35:35,577 ERROR: Found Java JAR file at build-logic/plugins/android-yaml-strings/build/libs/android-yaml-strings-1.0.0.jar
2026-02-17 19:35:35,577 INFO: Removing gradle-wrapper.jar at build-logic/plugins/android-yaml-strings/gradle/wrapper/gradle-wrapper.jar
2026-02-17 19:35:35,578 ERROR: Could not build app net.canvoki.carburoid: Can't build due to 21 errors while scanning
building file list ... done
Is kind of puzzling that the build generates those compiled files and then complains about them.
I am sure i am not the first one to try to extract common elements, i see many apps using submodules, but because all the build logic it in their repositories, is very hard to find an example and the documentation does not help for this quite specific problem (so far i read). So what is the pattern to follow here to keep the plugin in its own repository?