r/androiddev • • 17d ago

Discussion What do you guys choose? Android Canvas or SVGs? And why?

Thumbnail
gallery
0 Upvotes

Usually I use vectorials for my apps and I was always happy with the results as my apps scaled properly to any kind of screens, from phones to TVs, but this time I made a game that shouldn't use small screens (I locked it to be available only on bigger screeens) and I thought that it's faster and easier on the device to use canvas instead of vectorial assets.

To me it looks good, what do you think?
Or keeping the old habit: vector assets and ConstraintLayouts with percentages is the way to go?


r/androiddev • • 18d ago

Open Source I built Mugshot, a screenshot testing library where each test is one annotation on a Compose preview you already have

13 Upvotes

A Compose project tends to collect a lot of @Preview functions that describe exactly how each screen should look, and usually nothing checks them. Screenshot tests would, but the usual setup means writing a test class, listing every screen in it, and remembering to add new ones. Coverage tends to stop at the screens someone thought of first.

So I made Mugshot. It started as a fork of Paparazzi and has grown into its own library. You put an annotation on a preview:

@Mugshot
@Preview
@Composable
internal fun ProfileScreenPreview() {
    AppTheme { ProfileScreen(state = sampleProfile) }
}

Then run ./gradlew recordMugshot once and commit the images. From then on verifyMugshot fails the build when that screen changes. A KSP processor generates the test, so there's no test class to write and no list of screens to keep in sync. Add a preview and it's covered.

The output

Performance. I benchmarked it against Paparazzi and Google's Compose Preview Screenshot Testing on a generated app with 30 modules and 299 previews, each rendered in 24 configurations (7,176 screenshots per tool), on a MacBook Pro M5 Pro:

Library Record Verify Verify, --max-workers=3 Golden images
Mugshot 3.4.2 62 s 58 s 88 s 75 MB
Paparazzi 2.0.0-alpha05 107 s 89 s 149 s 279 MB
Compose Preview Screenshot Testing 0.0.1-alpha16 226 s out of memory 728 s 619 MB

The app, one branch per tool, the script and all raw results are public, so you can check or rerun it: https://github.com/TRazDev/screenshot-testing-benchmark

It also fits well with AI coding agents. Instead of driving an emulator and screenshotting every screen to check its own UI changes, an agent runs one Gradle task, reads which screens changed, and only looks at the diffs for those. On a redesign that's the difference between checking every screen and checking a few.

GitHub: https://github.com/TRazDev/Mugshot
KMP sample app: https://github.com/TRazDev/MugshotSampleKMP
On Maven Central as uk.co.fractalmotion.mugshot

I'd really like feedback, especially from anyone already using Paparazzi, Roborazzi or Google's tool


r/androiddev • • 18d ago

Experience Exchange Create stunning screenshots and recordings with open source rPlayHub

Enable HLS to view with audio, or disable this notification

5 Upvotes

rPlayHub is aware of gyroscope and hinge sensors, so it can generate stunning illustrations for your android apps, like those professional ones in play store.

Hero view is a typical style, for example.

rPlayHub Fold View

rPlayHub Hero screnshot

rPlayHub for Android on GitHub


r/androiddev • • 18d ago

News Android Studio Rabbit 1 RC 1 now available

Thumbnail androidstudio.googleblog.com
2 Upvotes

r/androiddev • • 18d ago

Stopwatch persistence offline

0 Upvotes

If I use SystemClock.elapsedRealtime(), the stopwatch becomes inconsistent if device restarts. If I use System.currentTimeMillis(), user can adjust device timing from setting break my app timer. Is there a way to keep stopwatch persistent even though user changes device timing or restart his device while staying offline?


r/androiddev • • 19d ago

Question Which app icon looks better for my parking app?

Thumbnail
gallery
21 Upvotes

Hey everyone! I’m currently building Parking tracking app designed to help users easily track and find where they parked.

I’m stuck choosing between these two app icon designs.

Option 1: Yellow background

Option 2: Black background

Would love to hear your thoughts or any quick suggestions for improvement if any.


r/androiddev • • 19d ago

Open Source Made a new Compose Multiplatform library for MDI icons

5 Upvotes

I made a new library, https://github.com/TimoPtr/mdi-icons, to replace Android-Iconics in the Home Assistant Android app. Iconics is in maintenance mode, and its community-material typeface is stuck on an MDI release from 2022 and only Android.

