<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shubham Nanche</title>
    <description>The latest articles on DEV Community by Shubham Nanche (@shubhamnanche).</description>
    <link>https://dev.to/shubhamnanche</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F704920%2Fa22ee8cd-0726-4903-ad1a-f646ccc5360a.png</url>
      <title>DEV Community: Shubham Nanche</title>
      <link>https://dev.to/shubhamnanche</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubhamnanche"/>
    <language>en</language>
    <item>
      <title>SSKCore: Turning Production Pain Into an Android Platform [PART-2]</title>
      <dc:creator>Shubham Nanche</dc:creator>
      <pubDate>Mon, 24 Aug 2026 06:42:59 +0000</pubDate>
      <link>https://dev.to/shubhamnanche/sskcore-turning-production-pain-into-an-android-platform-part-2-8p7</link>
      <guid>https://dev.to/shubhamnanche/sskcore-turning-production-pain-into-an-android-platform-part-2-8p7</guid>
      <description>&lt;p&gt;&lt;strong&gt;📚 This is part 2 of a series.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/shubhamnanche/sskcore-turning-production-pain-into-an-android-platform-3f6g"&gt;Part 1: The Origin Story&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 2: [Current Article]&lt;/li&gt;
&lt;li&gt;Part 3: Coming soon...&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Let me tell you about the day my crash reporting UI crashed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grey Screen
&lt;/h2&gt;

&lt;p&gt;One afternoon, my Android app's crash screen rendered all-grey. No content. No report button. Just a blank slate where the app's last line of defense should have been.&lt;/p&gt;

&lt;p&gt;The root cause? A stale file from Gradle's build cache after a major refactor. The compiled resource IDs no longer matched the packaged resource table. ViewBinding inflated the wrong layout, and a silent &lt;code&gt;NullPointerException&lt;/code&gt; killed the crash screen itself.&lt;/p&gt;

&lt;p&gt;It was invisible in CI. It only appeared in specific rebuild scenarios. And it took hours to trace.&lt;/p&gt;

&lt;p&gt;That bug taught me something important: &lt;strong&gt;The fix isn't done when the patch ships. It's done when the lesson becomes automated.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I wrote a build-time task that reads the compiled class files directly, compares them against the final packaged resources, and verifies every constant matches. It runs automatically after every packaging step. You never have to remember to invoke it.&lt;/p&gt;

&lt;p&gt;That was the first of many incident-driven tools I built.&lt;/p&gt;

&lt;h2&gt;
  
  
  The FAB That Disappeared
&lt;/h2&gt;

&lt;p&gt;A few weeks later, a developer tools Floating Action Button vanished from consumer apps. Debug menus inaccessible. Secure screens incorrectly enabled.&lt;/p&gt;

&lt;p&gt;Turns out, my shared library's &lt;code&gt;BuildConfigUtils&lt;/code&gt; was reading the library's own &lt;code&gt;BuildConfig&lt;/code&gt;—which is baked as &lt;code&gt;"release"&lt;/code&gt; at publish time. An AAR can never know the consumer's build type. 25 files across 34 call sites were silently broken.&lt;/p&gt;

&lt;p&gt;I built a Gradle plugin that generates a &lt;code&gt;SskBuildConfig&lt;/code&gt; object per consumer module, per variant, using AGP's &lt;code&gt;onVariants&lt;/code&gt; callback. It registers generated source via &lt;code&gt;KotlinCompile.source()&lt;/code&gt;—not reflection, which broke across AGP versions. It detects Android plugins by extension type, not hardcoded IDs, so it works with &lt;code&gt;com.android.application&lt;/code&gt;, &lt;code&gt;com.android.library&lt;/code&gt;, &lt;code&gt;com.android.dynamic-feature&lt;/code&gt;, and any future Google plugin.&lt;/p&gt;

&lt;p&gt;Same package as the deprecated &lt;code&gt;BuildConfigUtils&lt;/code&gt;. Migration was just renaming the receiver. Zero import changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Permission That Leaked
&lt;/h2&gt;

