Skip to Main Content
Lightning Talk Intermediate https://opensource.org/licenses/MIT

Why wait 24 hours to fail? Check it first before Google does.

Proposal status is Rejected
Session Description

Preflight: Auditing Android Apps with a $0, On-Device, Open-Source Pipeline

Every Android developer knows the dread of a Play Store rejection, a debuggable build that slipped through, a targetSdk that's too old, a QUERY_ALL_PACKAGES permission that trips policy review, or a third-party ad SDK quietly siphoning user data. The usual tooling for catching these problems is fragmented and cloud-based, and too often it wants an API key, a paid subscription, or your APK uploaded to someone else's server.

Preflight takes the opposite approach: an open-source, on-device pre-submission auditor that never sends your code anywhere. Point it at an APK, a public GitHub repo, or its own installed package, and it runs a full static-analysis pipeline locally, manifest and permission inspection, Play-policy rule checks, accessibility gaps, APK/dex size and ABI footprint, and an Exodus-Privacy-style byte-scan of classes*.dex for ~20 known tracker-SDK signatures.

The core auditor is fully free and open, and runs on any device. Where a device supports on-device generative AI, Preflight hands the findings to Gemini Nano (via Google's ML Kit GenAI Prompt API) to write a reviewer-style verdict, entirely on-device, at zero inference cost. This is the one proprietary dependency in the stack, and it's optional: on devices without Nano, a deterministic rule-based engine produces the same verdict. Either way you get an animated report , a 0–100 score, a letter grade, prioritized fixes with explanations, and a "+26 since last scan" delta, rendered locally and shareable as Markdown.

The constraint that shaped every decision: no server, no API keys, no code or APK ever leaves the device, total running cost $0. That constraint isn't a limitation, it's the feature, it's what makes the privacy story verifiable instead of merely promised. The app ships with exactly one permission (INTERNET, used only for anonymous public-GitHub fetches), no analytics, and no crash SDKs. Because the whole thing is open source under https://github.com/Abhijeet6395/Preflight--The-App-Reviewer , every one of those claims can be checked against the code rather than taken on trust.

Architecturally, Preflight is one shared codebase in Kotlin Multiplatform and Compose Multiplatform, targeting both Android and iOS, following a strict MVI pattern (a single immutable StateFlow per screen, intents in, effects out). I'll walk through the engineering decisions and trade-offs: how the staged pipeline is modeled as a Flow the UI animates against, how on-device LLM inference is wired in with a graceful fallback, the input-hardening needed to safely parse untrusted APKs (zip-bomb guards, size caps), and the dependency landmines along the way, such as a Ktor release that silently broke Android dexing. Compose-driven animation an animated score gauge, a radar-scan effect, typewriter AI text via Compottie, the KMP Lottie renderer, ties it into something genuinely pleasant to use.

You'll leave understanding how to build a privacy-respecting developer tool from entirely free and open building blocks, and why "on-device" is becoming the most honest answer to the trust problem in AI tooling.

Key Takeaways

Verifiable privacy is an architecture decision, not a marketing line. The concrete choices no servers, one permission, no analytics/ad/crash SDKs, local-only storage, fully open source that let users check a privacy claim instead of trusting it.

  • On-device AI is usable for real tools today. How Gemini Nano (via ML Kit's GenAI Prompt API) produces useful generative output offline, at zero cost and zero data egress and how to bound that one proprietary dependency behind a fully-free rule-based fallback so the tool still works without it.

  • A practical Kotlin Multiplatform + Compose Multiplatform + MVI blueprint. A real, shippable structure: shared domain analyzers, a staged Flow-based pipeline the UI animates against, and a clean intent-in/effects-out core across Android and iOS.

  • What actually gets Android apps rejected and how to catch it first. A tour of the static checks (security misconfigs, Play-policy violations, tracker SDKs found by scanning dex bytecode, accessibility gaps, size/ABI footprint) you can run yourself before hitting Publish.

  • Parsing untrusted input is its own discipline. Real hardening lessons from inspecting arbitrary APKs and repos size caps, zip-bomb guards, anonymous fetches and the dependency pitfalls (like a build-breaking Ktor release) encountered along the way.

  • Polished, animated UX is achievable in pure Compose/KMP. How Compottie (the KMP Lottie renderer) and custom Compose animation produce a refined report screen with no platform-specific code.

References

Session Categories

Engineering practice - productivity, debugging
Introducing a FOSS project or a new version of a popular project
Story of a FOSS project - from inception to growth
Knowledge Commons (Open Hardware, Open Science, Open Data etc.)
Community
Talk License: https://opensource.org/licenses/MIT

Speakers

Abhijeet Shukla
Abhijeet Shukla SDE-1 | Karya

I am a Software developer at Karya, I have been doing Android since 2+ years now. I love exploring and thinking about new stuff. This app was born out of that.