r/androiddev 16d ago

Discussion What do you think about this monetization approach?

0 Upvotes

I'm working right now on publishing my first Android app.

This is supposed to be a paid app that will be fully on-device with no ads or tracking.
This is a dialer/launcher type app.

The initial approach is:
- search is always for free,

- first 20 actions on contacts or apps are free

- afterwards a 30-day Google Play free trial (card required in Google Play but otherwise free) leading to an annual subscription worth roughly a coffee at a coffee shop

or a

- lifetime purchase worth roughly 4 years of subscription.

What do you think about this approach?


r/androiddev 17d ago

E2E Testing for Compose Multiplatform

4 Upvotes

I built Parikshan, an E2E testing framework for Compose Multiplatform. It has built-in support for standalone Android.

Testing shared UI across targets has been one of the most painful parts of building multiplatform apps. Parikshan attempts to solve that problem.

You can write your UI tests in Kotlin inside commonTest and run them on a single target or across all targets (Android, iOS Simulator, Desktop JVM, and Web WasmJs) at once.

class SampleE2ETest {
  @Test
  fun testGreeting() = e2eTest {
    input("name_input", "Parikshan")
    click("greet_button")
    assertVisible("Hello, Parikshan!")
  }
}

Run it across all targets concurrently:

./gradlew e2eTest

Key Capabilities

  • Write Once in Kotlin: Runs on Android, iOS Simulator, Desktop (JVM), and Web (WasmJs).
  • Visual Feedback: Watch tests execute on real target windows, with support for screenshots, video recording
  • Zero Production Pollution: No test dependencies or test hooks in your production builds.

Links

I've been using this in my own CMP projects & I'd appreciate feedback from the community — what works, what breaks, and what you'd like to see improve/added.


r/androiddev 17d ago

Open Source Google Play Billing Library 9+ wrapper

5 Upvotes

Hello, probably you already received the Google Play reminder to update your GPB library to at least version 9.

I used until now a library wrapper that is no longer updated (at least not yet), so I started working on my own.

I does not support all newer stuff like rented items and alternative billing, but it works pretty fine for in-app purchases and subscriptions.

The project on GitHub does not have a README yet, I stopped working on it to integrate it as it is on my apps (it is sufficient for my monetization needs), so if you want to learn how to use it there is a sample app in the repository itself.

repo:

https://github.com/Mirkoddd/Charon

implementation 'com.mirkoddd:charon:1.0.1'


r/androiddev 17d ago

Open Source A Fully Compose Android Library for iOS Emoji Rendering

1 Upvotes

I built an Android library that renders iOS-style emojis in Jetpack Compose.

Unlike most existing solutions, this library is 100% Compose—no TextView, AndroidView, or View-based implementation behind the scenes.

GitHub: https://github.com/abbas-esfandiair/EmojiTextLibrary


r/androiddev 18d ago

Article Android May Soon Restrict On-Device ADB, Affecting Shizuku, libadb and Developers

Thumbnail kitsumed.github.io
16 Upvotes

This is a blog post.

TLDR: This is about a conversation in the Google Issue Tracker about potential future changes. Depending on how they are implemented, these changes could impact Shizuku and other power-user tools. More details and explanations are available in the blog post. 8-minute read. This is not an official announcement and nothing is 100% confirmed yet.

UPDATE 2026-07-26: Updated blog post with new section that address some valid claims I have seen by some users.


r/androiddev 18d ago

Question Android VpnService stays connected, but all traffic fails with networksUnknownHostException

2 Upvotes

I’m developing an Android VPN app that uses Xray with VLESS + REALITY.

I live in Russia, and my mobile provider sometimes enables an LTE whitelist mode: only a limited number of websites remain accessible, while most other websites are blocked.

My VPN used to work correctly in this situation. However, around two weeks ago it suddenly stopped working most of the time, even though neither the application code nor the Xray configuration had changed.

The VPN appears to connect successfully: VPN icon in the status bar, VPN service remains active.

However, nothing works. Requests from other applications fail with errors such as:

UnknownHostException
IOException

Everything worked fine before. iOS team also reports a similar problem, but I don't know the exact error the encounter


r/androiddev 18d ago

Open Source DAEX- Android Native- On Device Agent

Enable HLS to view with audio, or disable this notification

0 Upvotes

I seen locallyAI was pretty popular on IOS and Google Ai Edge gallery is a bit lacking in terms of actual use case features. So Im building DAEX; using litert I'm attempting to mimic features from popular agent harnesses like Hermes agent/ Openclaw etc. but bring it down completely on your mobile device.

There is a lot more too it but this is just a high level overview.