&lt;p&gt;An app depending on &lt;code&gt;core-base&lt;/code&gt; suddenly gained &lt;code&gt;AD_ID&lt;/code&gt; permission and started initializing Google Mobile Ads unconditionally—even for users who'd never see an ad.&lt;/p&gt;

&lt;p&gt;The root cause? &lt;code&gt;core-base&lt;/code&gt; hard-depended on &lt;code&gt;play-services-ads&lt;/code&gt;. Every consumer inherited it.&lt;/p&gt;

&lt;p&gt;The fix: extract the ad code into an opt-in module. Apps that need ads explicitly add the dependency. Apps that don't, don't inherit the permission.&lt;/p&gt;

&lt;p&gt;That structural separation taught me: &lt;strong&gt;Modularization isn't just about code organization. It's about controlling what your consumers accidentally inherit.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Platform That Emerged
&lt;/h2&gt;

&lt;p&gt;These incidents weren't isolated. They were symptoms of a larger problem: building multiple Android apps that share code is genuinely hard. Not "write a library and import it" hard. "Gradle composite builds shadow your settings classpath, build-cache serves stale intermediates, AAR limitations hide variant information, and module extraction silently leaves resource shadows that AGP resolves by merge priority" hard.&lt;/p&gt;

&lt;p&gt;So I built SskCore. 18 published library modules. 60+ custom Gradle tasks. All built by one developer—me—from real production pain points.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes It Different
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Automatic Source/Binary Switching
&lt;/h3&gt;

&lt;p&gt;Non-release branches compile SskCore from source. Release branches use published AARs. Detected from &lt;code&gt;.git/HEAD&lt;/code&gt;. No flags, no manual configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  60+ Custom Gradle Tasks
&lt;/h3&gt;

&lt;p&gt;Each task exists because a real bug or real pain point was encountered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource-ID drift detection&lt;/li&gt;
&lt;li&gt;Secret scanning&lt;/li&gt;
&lt;li&gt;Accessibility auditing&lt;/li&gt;
&lt;li&gt;Security auditing&lt;/li&gt;
&lt;li&gt;Navigation graph analysis&lt;/li&gt;
&lt;li&gt;Translation gap analysis&lt;/li&gt;
&lt;li&gt;Build matrix visualization&lt;/li&gt;
&lt;li&gt;Release checklists&lt;/li&gt;
&lt;li&gt;Bundletool automation&lt;/li&gt;
&lt;li&gt;Dependency freshness checking&lt;/li&gt;
&lt;li&gt;Obfuscation mapping collection&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ModuleMap Architecture
&lt;/h3&gt;

&lt;p&gt;Crosses Gradle composite build session boundaries for holistic analysis—one command catches duplicates across the library and app boundary, which &lt;code&gt;includeBuild&lt;/code&gt; normally isolates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Catalog-Driven Module Discovery
&lt;/h3&gt;

&lt;p&gt;Adding a new SskCore module requires one line in the consumer's version catalog. No republish of build-logic needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation With Incident Context
&lt;/h3&gt;

&lt;p&gt;Every design decision is documented with the incident that caused it. Not "we decided to do X" but "on Aug 10, the crash screen rendered all-grey because of a stale R.jar. Here's the evidence chain. Here's the fix. Here's the prevention."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solo Developer Perspective
&lt;/h2&gt;

&lt;p&gt;Here's the thing: I built this alone. Every module, every Gradle plugin, every task, every documentation file—all from one person's keyboard.&lt;/p&gt;

&lt;p&gt;That changes the calculus. You don't have a team to rely on. Every complexity tradeoff is yours to own. The upside? You can move fast, make architectural decisions unilaterally, and build exactly what the apps need without organizational friction. The downside? The learning curve is steep, and the cognitive load is real.&lt;/p&gt;

&lt;p&gt;But I learned something important: &lt;strong&gt;It's not about scale. It's about leverage.&lt;/strong&gt; Each tool I build saves me days across multiple apps. Each automated check prevents a future debugging session. Each documentation file preserves a lesson I'd otherwise forget.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Engineering Lesson
&lt;/h2&gt;