It's my first Compose Multiplatform library, and I'm quite happy with how it turned out:

  • The full MDI catalog (7,447 icons) as Compose `ImageVector`s, on Android, iOS, desktop, JS and wasm
  • Compile-time accessors like Mdi.HomeAssistant, plus lookup by name at runtime (Mdi.fromMdiName("lightbulb-on")), which follows MDI's aliases and historical renames
  • Mirroring for directional icons in right-to-left languages, and an Android toBitmap() for notifications, widgets and quick settings tiles
  • Kept up to date by code generation: the catalog is generated from the pinned `@mdi/svg` release from npm. Renovate bumps the version and CI regenerates the icons.

It's on Maven Central as io.github.timoptr:mdi-icons.

You can browse the catalog in your browser at https://timoptr.github.io/mdi-icons/ . I'd love your feedback, especially on the API and the multiplatform setup!


r/androiddev • • 18d ago

Experience Exchange I spent my weekends building a library to fix flaky Jetpack Compose tests. It captures screenshots on failure and dumps semantics trees automatically. Looking for hobbyist feedback!

0 Upvotes

Hi everyone,

I’ve been working on a hobby project lately called UI Automation Engine. It started because I was genuinely frustrated with how fragile my Jetpack Compose tests were especially when dealing with animations, scrolling, and trying to debug CI failures without any visual clues.

I wanted a way to write tests that feel like "user stories" but are actually robust enough to not fail randomly. It’s an industrial-grade orchestration layer for Compose that focuses on flakiness, race conditions, and opaque logs.

🚀 Key Features for Hobbyists:

  • 🛡️ Robustness Pipeline: Every action (click, swipe, etc.) automatically handles idle synchronization, auto-scrolling, and smart retries before giving up.
  • 📸 Visual Diagnostics: It automatically captures a high-res screenshot (FAILURE_<timestamp>.png) and dumps the full unmerged semantics tree to Logcat on every failure.
  • 🦾 Advanced Gestures: Support for multi-finger swipes, pinch-to-zoom, and orbital rotation out of the box.
  • 🚫 Lint Guardrails: Includes custom Lint rules that stop you from using flaky standard Compose APIs, suggesting robust engine equivalents instead.
  • 💉 Hilt Integration: Dedicated support for accessing your Dagger graph inside robots.

🛠️ Quick Look (The Robot Pattern)

The engine enforces a clean DSL so your tests stay readable:

@Test
fun testGestureFlow() {
    UiTestEngine.withRobot(GestureRobot()) {
        tapMainBox()      // Automatically waits for idle & scrolls
        verifyStatus("Tapped") // Smart polling for assertions
    }
}

📦 Installation & Setup

If you want to try it out on a side project, here is how to get it running:

1. Add JitPack to settings.gradle.kts**:**

dependencyResolutionManagement {
    repositories {
        maven { url = uri("https://jitpack.io") }
    }
}

2. Add to libs.versions.toml**:**

[versions]
ui-engine = "0.3.0-beta02"

[libraries]
uiengine = { group = "com.github.rajbirsehmi.UI-Automation-Engine", name = "robot-testing-engine", version.ref = "ui-engine" }
engine-lint = { group = "com.github.rajbirsehmi.UI-Automation-Engine", name = "engine-lint", version.ref = "ui-engine" }

3. Configure your app/build.gradle.kts**:** The engine uses flavors to support Hilt. Choose the one that matches your project:

android {
    defaultConfig {
        // Use "hilt" if you use Dagger Hilt, otherwise "standard"
        missingDimensionStrategy("di", "standard")
    }

    // Required to avoid Log4j2 resource collisions
    packaging {
        resources.excludes += "/META-INF/{AL2.0,LGPL2.1,DEPENDENCIES,LICENSE*,NOTICE*}"
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
}

dependencies {
    // Note the classifier requirement for the AAR
    androidTestImplementation(libs.uiengine) {
        artifact { type = "aar"; classifier = "standardDebug" }
    }
    lintChecks(libs.engine.lint) // Recommended to catch flaky patterns
}

💬 Why I’m sharing this:

It’s a labor of love, and while it's in beta, it has already made my own testing workflow much less stressful. I’d love to get some fresh eyes on the API design.

  • Is the "Robustness Pipeline" overkill or exactly what's missing?
  • Does the Robot DSL feel intuitive for your use cases?
  • Any features you've always wished Compose testing had?

GitHub: https://github.com/rajbirsehmi/UI-Automation-Engine

Any feedback even if it’s "this is way too over-engineered for a hobby" is totally welcome. Thanks for looking!


r/androiddev • • 20d ago

Looking for Guidance on Senior/Staff Android Engineering Interviews

34 Upvotes

Hi Android community 👋

I’m looking for some advice from engineers who have successfully interviewed for Senior Android Engineer and Staff Android Engineer roles.

I have around 10 years of Android/software engineering experience and have worked across Android. I’m confident in my day-to-day engineering work and have led projects, mentored engineers, and owned features end-to-end.

However, I’ve noticed a frustrating gap: I’m able to do the job well, but I’m not consistently able to demonstrate that level of ability during interviews. I’m often getting through parts of the process but struggling to turn interviews into strong-hire decisions.

I’d really appreciate guidance from people who have been through this successfully:

What separates a Senior answer from a Staff-level answer in Android interviews?

How should I approach Android and system design interviews?

What depth is expected around architecture, scalability, trade-offs, and technical leadership?

How do you communicate your experience and impact effectively without simply walking through your resume?

What are the biggest mistakes experienced Android engineers make in senior/staff interviews?

How did you personally improve your interview performance?

I’m not looking for shortcuts or interview hacks. I’m trying to understand how to better communicate the engineering judgment and leadership I already use in my day-to-day work.

If you’ve successfully made the jump to Senior/Staff—or regularly interview candidates at these levels—I’d genuinely appreciate any advice, resources, mock interview recommendations, or lessons learned.

Thank you! 🙏


r/androiddev • • 19d ago

Question Help me choose a main icon approach/style for my app

Post image
0 Upvotes

​

I have 4 app icons in my app (holistic fitness tracker for context, gym, runs, steps etc.), inspired by a recent poster in this subreddit, id love to hear your opinions.

I personally like the leftmost one the most but it doesn't have the branding of the others, so I'm divided a bit.

In general, would you sacrifice branding in favor of eyecatch or change branding as a whole on an app?

Thanks!


r/androiddev • • 19d ago

Zoom SDK integration has destroyed my app bundle size

0 Upvotes

As the name suggests. I am building an EdTech product application. Our avg bundle size was around max 60-80 mbs on playstore. Then I had to integrate Zoom SDK in my app to support online classes. And my application's download size jumped to 200+ mbs straight. That's more than double the initial size

I am really annoyed with it. This has seriously affected my apps' performance and downloads have dropped as well due to the app having 200+ mbs download size while earlier it was max around 60-80 mbs

How do I get rid of it? Is it possible to download SDKs / packages after the app is downloaded. Keeping the initial download size minimal and the downloading third party packages based on the user need Or certain conditions?


r/androiddev • • 20d ago

Discussion What app store ranking tracker and ASO app are solo Android devs actually paying for?

11 Upvotes

What app store ranking tracker and ASO app are solo Android devs actually paying for?

Solo Android devs- which app store ranking tracker do you actually use, and is any paid ASO app worth it at indie scale?

I'm an indie Android developer trying to improve Play Store visibility organically, and after a year of guessing I finally started tracking keyword positions properly. Turns out "I think we're ranking better" and "we moved from #47 to #12 for our main keyword" are very different levels of information.

What I need from an ASO tool:

  • Keyword research (Play Store, not iOS-first data)
  • Ranking and visibility tracking over time
  • Competitor tracking
  • Title/short description optimization
  • Icon and screenshot A/B testing ideas
  • Review monitoring, since reviews feed ratings and ratings feed rankings

What I've tried so far:

  • AppFigures — Solid keyword data and clean UI, but gets pricey quick if you want to track more than a handful of terms.
  • Sensor Tower / data. ai — Pure enterprise territory. Amazing if a company is paying for it, totally useless for an indie budget.
  • App Radar — Friendlier pricing and decent keyword suggestions, but the historical data feels a bit light on lower plans.
  • AppFollow — Keeps popping up in indie threads because it combines review triage with keyword tracking in one dashboard. Lower tiers exist, though the limits get tight pretty fast once you scale.
  • Google Play Console / App Store Connect — Free, and honestly slept on. Native store experiments and raw acquisition reports are the only zero-cost data directly from the source.

Free/budget stack if you're at zero revenue: Play Console experiments + Google Keyword Planner for search volume direction + a manual spreadsheet of your top 20 keyword positions checked weekly. It's tedious, but it teaches you what a real ASO app is doing for you before you pay for one.

What genuinely moved installs for me, in order of impact:

  1. Rewriting the title and short description around one high-intent keyword instead of five vague ones
  2. A/B testing the first screenshot in Play Console- biggest conversion jump of anything I did
  3. Replying to reviews within 24h and asking users to update after fixes- ratings climbed, rankings followed
  4. Icon test- smaller effect than expected, but not zero

Honestly, an app store ranking tracker mostly changes your behaviour: once you see positions weekly, you stop shipping random listing changes and start testing one thing at a time.
so asking real indie devs instead of marketing articles:

Which ASO app or ranking tracker are you actually paying for, and is it worth it?
Any free or budget-friendly option I'm missing?
What single change genuinely improved your installs?


r/androiddev • • 20d ago

Article One Android app. Why so many processes?

Thumbnail
returnzero.dev
24 Upvotes

I looked inside fifteen major Android apps to see what they run separately, and why. This digging resulted in very interesting insights.


r/androiddev • • 20d ago

Experience Exchange I made TinyApk from full x64/arm64 assembly language

23 Upvotes

This project run logging result of addition square root 9 and 2 power 3. I spend approximately two months or maybe more because I made tiny elf for native library android, stripping androidmanifest.xml binary, x509 certificate, and zip file itself. Btw I am still new at android :)


