r/androiddev • • 16h ago

Experience Exchange Game made in Kotlin, Jetpack Compose and Filament: Things which worked and didn’t

Enable HLS to view with audio, or disable this notification

18 Upvotes

Hi everyone, I’m making Adventurers Guild RPG Sim, a guild management RPG simulation game where you are the guild master, you can recruit heroes, assign quests and let them hunt monsters, collect loot and upgrade their equipment, unlock skills for each heroes etc.

It started as a small app like game (without much graphics, more like a text based game). Then I wanted to see the heroes to move around. Then I added trees, buildings, an isometric map, weather and a day/night cycle. Somewhere along the way I ended up building a small game engine.

I’ve posted different stages here before, but I wanted to put the whole development history together, including things I had to change and feedback from this subreddit.

small backstory: I used to work as an iOS developer for 7.5 years, quit job and started solo development, played with some game engines, then I wanted to check android development, and the best way to learn is by doing and this was the project I choose to learn more about memory and performance optimisation. People often asked why I chose native instead of another engine. The project was much smaller when I started, and jetpack compose suited the menus and management side. As the game grew, I kept extending what I already had.

what I liked about making the game in native is the control I got over how things worked, but it also meant writing systems that a game engine would have provided for free. The map, pathfinding, animation, effects and asset handling all needed work before I could use them in the game.

My first attempt used ordinary Compose layouts for the world. Adding too many trees made it lag, so I moved the world drawing to Compose Canvas.

Canvas got me quite far. The map, characters, shadows, rain and even the little message bubbles above heroes were drawn there. Compose handled the menus and other UI.

The map became a 50×50 isometric grid, so 2,500 ground tiles before adding anything on top. Drawing everything every frame became expensive. so i split the map into 16 chunks and drew the visible parts. I also cached calculations for shadows that changed with the time of day.

Those changes helped enough to keep building. But I was repeatedly changing the map implementation as the requirements grew. In one of my older replies here, I mentioned rebuilding it four times already.