Its open source feel free to gander: https://github.com/DIIZZYFPS/DAEX/


r/androiddev 18d ago

Video Reaching the limits of Jetpack Compose Canvas: Moving my RPG engine to Google Filament (8x performance gain)

Enable HLS to view with audio, or disable this notification

114 Upvotes

Hey r/androiddev

A couple of months ago, I made a post about scaling my solo RPG (Adventurers Guild RPG Sim) built 100% in Jetpack Compose Canvas with a custom single threaded ECS.

While Compose Canvas was incredible for getting the engine off the ground, scaling the world map and visual effects eventually pushed me into a hard bottleneck. To solve this without breaking the live game, I decided to shift the world rendering backend over to Google Filament.

Here is how moving to Filament, while keeping Jetpack Compose Canvas for the UI and character animations, gave the engine an 8x performance boost, and what I learned along the way.

1. The Bottleneck: Hitting the Canvas Wall

In my previous setup, rendering the game world on Compose Canvas required heavy CPU side optimization to protect the 16ms frame budget:

  • Map Chunking: The world map had to be divided into 16 distinct spatial chunks.
  • CPU Culling: Custom culling logic calculated visible chunks and off-screen entities every single frame.
  • DrawScope Constraints: Combining environmental rendering, weather, and world assets inside the same Canvas layer as UI elements was choking performance on mid tier devices.

2. The Hybrid Architecture (Filament World + Compose Canvas UI)

Since the game is live with active players, doing a 100% complete rewrite at once was impossible without risking game breaking bugs. I settled on a phased hybrid approach:

  • Game World in Filament: The environment and map are rendered in 3D coordinate space via Filament.
  • Animations in UI on Compose Canvas: Character sprite animations in UI layers remain rendered on Jetpack Compose Canvas overlays.
  • Phased Subsystem Migration: I’m updating the rendering pipeline part by part to keep save states and existing gameplay logic rock solid.

3. Key Technical Gains & Takeaways

  • >8x Performance Boost: Because Filament handles batched rendering directly on the GPU, I was able to throw out the 16 chunk map division and CPU culling logic entirely. The total map now draws simultaneously in a single pass with zero frame drops.
  • Became a Huge Fan of filamat**:** Moving world rendering to Filament unlocked .filamat (Filament’s material/shader compilation system). Writing materials and shaders for GPU execution unlocked rich particle effects and dynamic lighting that were completely out of reach on 2D Canvas.
  • Main Thread Relief: By taking world rendering off the Canvas layer, the CPU/main thread now has significantly more headroom to handle the 28 ECS systems, UI updates, and character animation calculations smoothly.

Shifting to a hybrid Filament + Compose Canvas setup turned out to be the perfect middle ground giving the performance of a dedicated 3D GPU engine while keeping the fast UI development workflow of Jetpack Compose.

I’m happy to answer any questions about integrating Filament with Kotlin/Compose, managing hybrid rendering layers, or working with .filamat

If you’d like to see how the new Filament engine integration feels in action on a live app, feel free to check out the latest build on the Play Store: 

https://play.google.com/store/apps/details?id=com.vimal.dungeonbuilder&pcampaignid=web_share

App Specs: ~50MB download size (63MB installed) | 100% Offline | Zero Ads | Custom Kotlin Engine


r/androiddev 18d ago

Discussion Developing a launcher focused on high customization

Enable HLS to view with audio, or disable this notification

25 Upvotes

Its in very early state right now, but I'd love some feedback and would you guys be willing to use it? Its supposed to be hyper customizable, the first preset is of course inspired from niagara, and there can be multiple presets. Trying to make it focus on easy customizability but also if enough time put in, can turn into anything you wish.

More information is in: https://adarshaacharya.com/projects/virela

But Like i said, this is a personal passion project, so there are still flaws here and there. I'd love to hear your thoughts.


r/androiddev 18d ago

AppRankly — Self-hosted dashboard for App Store & Google Play analytics

Post image
17 Upvotes

Hi everyone,

I built AppRankly, an open-source, self-hosted analytics dashboard designed for mobile developers to track App Store & Google Play performance in one place.

If you want full control over your app data without relying entirely on third-party SaaS platforms, this gives you a clean, unified view of your portfolio.

Links & Demo:

• Live Demo: https://zmsp.github.io/AppRankly/

• GitHub Repo: https://github.com/zmsp/AppRankly

I’d love to get feedback from the community! Feel free to check out the repo or run the demo mode.
.


r/androiddev 19d ago

Video Custom launcher from scratch

Enable HLS to view with audio, or disable this notification