&lt;p&gt;The 60+ tasks sound like overkill until you've debugged a stale-R crash at 2am. The composite build setup is complex until you've shipped a release with the wrong variant checks because you forgot a flag. The documentation is extensive until you're the one who has to re-derive why something was done a certain way.&lt;/p&gt;

&lt;p&gt;Every piece of complexity exists because a simpler approach failed in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm considering open-sourcing the build-logic separately. The 18 modules are app-specific enough that they need context, but the 60+ tasks and the composite-build infrastructure are genuinely useful for any multi-module Android project. The Resource-ID drift guard alone would have saved me days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters to Enterprise applications
&lt;/h2&gt;

&lt;p&gt;SskCore demonstrates work beyond feature delivery:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turning repeated app work into platform APIs&lt;/li&gt;
&lt;li&gt;Designing Android module boundaries&lt;/li&gt;
&lt;li&gt;Building Gradle plugins and custom tasks&lt;/li&gt;
&lt;li&gt;Improving release confidence&lt;/li&gt;
&lt;li&gt;Managing binary/source consumption tradeoffs&lt;/li&gt;
&lt;li&gt;Debugging production-like failures&lt;/li&gt;
&lt;li&gt;Designing reusable components with host-app contracts&lt;/li&gt;
&lt;li&gt;Writing documentation that preserves engineering decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is relevant to teams working on Android platform engineering, mobile infrastructure, build systems, developer productivity, internal SDKs, release engineering, and app quality automation.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;One developer. 18 modules. 60+ Gradle tasks. 20+ documentation files.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is SskCore—the platform I built from production pain.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you've built similar shared infrastructure for Android, I'd love to hear how you approached the composite-build / binary-mode switching problem. Or if you've hit the stale-R.jar bug—I now have a very thorough write-up.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;📚 This is part 2 of a series.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/shubhamnanche/sskcore-turning-production-pain-into-an-android-platform-3f6g"&gt;Part 1: The Origin Story&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 2: [Current Article]&lt;/li&gt;
&lt;li&gt;Part 3: Coming soon...&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>debugging</category>
      <category>mobile</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>SskCore: Turning Production Pain Into an Android Platform</title>
      <dc:creator>Shubham Nanche</dc:creator>
      <pubDate>Sun, 23 Aug 2026 15:33:29 +0000</pubDate>
      <link>https://dev.to/shubhamnanche/sskcore-turning-production-pain-into-an-android-platform-3f6g</link>
      <guid>https://dev.to/shubhamnanche/sskcore-turning-production-pain-into-an-android-platform-3f6g</guid>
      <description>&lt;p&gt;I started with Android apps.&lt;/p&gt;

&lt;p&gt;Eventually, I realized I was solving many of the same engineering problems again and again.&lt;/p&gt;

&lt;p&gt;Themes. Localization. Notifications. Crash handling. File access. Play integrations. Storage. Build configuration. Release checks. Reusable UI infrastructure.&lt;/p&gt;

&lt;p&gt;At first, sharing code between apps feels straightforward.&lt;/p&gt;

&lt;p&gt;Then the applications evolve.&lt;/p&gt;

&lt;p&gt;One copy gets a bug fix. Another doesn't.&lt;/p&gt;

&lt;p&gt;A release requirement changes, so the same logic needs to be updated in several places.&lt;/p&gt;

&lt;p&gt;A build-system problem appears in one application, gets fixed locally, and disappears from memory until something similar happens months later.&lt;/p&gt;

&lt;p&gt;The code isn't necessarily difficult.&lt;/p&gt;

&lt;p&gt;The accumulated engineering knowledge is.&lt;/p&gt;

&lt;p&gt;That was the motivation behind &lt;strong&gt;SskCore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;SskCore is an internal Android engineering platform I built to turn repeated production lessons into reusable infrastructure, build automation, release safety, and developer tooling across multiple applications.&lt;/p&gt;