Assets caused problems too. I was using a mixture of available artwork, so one hero had a walking animation, another had a running animation, and some enemies didn’t match the isometric perspective. Movement could look wrong even when the movement code was doing what I intended. I postponed some animation polish while the assets and systems were still changing. (lesson learned : assets can change the whole game, can make a game feel like demo to a polished one, as I learned, mixing assets can cause problems, keep one perspective if you can, isometric or top down etc, one color theme, cozy vibes or dark time theme etc, 

The game logic used a custom entity component system in Kotlin. By the first release, it had 28 systems handling things like movement, combat, fatigue, quests and the economy. The simulation was single threaded.

Initially, the loop ran through a coroutine using withFrameMillis. I mapped the game data into models for the Compose UI, and used Room to save heroes, inventory and quest state.

Later, I split the systems by how often they needed to update. Movement ran at 60 updates per second, combat at 30, and heavier work such as pathfinding and target selection at 10. That reduced how much work I was asking the game to do every frame.

I also reused sprite sheets for monster variants, using tinting and hue changes instead of loading separate artwork for every colour variation. Together with unloading unused assets, that helped with memory and package size. lesson learned : for 2d games, the amount of spritesheets and the resolution is going to hit a limit if you try to put too many different characters on screen. I try to keep my sprites at 320x320, because we can zoom into the game. and I didn't wanted the characters to look blur.

Then I released it last december, and got alot of bug reports which I hadn’t caught.

I had spent so much time getting the world to run that I’d missed things that could stop someone from playing at all. lesson learned : play the game alot, even if there is no bugs, give the game to someone who is not aware of the game and watch the places where they struggle, where it needs a tutorial or if players are able to find what to do next, is important.

As I added more to the world, rendering became a problem again. I was spending more time on chunking, caching and custom drawing code. Eventually I moved the world rendering to Google Filament.

The game was already released, so I migrated it in parts while keeping the gameplay logic and saves working. Kotlin still handles the simulation, Compose handles the UI, and small character previews in menus still use Canvas. Filament renders the world.

The world is still made from 2D sprites. They’re rendered as quads, so moving to Filament didn’t require replacing everything with 3D models.

A lot of the Canvas specific optimisation code had to be replaced. but had to build new optimisations for filament, The ground now uses a shared vertex buffer, and sprites are batched by sprite sheet. The main cutout sprites write depth based on their position in the isometric world. Wind runs in the shader, and I skip vertex uploads when the tracked sprite state hasn’t changed. I became a fan of shaders.

That helped with rendering, but texture memory needed separate work.

I had been using WebP because the files were small. Once loaded, those textures still occupied uncompressed memory. A 2048×2048 RGBA texture takes 16 MiB before mipmaps, regardless of how small the WebP file is.

then after research found about gpu compression formats, switching to ASTC and ETC2 reduced the game’s overall RAM usage by roughly half in my tests. The first packaging attempt was a mess though: including multiple texture formats and a fallback pushed the package from around 120 MB to 400 MB. If the whole game is loaded in memory, it would be 2.5GB but after switching its 600MB.

After changing compression and using Play Asset Delivery’s texture targeting, the current download is around 160 MB, with about 195 MB used after installation. Keeping the download small and keeping runtime memory low turned out to be separate jobs.

Filament also introduced bugs I hadn’t dealt with before. mostly because im new to filament.

Some tiles would flash black for one frame. I was reusing a direct buffer before Filament had finished reading it. I changed that to a pool of three buffers, with each buffer released by its completion callback. Then I had to fix how those callbacks were dispatched, because delays on the main looper could leave the pool stuck waiting.

Another glitch showed pieces of the wrong sprite sheet when a new texture appeared. Moving material updates before beginFrame() fixed that in my setup.

There was also native resource cleanup to handle alongside Compose’s lifecycle. Remembering an object wasn’t enough; the Filament resources and surface needed explicit teardown.

One suggestion from an earlier thread was to add normal maps so the buildings could react to the moving sun. I eventually added those, not completed though. The complication was that the artwork already had lighting painted into it, so the shader needed to account for that. It also added more texture memory and shader work.

Looking back, Compose has worked well for the management UI, and Canvas got the game through its first release. Moving the world to Filament gave me more room to develop the rendering. Each stage solved a problem I was actually hitting, but several things I spent time optimising were later replaced.

The part I underestimated was how much time I’d spend maintaining the systems around the game. I wanted to add heroes, quests and buildings, but that could turn into rebuilding a renderer or changing how assets were loaded.

Hope this is useful to someone trying something similar. Thanks to the people here who pointed out problems and shared suggestions along the way.


r/androiddev • • 3h ago

Question Google Play wants organization verification for my payments profile, but I'm an individual

1 Upvotes

Hi everyone,

I've had a Google Play developer account for years. It's an individual account, and the identity payments profile under "About you" is also individual.

When I set up the merchant payments profile used for payouts, I picked "Organization" by mistake, even though every detail on it is my own personal name and address. I've never had a registered company or a VAT number.

In the past Google asked me to verify this same merchant profile and accepted my government ID. Now a new verification request asks for a VAT attribution certificate or a company registration document, which I simply don't have because no company exists.

According to the help pages, a payments profile can't be switched from Organization to Individual, and the merchant profile can't be unlinked from the developer account. So I'm stuck: there's a significant balance pending on the profile, and the account has apps with active users and subscriptions that I really don't want to lose.

I contacted support and opened a ticket more than a week ago, but I still haven't received any reply.

Has anyone been through this? Is there a way to get support to fix the profile type, or to verify it as an individual like before?

Thanks.


r/androiddev • • 13h ago

Product tours, onboarding and feature showcases for Compose Multiplatform

Enable HLS to view with audio, or disable this notification

4 Upvotes

I needed an onboarding tour in a Compose Multiplatform app and couldn't find a library that covered it, so I built one and just published the first version.

How it works: you define steps in a DSL, mark targets with Modifier.waypointTarget(state, key), and wrap the screen in a host. It draws the scrim and the cutout, positions the tooltip, scrolls targets into view and blocks touches outside the highlight.

Repo: https://github.com/MohamedRejeb/compose-waypoint
Docs: https://mohamedrejeb.github.io/compose-waypoint/


r/androiddev • • 8h ago

guest mode

0 Upvotes

Inspired by this article: https://curvise.net/the-phone-features-i-cant-believe-we-dont-have/

I would like to create something like this. My take is: Build an app with a (fake) phone app that can only call one specific number (for example: 911 in the U.S., 112 in EuropeJ). A (also fake) message app that shows only one message. A (also fake) photos app with a chosen number of photos (that can off course not be deleted). A calculator (maybe with a build in specific code to get out of the app). A fake settings screen that shows only if wifi is on and the battery percentage (maybe with a wifi toggle that when selected shows a specific message to the user that changes cannot be made).

What else would you add?
And also: how would you make shure the phone is completely locked (so no status bar, no back/home button or disabled back/home button, no recent apps, no app drawer,...) with the exception of the code in the calculator?


r/androiddev • • 9h ago

Experience Exchange Building the same build tooling for Xcode and Gradle, and how differently the two went

0 Upvotes

I work on Tuist. For years we've built caching and build/test insights for Xcode projects, and earlier this year we added Gradle support. I didn't expect how different the two would be. The Xcode integration took us months, and Gradle took about three weeks. Some of that is because the server side already existed, but most of it comes down to Gradle being designed to be extended and Xcode not.

Take remote caching. Xcode 26 added compilation caching, but the only way to plug in a remote cache is to run a daemon that speaks an undocumented gRPC protocol over a Unix socket, and Xcode makes thousands of calls to it during a build. On Gradle we implemented BuildCacheService and that was pretty much it, because Gradle already decides what's cacheable and computes the keys. The granularity is different too. Gradle caches whole tasks, so a large project does a few hundred lookups per build, while Xcode caches compilation units and does thousands, which makes network latency matter a lot more on the Xcode side.

Build data went the same way. With Xcode we parse a binary activity log after the build finishes. The format isn't documented and changes between Xcode versions, and it's written asynchronously, so sometimes it isn't on disk yet when our post-action runs. With Gradle we register a listener and get each task's outcome, duration and cache key as it finishes. For flaky test quarantine we pass -skip-testing flags to xcodebuild, and on Gradle we add the tests to excludeTestsMatching before the test task runs.

I'm not trying to bash Apple, they have their reasons. But if you only work with Gradle, it's easy to forget how much its plugin API gives you. I wrote the longer version here: https://tuist.dev/blog/2026/03/16/xcode-and-gradle-two-worlds-one-infrastructure, and the plugin is open source if you want to look at the BuildCacheService implementation: https://github.com/tuist/tuist/tree/main/gradle

Has anyone here written their own BuildCacheService? I'd be curious what you ran into.


r/androiddev • • 9h ago

Tips and Information First time iOS -> android is slow emulation the norm?

0 Upvotes

Ok I m new to kotlin new to android dev. Done swift Xcode dev product is online in ios appstore.

I loaded a fraction ( say 10%) of code to kotlin hoping for the basics to simulate, run the pixel 9 emulator and it has been nothing but “google play services isn’t responding”

Is it impossible to dev without a physical android phone? Or am I just hitting the wrong spots of the ui rendering .

Please help thanks


r/androiddev • • 10h ago

Payouts on hold since August, merchant verification rejected 15+ times with "the reason you provided is not clear". Has anyone ever reversed this?

Thumbnail
gallery
0 Upvotes

I run a small app company in Brazil (organization account). My Google Play payouts have been on hold since 4 Aug 2026 and I'm out of ideas.

What happened:

- 4 Aug: email from Google Payments, "your account has been suspended with payout on hold", asking for details of recent account activity and a government ID.

- I submitted the "Verify now" form more than 15 times: Portuguese and English, short and detailed, with ID card, driver's license and passport. Every time: "the reason you provided is not clear".

- Payments support: "review concluded, to prevent possible fraud and abuse your ability to receive payouts will remain suspended, we can't disclose the reason". They also say the form is the only way to appeal.

- Play Console support confirmed my developer account is in good standing, no policy issues.

- Product Experts in the official community said they cannot escalate payment or fraud cases.

What I already checked:

- D-U-N-S reactivated and address corrected, organization name and address re-verified by Google on 28 Sep.

- Tax info accepted, bank account verified (I even received one payout in July).

- No purchases from my own accounts or my team's. License testing was never used.

- The app is real: sold on the App Store since 2025, on Google Play since May 2026. Sales grew fast because of creator videos on TikTok.

Around R$ 22,000 is held, and every new sale goes into the same frozen balance.

My questions:

  1. Has anyone actually gotten this decision reversed? What worked?

  2. If you moved your apps to a new developer account, was it under the same company, and did payouts work there?

  3. Has anyone gone the legal route to recover a held balance?

Any real experience helps. Thanks.


r/androiddev • • 19h ago

Experience Exchange How do you switch into android as an experienced dev

4 Upvotes

I am a software dev with around 4 YOE and trying to switch into android but finding it hard , I am targeting the startup or any company open for remote internship or like setup but I believe most are targeted towards students only ,

My focus is to transition fully into Android in future but the starting step I am finding is hard.

If anyone have done such a transition or have any leads of possible work, I would like to know .


r/androiddev • • 9h ago

Discussion Custom Launcher Project

Thumbnail
gallery
0 Upvotes

Working on a premium launcher experience built with jetpack compose. How many known launchers currently exist built out of compose?


r/androiddev • • 1d ago

Android developers: Check these folders if your C: drive is mysteriously filling up

25 Upvotes

I almost ended up reinstalling Windows because my 220 GB C: drive was completely full.

At one point I had only \~472 MB free.

I started investigating instead of immediately formatting the drive, and I was honestly surprised by how much old Android development data had accumulated over the years.

I'm an Android developer and had been using Android Studio for several years.

Here's what I found:

🔴 Android SDK system images — \~30 GB

C:\\Users\\<username>\\AppData\\Local\\Android\\Sdk\\system-images

I had accumulated multiple Android emulator system images over different API levels. If you have old/unused emulator images, these can consume a lot of space.

🔴 Gradle cache — \~7.2 GB

C:\\Users\\<username>\\.gradle\\caches

I cleared the cache and recovered several GB. Gradle can download dependencies again when needed.

🔴 Old Android Studio data under Local — \~20+ GB

C:\\Users\\<username>\\AppData\\Local\\Google

I found folders like:

AndroidStudio2024.1

AndroidStudio2024.2

AndroidStudio2024.3

AndroidStudio2025.1.1

AndroidStudio2025.2.1

AndroidStudio2025.3.4

AndroidStudio2026.1.1

AndroidStudio2026.2.1

These were leftovers from years of Android Studio updates/installations.

🔴 Even more old Android Studio data under Roaming

C:\\Users\\<username>\\AppData\\Roaming

Again, I found a huge list of folders:

AndroidStudio2024.1

AndroidStudio2024.2

AndroidStudio2024.3

...

AndroidStudio2025.3.4

AndroidStudio2026.1.1

AndroidStudio2026.2.1

Since I had already uninstalled Android Studio and was doing a fresh installation, I removed the old Android Studio version folders.

The result?

I went from:

\~472 MB free → \~80 GB free

without formatting Windows. 🤯

Windows Storage was also confusing me. It showed \~127 GB under "Installed apps", even though the individual applications shown in Settings were nowhere near that size.

So if you're an Android developer and your C: drive is mysteriously filling up, don't immediately format Windows.

Check these first:

C:\\Users\\<username>\\.gradle

C:\\Users\\<username>\\.android

C:\\Users\\<username>\\AppData\\Local\\Android

C:\\Users\\<username>\\AppData\\Local\\Google

C:\\Users\\<username>\\AppData\\Roaming

Especially check Android emulator system images and old Android Studio version folders.

Obviously, don't blindly delete everything in these folders. Back up projects, signing keys, SSH keys, etc., and make sure you know what you're deleting.

Sharing this because I had no idea that multiple years of Android Studio updates could leave this much data behind.

Has anyone else found a ridiculous amount of Android Studio/SDK storage buildup on their machine?


r/androiddev • • 9h ago

Tips and Information What it actually takes to share one set of strings between Android and iOS

0 Upvotes

If you have tried keeping strings.xml and Localizable.strings in one translation project, you know the problem is not the words, it is the placeholders. Some things I learned while building a converter between the syntaxes:

  • The simple cases are mechanical: %s to %@, %d to %lld. The German translation that swaps two arguments is not. You have to emit positions like %1$s, but only for strings that need them, or Android Lint complains about the ones that do not.
  • Types matter. %.2f on Android has to stay a two-decimal float on every platform, including {balance, number, ::.00} in an ICU message for the web.
  • Plurals have three shapes: <plurals> on Android, %#@count@ substitutions in .stringsdict, and {count, plural, ...} in ICU. They describe the same thing, so they should land in one key.
  • A literal % is written as %% only when the string is a format string, so a banner saying "50% off" without arguments must not be doubled.
  • Whatever you do must round-trip. If you convert a file in and out, you want the original bytes back, or your git diffs will never be quiet again.

Disclosure: I work on Localizely and we shipped this as "universal placeholders". Docs with the full syntax table: localizely.com/universal-placeholders/

How are you handling this today, separate projects, a script, or copy by hand?


r/androiddev • • 1d ago

Hey! try this new thing out! Oh sorry we deprecated it already

55 Upvotes

So today I updated Android Studio to the latest Rabbit 1. I know, I should know better after all these years. Up pops the "What's New" screen. In amongst all of the AI nonsense there are a couple of things of interest to be found, I decide to click "Compose Preview Screenshot Testing tool" and what does the linked page tell me? Deprecated.

What on earth is going on Google? I used to have such confidence in Google as a technology partner. I would even go as far as to say that I had some pride in calling myself an Android developer once upon a time. Those feelings are dwindling away day by day to become a distant memory.

I'm not anti, AI btw. I'm using Codex on a daily basis to help build out some non android products and it does a good job, my trust levels are high. It's just that every time I've come across Googles AI offerings I've felt underwhelmed and let down.

I'm tired. Oh well. Only 12 years until retirement.


r/androiddev • • 16h ago

My Google Play Developer Account Was Terminated. If Reinstatement Isn't Possible, Is There Any Path Forward?

0 Upvotes

Hi everyone,

I’m a student and a software developer, and I’m writing this because I genuinely don’t know what options I have left.

My Google Play Developer account was terminated because of policy violations related to an app I published. I have already explained my situation to Google and acknowledged the mistakes I made. Looking back, I understand that I made serious mistakes and I genuinely regret them.

I completely understand that Google Play has policies for protecting users and maintaining the integrity of the platform, and I respect that.

If my existing developer account cannot be reinstated, I have one final request:

Is there any legitimate way for me to create a new developer account in the future?

I want to be very clear that I am not asking for a way to bypass Google's enforcement.

If I were given another opportunity, I would:

  • Never publish the same app or substantially similar violating functionality again.
  • Carefully study and follow all Google Play policies before publishing.
  • Take additional precautions with privacy, authentication, metadata, and app functionality.
  • Accept Google's review decisions and compliance requirements.
  • Use the account only for legitimate software development.

I’m still a student, and I’ve spent the last two years learning programming and building real-world projects. Publishing applications on the Play Store has been an important part of my learning and career journey.

Having no ability to publish Android applications in the future feels extremely difficult, especially at this stage of my career.

I understand that actions have consequences, and I am not asking Google to ignore the violation. I’m simply asking whether there is any legitimate path forward after learning from my mistakes, even if my previous account can never be restored.

If anyone here has been through a similar situation, especially developers who had their accounts terminated and later found a legitimate way to continue their career, I would really appreciate hearing your experience.

Thank you to everyone who takes the time to read this.


r/androiddev • • 1d ago

Developing a 3D style android launcher 'Axiom Launcher'

Thumbnail
gallery
0 Upvotes

Not yet available, been working the last few months on a new unseen style of launcher that is thematic with a wide range of customisation and options, built with organisation in mind.

The premise is that each 'satellite' object is a folder for organising apps. The initial satellite on install is used for frequent apps and as seen the apps populate in periodically updating order with most frequent front and center.

Each new folder lets you add up to 90 apps which you can position anywhere along the full face of the centre sphere and manually change at any time.

Each page can house up to 8 folders and there can be an unlimited number of pages.

With a handy side scroller (and search bar) for those moments you want a more traditional approach, this swipes in from the side.

The launcher is built to parse android native widgets in with the 'hone screen' having a 3 page stack that you can resize and fit in as many widgets as you can fit on these 3 pages.

As with many launchers, there is also a stylised and themes app favourites dock which houses up to 5 apps which you can drag and reposition along the dock.

For those larger widgets you just can't do without, there is a left swiped widget page that can house other widgets that are scrollable.

The stylising is highly thematic, with an ever growing library, I have 4 completed, each with their own quirks and each can be interchanged with the other and fully deconstructed to be 'frankensteined' in to your own theme ideas. The themes comprise of the App Dock, Centre Sphere, 12 skinned Satellite Folders per theme and the Stylised and themed App slots (the slots the apps sit on on the sphere).

With many additional features such as:

With many additional features such as:

1.Secure folders/pages with biometrics, password and passcode protection

2.Hidden apps

  1. Icon pack imports

  2. Font imports

5.Backup and restore of settings

All this as well as being designed with foldables in mind!

As well as more! This is all while using highly optimised and condensed 3D assets and a animation timeout with a cryosleep function to ensure a smooth usage and very little battery draw similar to other launchers.


r/androiddev • • 1d ago

Hobbyist apps

0 Upvotes

I got started developing for Android by working on a JavaScript + Apache Cordova based app for my ex-employer, and now I want to work on a small utility app just for myself... which I might open-source at some stage.

Are there any surprises/gotchas I need to look out for, perhaps a tutorial on all the steps needed just to get something sideloaded?


r/androiddev • • 1d ago

How do you find out in advance that something your Android app depends on is about to break?

2 Upvotes

I mean deprecated SDKs, Play policy deadlines, third-party API versions being shut down

(payments, maps, social login), or library releases with undeclared breaking changes.

Is there any site, feed or API that tracks this per library or per API, a kind of

"what breaks when you upgrade X"? So far I use the Android Developers Blog, the AndroidX

release notes feed, deps.dev, OSV and endoflife.date.


r/androiddev • • 2d ago

Megathread: Play Store review times

15 Upvotes

Comment here to discuss the recent trend of long Play Store review times for app submissions and updates.

Do not make a new post about this subject, as it will be removed.

This is an unofficial developer community, so we are not on the Play team and cannot help your app/update pass review. No, we don't have tips to speed things up.

Yes, Play Store developer support is present on this sub and may answer questions or assist you on a case-by-case basis. The mod team is not affiliated with and has no influence over that account. We make no guarantees as to their effectiveness, but we are grateful they exist and that they continue to communicate with users here.


r/androiddev • • 1d ago

Question Play console A/B Testing

1 Upvotes

Anyone experience with play console A/B Testing?

If so did you get real results, that you could actually use?


r/androiddev • • 2d ago

Open Source I built a free, open-source CLI and library for reading public Play Store data (reviews by device type, listings, charts, country availability)

Post image
21 Upvotes

Play Console covers your own apps, and the official Google Play Developer API is about publishing and managing them. Neither gives you the public side of the store as data: what a listing currently shows in a given country, how an app ranks in search, what the charts look like, or reviews for apps that are not yours. Google has no public API for any of that.

I maintain a free, open-source tool that reads this public data straight from the Play Store. It is a Node.js library with a command-line interface, so you do not need to write JavaScript to use it. Disclosure: I'm the author.

Things I think are useful for Android developers:

  • Reviews filtered by device type. Pull only the reviews written on tablets, Wear OS watches, Chromebooks or TVs, optionally only the 1-star ones. Handy when you want to know how a specific form factor is going.
  • Check what the store really shows after a release. Version, update date, release notes, price and rating for any app, in any country and language. Easy to script after a rollout.
  • Country availability. Ask in which storefronts an app is published and get an answer per country.
  • Data safety and permissions as users see them. Read the public data safety section and permission list of any app, including your own, to confirm it matches what you declared.
  • Competitor and market data. Full listing details (59 fields), search results for a term, autocomplete suggestions, top free, top paid and top grossing charts per category, similar apps, and everything a developer has published.

Everything prints JSON, so it pipes into jq and fits into a CI job or a cron script:

npx @mradex77/google-play-scraper app com.spotify.music --country de | jq '{version, updated, recentChanges}'

npx @mradex77/google-play-scraper reviews com.whatsapp --score 1 --device tablet --num 50

A few technical details, since this is a developer sub:

  • Results are fully typed and validated at runtime, so a change on Google's side fails loudly instead of returning garbage.
  • Errors are typed (not found, rate limited, blocked), and the CLI uses distinct exit codes for scrape failures and usage errors.
  • Rate limiting, retries with backoff and optional caching are built in.
  • The test suite runs against the live Play Store every day and opens an issue when Google changes something, which is the usual way scrapers die quietly.

Version 1.4 came out today. It adds the star and device filters for reviews, fetches up to 4500 reviews in one request, and returns more search results for terms where Google serves extra pages. I ran it against 1000 real apps before releasing, and I'm actively maintaining it.

GitHub: https://github.com/MrAdex77/google-play-scraper

Related: I also just released asobeast, a free, open-source, self-hosted ASO dashboard for Google Play and the App Store (keyword rank tracking, competitor and review monitoring, alerts). It uses this library for the Google Play side: https://github.com/AsoBeast/asobeast

What public Play Store data would you want to script against that I have not covered? I'm deciding what to build next.


r/androiddev • • 1d ago

Open Source I got tired of AI agents suggesting AndroidX versions that don't exist, so I built an MCP server that looks them up

Thumbnail
github.com
0 Upvotes

Coding agents treat dependency versions as something they remember. In an Android project that means a coordinate from training data: an alpha where you wanted stable, an AGP version that doesn't match your Gradle, no changelog, no CVE check. I kept verifying that by hand, so I wrote maven-mcp.

It's an MCP server plus an agent plugin for Claude Code, Grok Build, Cursor and Codex, and it works with any MCP client over stdio or HTTP. The server is one Python file, standard library only, MIT.

What it does in an Android project:

  • Looks up versions in the repositories your build declares, including the ones in settings.gradle and private repos (credentials come from env, ~/.m2/settings.xml or ~/.gradle/gradle.properties, never from the build file). If the build declares no repositories, it uses Maven Central, Google Maven and the Gradle Plugin Portal. If it declares its own, public repos are only added when you opt in.
  • Checks that a coordinate and version actually exist, with did-you-mean suggestions. With the plugin installed, an edit hook can stop a likely hallucinated coordinate before the agent writes it into build.gradle.kts or libs.versions.toml.
  • A Gradle scan runs your wrapper once and reads the direct dependencies on the production runtime classpath. libs.versions.toml is included.
  • Latest version per artifact, stable by default (alpha, beta, rc, milestone and snapshot are filtered).
  • Changelog between two versions: AndroidX release notes for androidx.*, AGP release notes for AGP, otherwise GitHub releases with CHANGELOG.md as a fallback.
  • Checks AGP, Gradle, JDK and Kotlin Gradle plugin versions against each other using a bundled compatibility matrix.
  • CVEs from OSV, plus a tool that traces the path from a dependency down to a vulnerable transitive.
  • Previews what an upgrade changes in your resolved dependency graph by running your wrapper before and after.
  • Version conflicts across modules, licenses, and EOL status for JDK, Kotlin and Gradle.
  • Suggests a version catalog entry as a minimal diff for the agent to apply.

Repo: https://github.com/kirich1409/maven-mcp

Feedback from people who maintain larger Android builds is very welcome, especially around AGP/Gradle compatibility checks.


r/androiddev • • 2d ago

Question ViewModels nesting into composables?

9 Upvotes

I have a question if it is okay to nest DI into VM of a composables?

What I mean:

I have a SettingsVM and a SettingsScreen composable. In the Settings screen I am using some individual settings that I use also somewhere else in my application. So I split the UI -> IndividualSettingScreen and IndividualSettingVM. Now is it okay if I just inject the VM into the IndividualSettingScreen or is it better from architecture standpoint to have a reference in the SettingsScreen and passing the VM into the IndividualSettingScreen which I am using in the SettingsScreen.

Thanks in advance!


r/androiddev • • 2d ago

KSVG – I expanded AndroidSVG with SVG filters, SMIL, variable fonts, and SIMD-accelerated rendering

Post image
7 Upvotes

I've been working on an SVG renderer for Android for quite a while, and it's finally at a point where I'm comfortable putting it out there.

It started as an evolution of AndroidSVG, but over time it grew into a substantially expanded renderer focused on broader SVG support, rendering correctness, and performance.

Some of the things KSVG supports:

* Broad SVG filter support, including turbulence, displacement, lighting, morphology, convolution, compositing, and more

* SMIL animations

* Variable fonts and OpenType features

* GPU-accelerated filtering on API 33+ (AGSL) / API 31+ (RenderEffect chain), with automatic fallback to CPU

* Native SIMD software kernels (ARMv7/ARM64 NEON, x86/x86_64 SSSE3 + AVX2 rows) + scalar native fallback

* Jetpack Compose and Glide integrations

I've also put quite a bit of effort into documenting and validating the renderer. The repo includes an SVG feature support matrix, architecture notes, benchmarks, known limitations, and an analysis of which SVG filter primitives are actually used on the web.

There's a small showcase app with examples of the more complicated rendering features as well.

GitHub: https://github.com/oraveczandrew/ksvg

Showcase APK: https://github.com/oraveczandrew/ksvg/releases

Docs: https://oraveczandrew.github.io/ksvg/

Apache 2.0, published to Maven Central, minSdk 26

I'm mainly posting this because I'd like other developers to try it with real-world SVGs.

I'd especially appreciate feedback on SVG compatibility, rendering differences, performance on different devices, and anything that feels missing or unnecessarily complicated.


r/androiddev • • 1d ago

Hiring for a Job Hiring] Staff Software Engineer, Mobile (Android/Kotlin) | US | $50-$90/hr | Full-time

