English | Deutsch
A simple Android project in Kotlin + Jetpack Compose.
This project is licensed under the Apache License 2.0. See LICENSE for details.
- Feed overview
- Add feed
- Load RSS/Atom
- Parser
- Room database
- Article list
- Reader view with text and images below
- Simple settings
Open with Android Studio and use this repository root as the project — the Gradle project is the repository
(in the maintainer's local working copy the same folder is named rss_reader_full_project).
Alternatively, start-android-studio.ps1 launches Android Studio already configured with the local JDK/SDK paths.
Via Android Studio through Build > Build APK(s) or locally via gradlew.bat assembleDebug.
Before a release candidate, additionally run gradlew.bat exportReleaseApk (builds, signs and copies the APK
into ../Ausgabe_APK/) and use the checklist in RELEASE_CHECKLIST_RSS_READER_DE.md.
Unit tests: gradlew.bat testDebugUnitTest (JUnit 4 + Robolectric). A GitHub Actions workflow
.github/workflows/ci.yml runs unit tests and Android Lint on every push and pull
request to main; the emulator job for the instrumented UI tests runs manually only
(workflow_dispatch, no schedule).
Store metadata for F-Droid is located under fastlane/metadata/android/.
A short note on the official submission is in docs/FDROID_EINREICHUNG_DE.md.
A prepared submission text is in docs/FDROID_SUBMISSION_TEMPLATE_EN.md.
Release builds require a local keystore.properties.
This file is NOT part of the repository and must never be committed.
keystore.properties contains only non-secret values (storeFile, keyAlias).
The signing passwords are NOT stored in plain text anywhere in the project.
They are read at build time from the OS-bound credential store (Windows Credential Manager)
via tools/get-signing-secret.ps1 (targets: rssreader_store_password, rssreader_key_password).
- Copy
keystore.properties.exampletokeystore.properties. - Fill in
storeFileandkeyAlias. - Make sure the two credential-manager entries
rssreader_store_passwordandrssreader_key_passwordexist. If they still exist as plain text from an old setup, migrate them once withtools/migrate-signing-secrets.ps1. - Make sure
.gitignoreexcludes the file.
Important:
keystore.propertiesmust not be versioned (it points at signing configuration).- The signing passwords live only in the OS credential store, never in repository files.
- The release key (
*.jks, e.g.signing/rss-reader-release.jks) must be managed outside the repository and backed up separately. - Debug builds are signed with the SAME release key when
keystore.propertiesis present, soadb install -rupdates an installed release APK without uninstalling it. Withoutkeystore.properties, debug builds fall back to the default debug keystore. - Without
keystore.properties,assembleReleaseproduces an unsigned APK (controlled, not an error). A signed release APK requireskeystore.propertiesto be present locally.
R8 / Minify:
isMinifyEnabledandisShrinkResourcesare permanently forbidden (never enable, never propose).- Previous attempts to enable them caused severe problems.
Documents and leftovers that are no longer part of the active project live in an _archiv folder:
_archiv/(repository root) anddocs/archiv/: retired one-off documents and duplicates (further release checklists, drafts, roadmap, git cheat sheet, GitHub Pages guides)._archiv/in the workspace root (F:\001_Coding_Projekte\RSS_Reader_Android\_archiv\): local leftovers (build logs, prompt files,verify_tmp/).
Everything under an _archiv folder is not part of the active project and is no longer maintained.
The two repository folders are listed in .gitignore and therefore not tracked; the files stay on disk
as a recovery reserve. Nothing there is deleted, and no new files are added without explicit approval.
The wrapper is already prepared for this machine and uses the locally stored Gradle 8.11.1 distribution.
The Kotlin toolchain is pinned to JDK 21 (kotlin { jvmToolchain(21) } in app/build.gradle.kts);
without a discoverable JDK 21 the build fails with "No locally installed toolchains match". The Java
bytecode level stays at 17 (jvmTarget/compileOptions). Check with gradlew.bat -q javaToolchains --no-daemon.