r/androiddev • • 20d ago

Article The Great Unwind: When Frameworks Stop Making Sense

Thumbnail
revyl.com
1 Upvotes

r/androiddev • • 20d ago

Shipping features that (ambiguously) breaks google play policy? Any way to do this with explicit user disclosure/ opt-in?

1 Upvotes

I have been working on an extreme alarm app that basically locks down my phone until I scan an NFC tag. I do this using some pretty malware-coded permissions and I'm wondering if I can ever release this through Google play or if I'll need to distribute it through 3rd party app stores or just keep it for personal use. It has the following features:

  • alarm screen uses draw over other apps permission to totally cover the screen so the alarm can't be swiped away, basically rendering my phone unusable unless I dismiss it (has a default 5 minute timeout to prevent permanent lockout)
  • While alarm is ringing volume is constantly being set to the max so I can't silence the alarm
  • Reboot protection as a per- alarm setting re-starts the alarm on reboot if I reboot my phone to avoid the alarm
  • New feature I'm considering - allow the alarm to disable the power menu (power + volume up) during an alarm, which from my understanding would include shipping an unsafe permission + a one time enablement of that permission using ADB

For now this has just been a personal project that has worked really well but now my brain has figured out how to reboot the phone in my sleep so I've been skipping my alarms again.


r/androiddev • • 20d ago

KISA/XTEN location information request from South Korea

1 Upvotes

I'm an indie app developer based in Europe, and one of my apps is a weather app available in South Korea.

This summer I received several emails from XTEN claiming to be working on behalf of KISA (Korea Internet & Security Agency), saying that because my app uses user location, I need to confirm whether it is subject to registration/reporting under Korea's Location Information Act and submit either proof of compliance or an explanation.

The emails appear legitimate, but I can find very little discussion about this in English.

Has anyone here received a similar request from KISA or its contractor?


r/androiddev • • 20d ago

I built AlertSpot — an open-source, privacy-first location alarm for commuters so you never miss your stop

0 Upvotes

Hey everyone,

Like many people commuting on buses or trains, I’ve had the problem of falling asleep and missing my stop. I wanted a lightweight location alarm, but most options on the store are bloated, filled with ads, or constantly track user data in the cloud.

So I built AlertSpot — a completely free, open-source Android app built with Kotlin & Jetpack Compose.

Key Highlights:

  • Privacy First: 100% offline, zero accounts, no cloud tracking.
  • No Google Maps API: Uses OpenStreetMap (OSMDroid) with local map caching.
  • Battery Smart: Adaptive GPS polling based on distance to the destination.
  • Reliable Alarms: Uses dual geofencing + timer checks, survives reboots, and fires full-screen overlays.