&lt;p&gt;This article is not a tutorial for building another Android library.&lt;/p&gt;

&lt;p&gt;It is a case study in how a collection of recurring application problems gradually turned into a platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  From shared code to a platform
&lt;/h2&gt;

&lt;p&gt;The first instinct when multiple applications need the same thing is usually to extract it into a library.&lt;/p&gt;

&lt;p&gt;That's a good start.&lt;/p&gt;

&lt;p&gt;It is not necessarily the end state.&lt;/p&gt;

&lt;p&gt;A reusable platform has a different responsibility from a collection of utility functions.&lt;/p&gt;

&lt;p&gt;It needs to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which application capabilities belong together?&lt;/li&gt;
&lt;li&gt;Which dependencies should remain optional?&lt;/li&gt;
&lt;li&gt;How should consumers integrate the platform?&lt;/li&gt;
&lt;li&gt;How should changes be released?&lt;/li&gt;
&lt;li&gt;How can developers iterate quickly without sacrificing release stability?&lt;/li&gt;
&lt;li&gt;How can recurring mistakes become automated checks?&lt;/li&gt;
&lt;li&gt;How do you preserve the reasoning behind architectural decisions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SskCore evolved around those questions.&lt;/p&gt;

&lt;p&gt;Instead of copying infrastructure from application to application, shared capabilities became reusable modules with defined boundaries and consumer-facing contracts.&lt;/p&gt;

&lt;p&gt;The platform eventually grew to &lt;strong&gt;18 Android modules&lt;/strong&gt;, supported by shared build logic, custom Gradle automation, release tooling, and extensive documentation.&lt;/p&gt;

&lt;p&gt;The important part isn't the number 18.&lt;/p&gt;

&lt;p&gt;The important part is &lt;em&gt;why the boundaries exist&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The platform is more than an SDK
&lt;/h2&gt;

&lt;p&gt;At a high level, SskCore can be thought of as several layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foundation
&lt;/h3&gt;

&lt;p&gt;This contains common utilities and lower-level Kotlin support that can be reused without pulling in higher-level application behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Services
&lt;/h3&gt;

&lt;p&gt;These modules provide reusable infrastructure around areas such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notifications&lt;/li&gt;
&lt;li&gt;Play ecosystem integrations&lt;/li&gt;
&lt;li&gt;Media&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Data utilities&lt;/li&gt;
&lt;li&gt;Security-aware utilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UI infrastructure
&lt;/h3&gt;

&lt;p&gt;This layer contains reusable UI and presentation infrastructure, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compose utilities&lt;/li&gt;
&lt;li&gt;XML view helpers&lt;/li&gt;
&lt;li&gt;Theme and design systems&lt;/li&gt;
&lt;li&gt;Localization support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Feature components
&lt;/h3&gt;

&lt;p&gt;These are larger reusable capabilities rather than simple helper functions.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text-to-speech orchestration&lt;/li&gt;
&lt;li&gt;Crash reporting and recovery UX&lt;/li&gt;
&lt;li&gt;File browsing&lt;/li&gt;
&lt;li&gt;Task monitoring&lt;/li&gt;
&lt;li&gt;Other opt-in application capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build platform
&lt;/h3&gt;

&lt;p&gt;This is where the project starts to look less like a traditional Android SDK.&lt;/p&gt;

&lt;p&gt;The build layer provides convention plugins, publishing support, dependency visibility, release checks, and custom quality automation.&lt;/p&gt;

&lt;p&gt;The architecture isn't simply "many modules."&lt;/p&gt;

&lt;p&gt;The module boundaries exist to control &lt;strong&gt;ownership, dependency shape, optional capabilities, and release risk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;A large number of modules can just create fragmentation.&lt;/p&gt;

&lt;p&gt;Good modularization should instead make the consequences of a dependency more predictable.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with treating every bug as an isolated bug
&lt;/h2&gt;