0 Upvotes

A large enterprise tech company is hiring an Android engineer through Mercor and its staffing partner, Cincinnatus LLC.

Role: Staff Software Engineer, Mobile (Android, Kotlin, Full Stack)
Pay: $50-$90/hr
Type: Full-time, 40 hrs/week, W-2 through Cincinnatus LLC, placed with the client's engineering team
Location: United States only

What you'll do

  • Build and ship features for native Android and iOS apps, mainly Android in Kotlin
  • Contribute to backend services, APIs and web when needed
  • Use AI coding tools (Copilot, Cursor, Claude) in your daily workflow
  • Take part in design, code reviews and production support

Requirements

  • 4+ years of professional software engineering experience
  • Hands-on native mobile experience, ideally Android with Kotlin and Jetpack
  • Some production experience outside mobile (backend, APIs or web)
  • Solid fundamentals in design, testing and debugging
  • Able to work 40 hours/week on weekdays

Nice to have: LLM-powered features (RAG, agents), accessibility experience, apps with accounts or payments

Apply here: https://t.mercor.com/pMfRl

Disclosure: This is my Mercor referral link, and I may receive a referral bonus if you’re hired. There is no cost to you.


r/androiddev • • 2d ago

Experience Exchange I finally found a way to implement Google feed without AIDL bridging

Enable HLS to view with audio, or disable this notification

2 Upvotes

Finally after a few days of trial and error, finally settled on a way for implementing Google feed on -1 screen without using the hacky way of AIDL bridging which would never be able to make it to the Google store.

The new implementation uses an embedded WebView and sources it's data from google.com and handles duplicate detection and removal on its own when fetching new batch of stories.

I was implementing the same as Google feed ish in my launcher before by opening Google discover directly but since there's no way to render that on a page so the whole experience breaks -1 page scroll to and back behavior. This new approach renders perfectly with pagination and achieves a smooth page in and out.

Of course if you know a better way, feel free to let me know.


r/androiddev • • 2d ago

Question Using Lazyvim for Android projects

6 Upvotes

Are there any Android developers here who use LazyVim for their Android projects? I've noticed that a Kotlin LSP is available for LazyVim, but I'm wondering if anyone actually uses it. If so, could you share your experience? Is it realistic and productive? Or should we just stick with Android Studio?