<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Syed Zubyl N | Software Developer - DevOps</title>
      <link>https://syedzubyl.space</link>
      <description>Syed Zubyl N — Software Developer focused on Java, Spring Boot, backend development, REST APIs, databases, Flutter and production-oriented applications.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://syedzubyl.space/tags/devops/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Wed, 05 Aug 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>From an Old Android Release to a Modern Play Store Release</title>
          <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
          <author>Syed Zubyl N</author>
          <link>https://syedzubyl.space/blog/old-android-release-to-modern/</link>
          <guid>https://syedzubyl.space/blog/old-android-release-to-modern/</guid>
          <description xml:base="https://syedzubyl.space/blog/old-android-release-to-modern/">&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;&#x2F;h3&gt;
&lt;p&gt;A few years ago, I built and published an Android application to the Google Play Store. Fast forward to 2026, and Google Play policies had evolved significantly. The original application was targeting an older Android version (around API 33). Google now required updates to target modern specifications (API 36). To make matters worse, the original development environment, including the local source code and the original signing keystore, had been lost on a dead hard drive.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;context&quot;&gt;Context&lt;&#x2F;h3&gt;
&lt;p&gt;Updating an app on the Google Play Store is not just about uploading an APK. The new release must:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Retain the exact same Application ID (package name).&lt;&#x2F;li&gt;
&lt;li&gt;Be signed with the exact same cryptographic key (or use Play App Signing).&lt;&#x2F;li&gt;
&lt;li&gt;Meet the latest &lt;code&gt;targetSdkVersion&lt;&#x2F;code&gt; requirements.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;what-i-tried&quot;&gt;What I Tried&lt;&#x2F;h3&gt;
&lt;p&gt;I initially tried to create a brand new application with a slightly different package name (&lt;code&gt;com.myapp.v2&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-failed&quot;&gt;What Failed&lt;&#x2F;h3&gt;
&lt;p&gt;Creating a new application means starting from scratch. All previous reviews, download history, and existing users are lost. Existing users will not receive the update automatically; they would have to find the new app manually. This was unacceptable.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-worked-technical-explanation&quot;&gt;What Worked &amp;amp; Technical Explanation&lt;&#x2F;h3&gt;
&lt;p&gt;I had to recover the original identity and modernize the codebase.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;1. Source Recovery and Preservation&lt;&#x2F;strong&gt;
Fortunately, I was able to recover a backup of the source code. The very first step was initializing a Git repository and pushing it to GitHub. Once the source was recovered, the code was preserved in GitHub so that the project would no longer depend on a single local copy.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. Modernizing the API Level&lt;&#x2F;strong&gt;
I updated the &lt;code&gt;build.gradle&lt;&#x2F;code&gt; file to reflect modern requirements:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Updated &lt;code&gt;compileSdkVersion&lt;&#x2F;code&gt; and &lt;code&gt;targetSdkVersion&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Upgraded deprecated dependencies that were incompatible with newer Android versions.&lt;&#x2F;li&gt;
&lt;li&gt;Tested the application on Android 14+ emulators to ensure permissions and UI rendering remained functional.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;3. The Keystore Crisis&lt;&#x2F;strong&gt;
The Android signing key is critical. Without it, Google Play rejects the update because it cannot cryptographically prove the update came from the original author. Luckily, I had enrolled the app in &lt;strong&gt;Play App Signing&lt;&#x2F;strong&gt; during the original upload.&lt;&#x2F;p&gt;
&lt;p&gt;This meant the actual production signing key was securely stored by Google. I only needed an “Upload Key.” Because I had lost the original upload key, I contacted Google Play Developer Support to reset it. I generated a new secure keystore, provided Google with the new &lt;code&gt;.pem&lt;&#x2F;code&gt; certificate, and they linked it to my app.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;4. Production Release (Version 4)&lt;&#x2F;strong&gt;
With the code modernized and the new signing configuration securely backed up (with passwords stored in a password manager, NOT in the Git repo), I built the release bundle. I uploaded Version 4 to the Play Console, filled out the new Data Safety declarations, and successfully rolled it out to production.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lessons-learned&quot;&gt;Lessons Learned&lt;&#x2F;h3&gt;
&lt;p&gt;Losing the original development environment does not necessarily mean the application itself is lost, but package identity, signing credentials, source code, and release history must be treated as critical assets.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-would-do-differently&quot;&gt;What I Would Do Differently&lt;&#x2F;h3&gt;
&lt;p&gt;I will never rely on a local machine for code storage again. Every project, no matter how small, gets pushed to a remote version control system immediately. Furthermore, keystore files and their credentials must be treated as high-priority secrets and stored in redundant, encrypted cloud backups.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