&lt;p&gt;One of the biggest changes in my thinking came from production debugging.&lt;/p&gt;

&lt;p&gt;A traditional debugging loop is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Something broke → find the cause → fix it → move on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That works.&lt;/p&gt;

&lt;p&gt;But it misses the opportunity to improve the system itself.&lt;/p&gt;

&lt;p&gt;With SskCore, I started asking a different set of questions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why was this possible?&lt;/p&gt;

&lt;p&gt;Why didn't we detect it earlier?&lt;/p&gt;

&lt;p&gt;Can the build system identify this class of problem next time?&lt;/p&gt;

&lt;p&gt;Can the prevention be reused across every consumer?&lt;/p&gt;

&lt;p&gt;Can the lesson be documented so it survives context loss?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That changed the role of the build system.&lt;/p&gt;

&lt;p&gt;Instead of being the machinery that turns source code into an APK, it became a place where engineering knowledge could be encoded.&lt;/p&gt;




&lt;h2&gt;
  
  
  Production bugs should become tools
&lt;/h2&gt;

&lt;p&gt;This became one of the guiding principles behind SskCore:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most valuable bug fix is often the automated check that prevents the same class of problem from returning.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some Android failures are difficult to catch through normal development workflows.&lt;/p&gt;

&lt;p&gt;They can involve things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource and packaging interactions&lt;/li&gt;
&lt;li&gt;Build caching&lt;/li&gt;
&lt;li&gt;Variant differences&lt;/li&gt;
&lt;li&gt;Dependency shape&lt;/li&gt;
&lt;li&gt;Localization gaps&lt;/li&gt;
&lt;li&gt;Release configuration&lt;/li&gt;
&lt;li&gt;Cross-module integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A manual checklist can help.&lt;/p&gt;

&lt;p&gt;But a checklist depends on somebody remembering it.&lt;/p&gt;

&lt;p&gt;Automation doesn't.&lt;/p&gt;

&lt;p&gt;SskCore grew to include &lt;strong&gt;60+ custom build and quality tasks&lt;/strong&gt; covering areas such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Release readiness&lt;/li&gt;
&lt;li&gt;Resource and packaging safety&lt;/li&gt;
&lt;li&gt;Localization analysis&lt;/li&gt;
&lt;li&gt;Accessibility checks&lt;/li&gt;
&lt;li&gt;Dependency visibility&lt;/li&gt;
&lt;li&gt;Build health&lt;/li&gt;
&lt;li&gt;Security posture&lt;/li&gt;
&lt;li&gt;Artifact and bundle workflows&lt;/li&gt;
&lt;li&gt;Other release and quality checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These weren't designed as an arbitrary collection of developer tools.&lt;/p&gt;

&lt;p&gt;They were largely driven by problems that had already consumed engineering time.&lt;/p&gt;

&lt;p&gt;That leads to a principle I now use whenever I encounter a difficult production issue:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fix the issue. Then encode the lesson.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A build system has to support two different needs
&lt;/h2&gt;

&lt;p&gt;Internal SDKs have an interesting tension.&lt;/p&gt;

&lt;p&gt;During active development, engineers want fast feedback.&lt;/p&gt;

&lt;p&gt;During release, engineers want stability and reproducibility.&lt;/p&gt;

&lt;p&gt;Those goals can pull in different directions.&lt;/p&gt;

&lt;p&gt;SskCore was designed around both.&lt;/p&gt;

&lt;p&gt;During active work, applications can consume the platform in a way that supports source-level iteration.&lt;/p&gt;

&lt;p&gt;For release workflows, the same platform can be consumed through versioned artifacts.&lt;/p&gt;

&lt;p&gt;The important thing is not the specific mechanism.&lt;/p&gt;

&lt;p&gt;The important thing is the boundary:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;developers should be able to move quickly without turning the release dependency graph into something unpredictable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This became one of the more interesting parts of the platform because it pushed Android build engineering beyond ordinary dependency management.&lt;/p&gt;