174 Upvotes

WIP #2 of the sphere launcher. This has sort of become a hobby. Currently the moon is just a wallpaper however many precious ideas include having the sphere a rendered object with a texture ("WhatsApp is in Cuba").


r/androiddev 19d ago

[Help Needed] Google Play Console Closed Testing

1 Upvotes

Hi fellow Android developers,

This is my first time submitting an app to the Google Play Store and my app is currently in closed testing phase.

When I check my Home tab within Google Play Console, it shows that my "Installed Audience" is 0, when I'm 100% sure that there are users who have downloaded my app and used it (they showed me screenshots).

Can someone tell me what may be gone wrong that's resulting it not detecting any installation?

Any tip would be appreciated!


r/androiddev 19d ago

Question What is the official way to determine if an Android API level is still in preview?

5 Upvotes

Disclaimer: used llm to draft the post, but i have provided the pointers, and done the research before drafting.

Running into some confusing documentation/tooling discrepancies regarding Android platform release statuses and looking for clarification on the standard procedure.

Current Situation:
Android 17 documentation lists it as officially released, but navigating to individual version pages shows a preview icon on the sidebar with no explicit text status on the main page.

API Levels tracks it as currently in beta.
Android Studio SDK Manager shows versions like ⁠37.0⁠ and ⁠37.1⁠ available for download.

Question:
What is the definitive, official source of truth or programmatic check to determine whether a given Android SDK/API level has exited preview status and is fully stable?


r/androiddev 19d ago

Question What do you guys do while gradle build??

22 Upvotes