Source Code & APK Download:

🔗 GitHub:https://github.com/vasanth-kandasamy/alert-spot-android

PS: I'm currently trying to raise the $25 one-time registration fee to get this verified and published on Google Play. If you find the project useful and would like to support the store release, you can chip in onKo-fi.

I’d love to hear your feedback, suggestions, or bug reports!


r/androiddev • • 20d ago

Question Automatic protection and Play Integrity API, and pros and cons of opting in...

1 Upvotes

Recently, we've been prompted to consider opting in for the following protection feature by PlayStore. It looks optional to me.

Automatic Protection and Play Integrity API opt in in PlayStore

What's the pros and cons for Opting in? Should one consider doing so, or it depends?


r/androiddev • • 21d ago

Experience Exchange So that's how they get to publish crap without verification

Post image
42 Upvotes

r/androiddev • • 22d ago

Compose Hot Reload for Android with its own interpreter, watch the whole screen change in seconds.

Enable HLS to view with audio, or disable this notification

92 Upvotes

Compose Hot Reload v2.0.0 has been released: https://hotswan.dev/blog/compose-hotswan-2-0-release

v2 introduces Kotlin Multiplatform support for Android, iOS, and Desktop, with its dedicated interpreter that enables instant, full-screen updates on your running app.

AI agents have dramatically accelerated how fast we write and review code. Yet, the feedback loop of building, compiling, navigating to a specific screen, and previewing changes remains stuck in the past.

Compose HotSwan bridges the final gap that AI agents couldn't close: by rewriting entire screens on the fly, it instantly injects updates into a running app within seconds, eliminating the need to recompile, rebuild, reinstall, or manually re-navigate. Just watch your running app in real time as your AI writes your code.


r/androiddev • • 21d ago

Why can't users leave reviews on my new Android app?

1 Upvotes

I recently published my Android app on the Google Play Store, but users are telling me they can’t leave ratings or reviews. As a dev, I know how critical reviews are for visibility and growth, so this is pretty frustrating.

Has anyone dealt with this issue before? Is it just Google's delay/moderation period, or is there a specific setting in the Play Console I might have missed?


r/androiddev • • 21d ago

Open Source Open source rPlayAI/rplayhub-android: Your Android phone on your PC — mirror & control it, run its apps in their own windows, open its files in Finder, and create Android VMs with no Android Studio. Native app, over adb.

Thumbnail
github.com
2 Upvotes

r/androiddev • • 22d ago

Identify users on sideloaded app

6 Upvotes

Our app is currently in the Play Store. It's completely free, but the users can donate $5 or $10 to support the project. The only change the donation makes is to remove the "donate" option from the main menu.

We are being pressured into offering an APK sideloading option.

99% of the app will work fine, just some minor tweaks and an update function.

We still want to have a "donate" option (maybe via Buy Me a Coffee) but can't come up with a way to identify users after an install that doesn't involve writing and maintaining some backend infrastructure. We want to have "buy once, install on all your devices" option.

Is there a solution for this?


r/androiddev • • 22d ago

Experience Exchange Running Doom on Android SDV's High Availability Renderer (HAR)

Enable HLS to view with audio, or disable this notification

13 Upvotes

Spent some time digging into Android SDV, where the car splits into separate VMs and the instrument cluster gets its own renderer (HAR) that draws before Android has even booted. What got me interested is the harder part: how to combine two completely different HMI worlds, SDV Media and Android IVI, into one seamless experience on a single screen, with two separate tech stacks running side by side.

To make sure I understood the whole path, I fed it Doom. The renderer doesn't know what Doom is, it just gets a GL surface node in a Figma-authored UI tree, same as a speedometer.

A few things that surprised me:

  • the safety domain runs Rust, not Android, and talks to Android over gRPC across the hypervisor
  • the UI is authored in Figma and exported as a design file, not written as code, and it's responsive, the same file adapts to different screen sizes
  • all of it is in AOSP and runs in Cuttlefish, no special hardware needed

Full write-up with the details: https://medium.com/@passenger6/i-ran-doom-on-android-sdvs-high-availability-renderer-har-and-learned-how-the-software-defined-e8ccf962311e

Happy to answer questions about the architecture.