&lt;p&gt;It required thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development workflow&lt;/li&gt;
&lt;li&gt;Artifact versioning&lt;/li&gt;
&lt;li&gt;Release stability&lt;/li&gt;
&lt;li&gt;Consumer integration&lt;/li&gt;
&lt;li&gt;Dependency boundaries&lt;/li&gt;
&lt;li&gt;Reproducibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson was broader than Android:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Developer experience and release engineering are not opposing concerns. A good platform has to design for both.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Reusable code is not just extracted code
&lt;/h2&gt;

&lt;p&gt;One of the easiest mistakes in shared infrastructure is assuming that reusable code is simply application code moved into a library.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;Application code can make assumptions.&lt;/p&gt;

&lt;p&gt;It knows its host.&lt;/p&gt;

&lt;p&gt;It knows its screens.&lt;/p&gt;

&lt;p&gt;It knows its configuration.&lt;/p&gt;

&lt;p&gt;It knows which other components are present.&lt;/p&gt;

&lt;p&gt;A reusable platform component doesn't have that luxury.&lt;/p&gt;

&lt;p&gt;It needs explicit contracts.&lt;/p&gt;

&lt;p&gt;It needs sensible defaults.&lt;/p&gt;

&lt;p&gt;It needs predictable integration points.&lt;/p&gt;

&lt;p&gt;It needs documentation.&lt;/p&gt;

&lt;p&gt;And eventually, it needs a migration story.&lt;/p&gt;

&lt;p&gt;That became especially important for larger SskCore capabilities such as text-to-speech orchestration, crash recovery UX, file browsing, localization flows, and task monitoring.&lt;/p&gt;

&lt;p&gt;The engineering challenge wasn't simply making them reusable.&lt;/p&gt;

&lt;p&gt;It was making them &lt;strong&gt;configurable enough for different consumers without forcing every application to understand the platform's internal complexity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That led to another principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Reusable code is not just extracted code. It is code with a contract.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Modularization is about consequences
&lt;/h2&gt;

&lt;p&gt;"Make everything a module" is not an architecture strategy.&lt;/p&gt;

&lt;p&gt;The useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What consequence does this dependency have when an application adopts it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A monolithic shared module can become convenient in the short term.&lt;/p&gt;

&lt;p&gt;It can also accumulate unrelated dependencies and capabilities over time.&lt;/p&gt;

&lt;p&gt;SskCore instead separates optional capabilities so that applications can opt into the infrastructure they actually need.&lt;/p&gt;

&lt;p&gt;That produces a cleaner dependency graph and makes the relationship between an application and its shared infrastructure easier to reason about.&lt;/p&gt;

&lt;p&gt;This is particularly important for Android because the cost of a dependency isn't always limited to another library appearing in a Gradle file.&lt;/p&gt;

&lt;p&gt;Dependencies can influence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build complexity&lt;/li&gt;
&lt;li&gt;Packaging&lt;/li&gt;
&lt;li&gt;Application size&lt;/li&gt;
&lt;li&gt;Permissions&lt;/li&gt;
&lt;li&gt;Runtime behavior&lt;/li&gt;
&lt;li&gt;Release risk&lt;/li&gt;
&lt;li&gt;Maintenance ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good modularization therefore becomes a form of risk management.&lt;/p&gt;

&lt;p&gt;Not because every module is inherently safer, but because &lt;strong&gt;smaller, intentional boundaries make accidental consequences easier to see&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentation became part of the platform
&lt;/h2&gt;

&lt;p&gt;There is another problem that appears once a platform becomes sufficiently complex.&lt;/p&gt;

&lt;p&gt;The original author becomes the documentation.&lt;/p&gt;

&lt;p&gt;That is not sustainable.&lt;/p&gt;

&lt;p&gt;If only one person knows why a particular design exists, the platform carries a hidden operational dependency on that person.&lt;/p&gt;