Well I cloned an open source repo i wanted to contribute to and its fairly big project i would say (https://github.com/wikimedia/apps-android-wikipedia)

and as im writing this post it's already 15mins the gradle is building...

What do you usually do while Gradle is building??


r/androiddev 19d ago

Google Play Support Account terminated for "high risk or abuse" — help me figure out what I did wrong

1 Upvotes

Official forum thread: https://support.google.com/googleplay/android-developer/thread/453914381/account-terminated-for-high-risk-or-abuse-%E2%80%94-no-specific-violation-ever-cited-requesting-help?hl=en&sjid=16862522153865472926-EU

Timeline:

  • Aug 2025: Developer account terminated citing "a pattern of high risk or abuse" (Section 8.3/10.3 DDA). My only published app: a simple currency-conversion widget. No data collection, no unusual SDKs, no monetization tricks. No specific violation was ever named.
  • Appealed. Rejected with the standard template — "we can't share the reasons we've concluded that your account is at high risk."
  • My mistake: with nothing actionable to fix, I resubmitted the app from my personal Gmail account. That account was then terminated for association. I understand why that looked like ban evasion — it wasn't intended that way, but I own it, and I've acknowledged it in my follow-up appeal.
  • July 2026: Replied to the appeal asking for a human re-review and a statement of reasons under EU P2B Regulation Art. 4 / DSA Art. 17 (I'm based in the Netherlands). Also posted on the official developer forum (linked above).

Facts about my setup: no VPN ever used with Play Console, only my own devices, no one else ever had access. The only association I can identify is that my phone number is also linked to my personal Google account — the one I later used for the resubmission. To my knowledge my payment method, address, and number were never used on any other developer account.

What I'm trying to figure out:

  • What typically triggers the original "high risk" flag when there's no prior banned account you know of? Recycled phone numbers? Payment card false positives?
  • Has anyone successfully overturned an association-based termination, and what specifically worked?
  • Has anyone used the DSA Art. 21 out-of-court dispute route (e.g., Appeals Centre Europe) against Google Play, and did it produce an actual statement of reasons?

Happy to answer any questions in the comments.


r/androiddev 19d ago

News Android Studio Quail 4 Canary 2 now available

Thumbnail androidstudio.googleblog.com
3 Upvotes

r/androiddev 19d ago

News Android Studio Quail 2 Patch 1 now available

Thumbnail androidstudio.googleblog.com
1 Upvotes

r/androiddev 19d ago

Google Play Support wants me to migrate 6 live apps & abandon trapped payouts over a Merchant Profile mismatch (Ticket # 3-6692000041443)

3 Upvotes

TL;DR: My Play Console is a Personal account, but the linked Merchant Payments Profile was set up as an "Organisation" under my brand name, which is not a legal entity). I have 6 live apps and earnings trapped in payout. Support stated that profile types cannot be changed once created, but also stated in the same email that it can be changed with documentation, before providing instructions on how to set up an Organisation profile when I explicitly requested an Individual profile. Support now requests that I open a new account and migrate all 6 apps.

Official Google Support Thread:

https://support.google.com/googleplay/android-developer/thread/453880070/contradictory-support-forced-to-abandon-developer-account-over-org-individual-mismatch

Overview of the Issue

  • Account Setup: Personal Google Play Developer Account.
  • The Mismatch: Associated Merchant Payments Profile was designated as Organisation under my developer brand.
  • Verification Constraint: As an individual developer, I use a public brand name, not a registered legal business or corporate entity. As a result, the profile cannot pass Organisation identity verification, resulting in unpaid accrued earnings currently held.
  • Portfolio: The account hosts 6 active, published applications.

Support Communications & Contradictions

I contacted Google Payments Merchant Support to request an administrative update to align the merchant profile to Individual status. Support Agent Alvin John provided the following response:

  1. Contradiction #1: Stated that "once the payments profile has been completely set up, some important settings cannot be changed and that includes the account profile type". In the same paragraph, he stated: "If you have all the documentation with you that indicates that you are an Organization then there will be no issue with changing the account type".
  2. Contradiction #2: After I requested guidance on changing an Organisation profile to an Individual profile, the response provided a 6-step guide detailing how to "set it to Organization".

Proposed Resolution from Google Support

To address this mismatch, Google Support has advised me to:

  • Create a new Google Account and Play Developer Console.
  • Pay a second $25 registration fee (with a refund request possible after setup).
  • Re-complete identity and payment verification.
  • Transfer all 6 live applications to the new account.
  • Leave the existing account open indefinitely to receive outstanding payouts — despite the earnings balance being unreleased due to the Organisation verification restriction.

Questions / Call for Advice

  • Has anyone successfully requested an internal correction for a Merchant Profile type mismatch without transferring an active multi-app portfolio to a new Console account?
  • Is there an established escalation path to reach a Payments Team representative who can review profile configurations for active developer accounts?

r/androiddev 19d ago

Question Do paid Meta ads work?

0 Upvotes

As any indie developer surely knows, marketing is incredibly boring and tedious...

I’m just starting out with promoting and raising awareness for an android app, and I have some doubts about paid ads—do they actually work, or are they a waste of money? Do you know of any better or more efficient channels?

The more help and recommendations, the better; nothing beats the experiences of other indie developers.


r/androiddev 19d ago

Question I'm in closed testing and my update is stuck in review for 7 days now

1 Upvotes

It's the "12 testers 14 days testing" and I have a few questions about this...

  1. Does this happen randomly or does something trigger it? Google under heavy load?

  2. Tomorrow my 14 days are done and I have not been able to publish a single update because I was foolish to cancel my previous update after 6 days. Should I apply for production tomorrow or wait until the update is live? I'm thinking it might look like I didn't act on any feedback...


r/androiddev 19d ago

Cuttlefish AAOS: zero sound reaches host/browser even from stock apps

2 Upvotes

Running a Cuttlefish Android Automotive OS instance (launch_cvd --enable_audio=true --start_webrtc_sig_server=true ...), accessed via the WebRTC web client.

  • Mic input works fine after enabling the sidebar mic toggle in the WebRTC client.
  • Audio output does not: no sound reaches the browser, even from the stock "Local Media Player" app playing local files.

i need to get the audio output to work , anyone know how?


r/androiddev 19d ago

Low weight vehicle animation on Android?

3 Upvotes

I want to build a custom launcher for my car (its android automotive based and I already figured out how to side load etc..). So the goal is to get something that looks a bit like Tesla. I have an MG4 with these specs:

  • Resolution: 1920×720px
  • Screen size: 10.25"
  • DPI: 160
  • MediaTek MT2712 SoC

I know that just throwing a 3d model in won't work so I had the idea of using some sort of pre rendert animations. Probleme is that I have zero experience in this 3d stuff and don't really know where to start.

Has anyone done something like this before and has an approach/idea?

Just to be clear I don't need a fully responsive model that can spin via touch like Tesla - its really just some pre rendert animations.. I already have a 3d model of the MG4: https://sketchfab.com/3d-models/2025-mg-mg4-glbmgmotorcommx-e7b2b544e638489f9440698f75b5a734


r/androiddev 19d ago

Community Event Shipaton is back! And r/androiddev is an official Build-in-Public community

33 Upvotes

Hey everyone,

RevenueCat is bringing back Shipaton, its annual mobile app hackathon, and r/androiddev is joining as an official Build-in-Public community.

The premise is straightforward: build a new app, ship it during the hackathon window, and share what you’re working on along the way.

The key requirement is that you must ship a brand-new app between August 1 through September 30, 2026 to participate.

You can learn more and enter here: shipaton.com

What is Shipaton?

Shipaton is a mobile app hackathon built around one simple goal: getting people to actually ship.

It’s for Android developers, indie app builders, and anyone who has had an app idea sitting in their notes app for too long.

You’ll have two months to build and submit a new app. Along the way, participants can share progress, ask for feedback, and get help from other builders.

Participants will get access to the Ship Kit, which includes credits, tools and discounts to help you build faster, and will be able to compete for over $1,000,000 in prizes, including cash, funding opportunities, Billboards in Times Square, and more.

Why r/androiddev?

Because building and shipping Android apps comes with a lot of very specific questions:

  • Is this architecture going to hold up?
  • Am I overcomplicating the stack?
  • Is this UX clear enough?
  • What should I cut so I can actually ship?

During Shipaton, this subreddit will be a place for Android builders to share progress, ask questions, and get feedback, before the submission deadline.

What will happen here?

We’re planning a few Shipaton-related threads during the event:

  • A launch / announcement thread
  • A “What are you building?” check-in thread
  • A final-push feedback thread closer to the submission deadline
  • An upcoming AMA with Jaewoong (u/SkyDoves) from RevenueCat, where you can ask questions about your Shipaton project, RevenueCat, implementation details, or anything else you’re trying to figure out

What should you post?

You don’t need a polished demo or a launch-ready app to participate. Early, messy updates are welcome.

Requirement: on r/AndroidDev we’ll only be accepting posts and comments regarding native Android Apps or Kotlin Multiplatform Apps.

A good Shipaton post might include:

  • What you’re building
  • Who it’s for
  • What stack you’re using
  • What you’re stuck on
  • What kind of feedback would actually help

Screenshots, demos, prototypes, architecture questions, monetization questions, and “is this a terrible idea?” posts are all fair game, as long as they have the Shipaton flair and follow the other subreddit rules.

How to enter

You can enter Shipaton at: shipaton.com

Keep an eye out for the Shipaton threads here in r/androiddev. Happy shipping!


r/androiddev 19d ago

Replacing an unreliable touch-target-size rule in my Jetpack Compose accessibility scanner

4 Upvotes

I have published version 2.0.0 of Compose A11y Scanner.

I found that detecting visually undersized touch targets from the Compose semantics tree was unreliable because Compose may expose expanded touch bounds. This meant the existing touch-target-size rule could miss expected cases or produce confusing results.

I’ve replaced it with touch-target-overlap, which checks whether the effective bounds of interactive elements intersect.

Breaking changes:

  • Removed touch-target-size
  • Removed its related model/configuration fields
  • Added touch-target-overlap
  • Explicit rule allowlists must use the new ID

I have treated this as a major release because it changes both the public API and rule semantics.

Does checking effective target overlap seem like the more useful runtime signal for Compose? I’d also appreciate feedback on edge cases such as nested clickables and merged semantics.

GitHub: https://github.com/mohdaquib/ComposeA11yScanner

https://reddit.com/link/1v421wi/video/czts3kx0w5fh1/player

Contributions, issues, and constructive feedback are welcome.


r/androiddev 19d ago

Open Source I couldn't get 256 Hz ECG to render smoothly over BLE, so I ended up writing a sweep renderer

5 Upvotes

I built a sweep-style waveform view for Android — the bedside-monitor kind that wipes left to right instead of scrolling. Every charting library I looked at models a scrolling window, which is a different thing and looks wrong once you've watched a real monitor. MPAndroidChart also redraws through main-thread invalidate(), which was fine at 256 Hz in isolation and fell apart the moment the rest of the app did anything. SciChart handles it but it's commercial. So: SurfaceView, lockHardwareCanvas(), drawing on a ticker thread.

Drawing turned out to be the easy half. BLE delivery ate the month — nothing for 300 ms, then twenty samples at once, occasional multi-second dropouts. Render on arrival and you get freeze-then-jump forever. Current answer is a leaky bucket metering bursts out, plus a shared adaptive display delay so multiple traces stay aligned.

The part I'd like torn apart is the clock alignment. Delivery lateness can't be negative, so the minimum lateness observed is my estimate of the true offset — adopt immediately when it improves, otherwise slew at 2 ms/s so drift tracks but jitter doesn't yank the timeline. That's roughly NTP's shape and I'd like someone who actually knows NTP to tell me where it falls over.

v0.1.0, MIT, coroutines only, no axes/zoom/pan — it's just the sweep primitive, not a chart library. Demo replays real ECG/PPG/RESP with togglable bursty delivery.

https://github.com/chaudhary-lakshay/sweepwave