&lt;p&gt;SskCore therefore includes extensive documentation covering areas such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;Module boundaries&lt;/li&gt;
&lt;li&gt;Release behavior&lt;/li&gt;
&lt;li&gt;Recovery&lt;/li&gt;
&lt;li&gt;Build behavior&lt;/li&gt;
&lt;li&gt;Troubleshooting&lt;/li&gt;
&lt;li&gt;Reusable feature integration&lt;/li&gt;
&lt;li&gt;Engineering decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The purpose isn't documentation for documentation's sake.&lt;/p&gt;

&lt;p&gt;It's to preserve context.&lt;/p&gt;

&lt;p&gt;A future engineer shouldn't have to rediscover the entire reasoning chain behind a design decision simply because the original incident happened months ago.&lt;/p&gt;

&lt;p&gt;For me, this changed the definition of developer infrastructure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Documentation is part of the platform because engineering judgment is part of the platform.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What SskCore changed about how I think about Android
&lt;/h2&gt;

&lt;p&gt;Building SskCore gradually changed my view of Android engineering.&lt;/p&gt;

&lt;p&gt;I used to think primarily in terms of application features:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What does this application need to do?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now I think much more often in terms of platform questions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should be reusable?&lt;/p&gt;

&lt;p&gt;What should be isolated?&lt;/p&gt;

&lt;p&gt;What should the build system know?&lt;/p&gt;

&lt;p&gt;What should be automatically verified?&lt;/p&gt;

&lt;p&gt;Which assumptions should become contracts?&lt;/p&gt;

&lt;p&gt;Which production lessons deserve to become tooling?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That shift is probably the most valuable outcome of the project.&lt;/p&gt;

&lt;p&gt;SskCore isn't valuable merely because it contains reusable code.&lt;/p&gt;

&lt;p&gt;It is valuable because it captures engineering decisions that otherwise would have been repeatedly rediscovered.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bigger lesson
&lt;/h2&gt;

&lt;p&gt;The deeper I got into the project, the more I realized that applications are only one layer of software engineering.&lt;/p&gt;

&lt;p&gt;Underneath the application are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build systems&lt;/li&gt;
&lt;li&gt;SDKs&lt;/li&gt;
&lt;li&gt;Dependency graphs&lt;/li&gt;
&lt;li&gt;Release pipelines&lt;/li&gt;
&lt;li&gt;Quality checks&lt;/li&gt;
&lt;li&gt;Developer tooling&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Operational knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When those layers are designed well, application development becomes easier.&lt;/p&gt;

&lt;p&gt;Not because the platform eliminates complexity.&lt;/p&gt;

&lt;p&gt;It moves the right complexity into a place where it can be handled once and reused.&lt;/p&gt;

&lt;p&gt;That is the real idea behind SskCore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turn repeated pain into infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turn infrastructure into contracts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turn production lessons into automation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turn engineering decisions into documentation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And then make the next application benefit from everything learned by the previous one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I want to take this thinking
&lt;/h2&gt;

&lt;p&gt;SskCore started as a solution to problems I was repeatedly encountering while building Android applications.&lt;/p&gt;

&lt;p&gt;It evolved into something that made me increasingly interested in a different class of engineering work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Android platform engineering&lt;/li&gt;
&lt;li&gt;Build systems&lt;/li&gt;
&lt;li&gt;Internal SDKs&lt;/li&gt;
&lt;li&gt;Developer productivity&lt;/li&gt;
&lt;li&gt;Release engineering&lt;/li&gt;
&lt;li&gt;Production debugging&lt;/li&gt;
&lt;li&gt;Engineering automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That intersection is what makes the project interesting to me.&lt;/p&gt;

&lt;p&gt;The platform beneath an application may not be visible to users.&lt;/p&gt;

&lt;p&gt;But it can have an enormous effect on how reliably and efficiently engineers can build what users actually see.&lt;/p&gt;

&lt;p&gt;And that is ultimately what SskCore represents:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A collection of hard-earned engineering lessons, turned into reusable infrastructure.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>android</category>
      <category>architecture</category>
      <category>mobile</category>
      <category>software</category>
    </item>
  </channel>
</rss>
