Last updated on 4 Jan. 2026
This procedure has turned out to be much, much more complex than what I had expected. Uptodown store submission is so easy in comparison to Google Play Console (GPC). I get the view that GPC is deliberately bringing in obstacles for new personal/individual developer registrants on their store (which is the category I fall into now as I registered as an individual developer only a few days back).
Surely some of the legal related topics have to be navigated carefully by Google - no issue about those forms and the many questions there. But the big obstacle-filter they have is their
App testing requirements for new personal developer accounts which has the new requirements they introduced in November 2023. The biggest of them that I have encountered so far (no idea, what further obstacles have been introduced) is: "If you have a newly created personal developer account, you must run a closed test for your app with a minimum of 12 testers who have been opted-in for at least the last 14 days continuously."
For a reclusive guy like me, that is a high bar. Further, the app I am trying to publish on GPC is a small utility - Timestamp Tracker - which not many people may be interested in. I find the app useful and use it quite regularly. So I wanted to see if GPC will allow me to share it with interested persons who may be few in number. The obstacles GPC has for a new developer registrant like me are counter to this objective.
I already have done fair amount of individual testing when I released the app as APK file on
Uptodown store in June 2025 (only 21 downloads so far). So I don't want to spend much time on testing and modifications now. I simply want to try to publish the app as it is now on GPC.
One big disadvantage of Uptodown store or sharing APK on Google Drive (which I have done), is that users have to side-load the app which shows rather scary warnings to the user. So I think most Android users would want to stay away from side-loading APKs.
In contrast, installing apps from Google Play Store or simply Google Play, is familiar to many Android users and there are no dire warnings about the app being untrusted or unsecure. Therefore I felt I should invest some time in trying to publish the app on GPC which may enable few other persons finding out about this app and using it for their benefit.
Anyway, I have already had to learn quite a bit about trying to publishing an app on GPC. I am sharing some of that learning on this post.
Testing .aab in "Internal Testing"
This is a part of GPC that I liked.
GPC home page has a 'Create app' button which starts the process of developer-user giving some app details and then uploading the .AAB file for the app. After that, IFIRC, the app can be accessed by testers through 'Internal Testing" option where the app author specifies gmail ids of the testers and then passes on the opt-in link that is provided. Testers go through a few steps starting with opt-in click after which they can download the app from GPC. During installation of app, a warning icon and message is shown to the tester: "This app is for developer testing and may be unsecure or unstable." If the tester chooses to continue he will be able to install the app and use it. While the warning is a tricky thing, the user is installing the app from the familiar Google Play Store and so may not be that scared to install it.
"Closed testing"
Next I wanted to go create a production release and finish the job. That's when I hit against the obstacles wall.
The Production feaure was disabled and said:
Have at least 12 testers opted-in to your closed test
0 testers currently opted-in
----
So I had to go for 'Closed test'. But before that I had to:
- Create a privacy policy document on GitHub, publish it on GitHub Pages and share its URL.
- It may have been faster to have created a blog page with the privacy policy.
- Make a lot of choices like target age group, data safety, (not using) advertising ID
- Provide app description, contact details, icons, screenshots - this is standard stuff. I had done it for Uptodown store too. So this was expected. Icon and screenshot size specifications seemed to be different on GPC but not a big issue.
- I had to select countries/region! Initially I chose India only.
Next I could go to creating a 'closed test'. I could use the same .aab file that I had uploaded earlier for 'internal testing' (from some library option IFIRC; so did not upload it again). Some notable points:
- For specifying the testers, I had to choose between email list and Google group. I chose email list but later realized that if I had chosen Google group and set its permissions to open to everyone, it would have been less work for me. As I had already entered two of my friends email ids in the email list, I did not want to switch to Google group and ask them now to join that group.
- How testers join your test gave two links which was confusing to me earlier but later it got cleared up ('Internal testing' gave only one link):
- I used 'Join on Android' initially but on my phone where I had opted-in for 'Internal testing' and then uninstalled the app, using join on android link, IFIRC, showed the same Google Play page used for 'Internal testing' app (with warning icon and message). Later I came to know that I need to opt-out of 'Internal testing' before I can opt-in for 'Closed testing'.
- From: Set up an open, closed, or internal test, https://support.google.com/googleplay/android-developer/answer/9845334 : "A user who opts into your app's internal test is no longer eligible to receive an open or closed test. To gain access to an open or closed test, the user must first opt out of the internal test and then opt in to the open or closed test."
- Solution was to opt-out from 'internal test' for which I had to use the same 'opt-in' link for 'internal test' app and tap some 'Leave Program' button.
- Now I was on clean slate on my phone and could use Join on Android 'opt-in' link for 'closed test' (different opt-in link). I think some cache also has to be cleaned up as first time that did not work and showed me 'internal test' app page on Google Play which shows a warning sign about 'internal test'. But next time, it showed me 'closed test' app page on Google Play which does not show warning sign about 'internal test'.
- Another mistake I made was that I had 'saved' each of the changes I made as I added email ids but I had skipped 'publish changes'. So it seems certain additions I made were not in effect. After I did 'publish changes', opt-in to 'Closed testing' showed me the screen sequence put up in my blog post: Procedure to opt-in and install my "Timestamp Tracker" 'closed test' app.
- Me to GSAI (Google Search AI): google play console for closed test: On phone can I use either join on Android or join on web
- GSAI: Yes, for a Google Play closed test, testers can join using either the link on the web or the link on their Android phone; the key is that they must be signed in with the correct tester email, click their unique invitation link (which might say "Join on Android" or "Join on the web"), and then install the app from the Play Store to get the test version, with both methods leading to the same testing track once opted-in.
- I used 'Join on web' on Android phone and emulator to opt-in myself using two of Google ids. Initially that did not show in the status against Production in Dashboard. But later Production status showed: "2 testers currently opted-in".
- Even if I had used 'Join on Android' on Android phone or emulator, the outcome would have been the same - see Google Search AI response above.
- I was wondering whether after I had started the 'Closed testing' track whether I should pause the 'Internal testing' track that I had started earlier. But I was not sure whether that would trip up something and so did not pause it.
- I changed the countries/region to all countries as I wanted it to be open to any testers from outside India (if that happens).
- I was shown messages about additional issues for some countries but I ignored them as I think once I finish 'closed testing', before I go for release, I can change countries/region again.
- There is a status in the home page (All apps) too which lists all apps created by user.
- That 'App status' showed 'Internal testing' for quite some time. I think it changed to 'Closed testing' only after I did the 'publish changes' mentioned above.
- The 'Installed audience' for the app continues to show 0 even when App Dashboard -> Production shows 2 testers opted-in (and I have installed the app for two of my Gmail ids - phone and emulator).
The user inteface for all the work I did above is not great. In fact, I think it is quite confusing. But I/we don't have a choice if we want to publish Android apps. Google Play is the main gateway for Android apps. So we have to put up with whatever issues GPC UI may have.
Meanwhile I did some browsing to see how the community is handling this 12 testers requirement.
22:57, 18 December 2025
Short article/points:
How to know whether installed app is internal test app or closed test app?
Based on what I have seen so far: Use App info. link to go to Google Play page. Then:
- For 'Internal testing' app, Google Play page shows a warning sign icon and a message: "You're an internal tester. This app may be unsecure or unstable".
- For 'Closed testing' app, Google Play page shows an information sign icon and a message: "You've got early access to this app. Provide your feedback so the developer can improve this app."
...
GPC on home page was earlier showing an 'Under review' status for my app. Now it is blank. I think that indicates that the review went through. I am not familiar enough with Activity Log to confirm that. So I will presume it went through.
...
As there were not many people coming forward to test, on 18 Dec. late evening, I started trying out Testers Community app mentioned earlier.
That procedure needed me to switch from list of emails to Google groups for testers. Google Play Console (GPC) provides option of either emails list or Google groups but not both. I made the switch to Google groups and added testers community group.
Next I created a Google group: Ravis-AppTesters and added two of my Google ids to it (dG and rG). I used settings to ensure:
- Members (or non-members) cannot see other members; only group owner/manager can see - I am the only such person.
- So email id of persons being in the group will be known only to me.
- Anyone with a Google id can join by clicking 'Join Group' in https://groups.google.com/g/ravis-apptesters.
I added this Ravis-AppTesters group to the list of Google groups for 'Closed testing' track testers.
...
Uninstalled the app on emu. Then used testers community (TC) app to click on my app in its main list and choose test app. It took me to correct GP screen for my app. Installed it from there. But on switching back to TC app, it did not show me the 'open' button. Looks like the UI changes for user who owns the app. It also showed me option to upgrade from free to paid plan which gives testers faster.
Installed app on phone with dG id. Used testers community app to do the same. Installed, tested, gave 5 stars. Testers community app stats shows 1 testers for my app.
==================
19 December 2025
GPC App Dashboard showed 5 testers.
...
Given below is text from screenshot sent by H after I had moved from email list to Google group for app. H's email id was in email list but not in Google group.
-------
App not available
A testing version of this app hasn't been
published yet or isn't available for this
account.
If you've been invited to become a tester,
make sure you're signed in to the account
that was invited to the testing program. If
you've been invited to a Google Group as part
of the program, make sure you've joined the
Group.
-------
This confirms that changing from email list to google groups dropped the testers in email lists.
Added H to Ravis-AppTesters group and sent him CT (Closed testing) Join on Android opt-in. He installed the app using it and was able to use the app. The testers count in GPC App Dashboard went up to 6 from 5 earlier.
...
GPC Open testing page says: Open testing is available when you have production access.
================
====================
20 Dec. 2025
12 Testers point got reached sometime early today (20 Dec.) or yesterday late night. I think now the 14 day clock has started. After 14 days of 12 testers having my app on their Android devices, the 'Apply for production' may get enabled.
...
I got an email from App Hive which came to know about my TT app created on Google Play. It provided a link to its app:
https://play.google.com/store/apps/details?id=com.codignia.apphive and invited me to join it if I needed 12 testers. It is free but requires participation by testing others' apps. I browsed through the GP app page and found it to be quite interesting.
====================
22 Dec. 2025
I had a mail exchange with the developer name mentioned for Testers Community app. In his response he wrote, "... we have added the Special Public Testing credit worth Rs. 800 for entirely free into your account. You can promote your app into Special Public Testing to get more testers."
I promoted the app to "Special Public Testing" through the Testers Community app. That seems to have increased the credits for my app to 30 from 20 earlier.
...
I also got an invite mail from Google Groups, with sender being: aiunicornstudio@gmail.com
Message from aiunicornstudio@gmail.com
Need 12 testers? Let's help each other 🤝 Finding reliable testers to meet Google Play requirements or get feedback is tough. I’m building a community of developers to solve this through reciprocity. The process is simple: You test my app, I test yours. No paid services, just real developers helping each other get apps published. If you are interested, Please follow this steps : 1. Join the Google Group: https://groups.google.com/g/developers-community-official (Required for adding testers on Play Console) 2. Join the Telegram Chat: https://t.me/developers_community_official 3. Post your app link in the chat and test the latest app posted. Let's get our apps published together.
-----------
As of now, I do not plan to join above group.
...
As of around 17:45 PM on 22 Dec. 2025:
- Testers Community app shows "Testers Opted" as "37 testers"!
- When I first saw that or similar figure earlier today, I was pleasantly astonished.
- GPC App Dashboard shows "12 testers have currently been opted in for 2 days continuously"
- GPC -> Monitor and improve -> Ratings and reviews -> Testing feedback shows 17 reviews! Once again a pleasant surprise. Testers Community app is doing a great job for me.
- Most reviews gave 5 star rating and some of them provided encouraging positive feedback messages as well.
- Few reviews gave 3 star rating but did not provide any issues in the feedback message.
=====================
23 December 2025
Added Timestamp Tracker (TT) app again to Testers Community (TC) app around 1.30 PM on 23rd Dec. It shows as a different entry in 'My apps' in TC app with the standard 20 credits. On 23rd Dec. itself, two testers got added to it but GPC App Dashboard did not show any new feedback.
...
...
Moved most of TT from ReadProj to CurrProj but retaining android folder in ReadProj
...
CG chat: Timestamp Tracker App Query
Me: 3 days have been completed for closed testing with 12 testers. Now I want to explore making an update to the app. I myself am one of the testers. To test my updated app I would like to first use development build and then production build. For such work, I do local builds of the APK files. If I have to install the updated APK, I will have to uninstall the test app installed from Google Play store as some identifiers including package name is the same. ... But if I do that, GPC (Google Play Console) may remove me from list of 12 testers who are testing the app continuously over 14 days.
...
Me: Can u check whether Google Play clearly states whether developer himself can be counted as a tester (for meeting 12 testers for 14 days requirement)?
CG: ...
Google’s official documentation does not explicitly say whether:
The developer themself (the account owner / app uploader) can count as one of the 12 testers, or
Whether one tester must be a “distinct third-party user.”
In the published policy text, Google simply refers to “testers” who have opted in and remained in the closed test for 14 days. It does not single out developers as being excluded or included explicitly.
Google Help
There is no official line in the documentation confirming that a developer cannot count themselves, nor a line confirming that a developer can count themselves.
...
Me: To be on safe side, I should presume that I am being counted as a tester (I did opt-in to the closed test which was allowed by Google Play).
It will be very difficult for me to organize an additional phone.
So I think I should do the following:
1) Create a separate branch in my repo - say, updateclosedtest
2) In that branch, I should change, app name, app package name and perhaps app icon to somethingly slightly different (say with dev suffix).
3) Do my build and testing using that branch whose APK will have different package name.
4) If the updates testing has completed successfully, I can merge the key code changes into the main branch but exclude app name, package name and icon changes, update version number, build the .AAB and then upload it as a new release
5) that becomes the updated app for testers/users to download
...
Me: ... Well, the only file that comes into play for different variants of the app is app.json. Am I correct?
CG: Short answer: yes, you are correct for your current setup.
Given what you have described, app.json is the only file that differentiates the two variants (Play vs dev) in your project.
...
Me: ... That is exactly what I was thinking. app.json change alone is a separate commit for updateclosedtest branch. That commit should not be merged into main. Rest of the commits can be merged as they will be functionality or UI changes.
...
Me: Now about Android manifest and all that - as I will be using expo prebuild, that will pick up the values from app.json and set up Android manifest etc. correctly. I dont need to get into those issues as expo prebuild handles all that for me. Am I right?
CG: Yes — you are completely right.
Given that you are using Expo with expo prebuild, you do not need to manually deal with AndroidManifest.xml, Gradle files, or related native configuration for this purpose.
====================
24 Dec. 2025
At 7.39 am today (24 Dec.), Testers Community (TC) app shows 9 "Testers opted" and GPC App Dashboard shows one more feedback (4 star).
GPC App Dashboard now shows, "12 testers have currently been opted in for 4 days continuously".
...
git branch devct
git switch devct
app.json changes (in devct branch):
{
"expo": {
"name": "Dev Timestamp Tracker",
"slug": "dev-timestamp-tracker",
"version": "1.3.1",
...
"icon": "./assets/time-stamp-icon-wb.png",
...
"splash": {
"image": "./assets/time-stamp-icon-wb.png",
...
},
"ios": {
...
"bundleIdentifier": "com.ravisiyer.devtimestamptracker",
...
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/time-stamp-icon-wb.png",
...
},
"package": "com.ravisiyer.devtimestamptracker",
"versionCode": 7
},
...
}
=====
Related CG chat: Timestamp Tracker App Query
I shared app.json of main branch and above modified app.json for devct with CG and asked:
Are the changes I have made, enough and correct?
CG: Yes — the changes you have made are sufficient, correct, and appropriate for a dev-only (devct) branch. Your configuration achieves the intended goal: safe coexistence with the Play-installed app, with clear visual and identity separation, and no Play Console side effects.
Below is a precise review, item by item.
...
Final verdict
Yes — your devct app.json is correct and complete.
It satisfies all of the following simultaneously:
-
Protects closed-test continuity
-
Allows local APK install on the same device
-
Makes accidental confusion extremely unlikely
-
Keeps Play-bound configuration clean and untouched
You can proceed to:
-
Commit this app.json as the first, isolated commit on devct
-
Continue development and testing confidently
If you want, the next useful step would be:
----------
Had to update package.json of devct branch to keep it in synch with app.json.
Made only these two changes in package.json:
"name": "devtimestamptrackerweb",
"version": "1.3.1",
----
web version is working with this minimal change. The title of web pages shows new name of app (prefixed by Dev). Now I would like to test the android app version.
Rather than go straightaway for development or release build, I wonder if I could do a quick test with Expo Go.
...
================
25 December 2025
Me: Now back to Expo Go testing.
TT app uses SDK 53. So I need to use Expo Go app for that. I don't want to upgrade my app to SDK 54 as that might bring in some issues.
...
Me: ... Expo Go has moved to SDK 54.
But I can download Expo Go APK for SDK 53.
I downloaded Expo-Go-2.33.22.apk which is for Android device (and same file seems to be for emulator also).
Now I will uninstall Expo Go (SDK 54 version) from my device and perhaps Android emulator. Then install Expo-Go-2.33.22.apk on device and perhaps emulator too.
What do u say?
...
CG: ... Proceed exactly as you described:
...
[Later I found out that for APK install, Google Play Store does not do auto-update. So disabling auto-update is not required for this case. But this info. may be useful for some other scenarios and so I am sharing it in this post.]
CG: Method 1: Disable auto-update for Expo Go only (recommended)
This prevents Play Store from upgrading your SDK 53 Expo Go APK back to SDK 54.
-
Open Google Play Store
-
Search for Expo Go
-
Open the Expo Go app page
-
Tap the three-dot menu (⋮) in the top-right corner
-
Uncheck
“Enable auto update”
That is all.
Expo Go will now stay at the manually installed version unless you explicitly update it.
----
Me: ... I decided to uninstall Expo Go and install APK on emulator first. That went through. But Google Play Store for Expo Go now shows something similar to what u said (...) 'Update from Play' instead of 'Open'. Also the three vertical dot menu on top-right does not show an Enable Auto Update checkbox [On my phone, it is shown for Expo Go SDK 54, which I disabled].
----
...
[No background auto-update happens for sideloaded apps on emulator (and on device, if I understood CG correctly).]
Me: If I use Play Store to install Expo Go app, I can only install the latest version. Am I right?
CG: ... Yes.
If you install Expo Go via the Google Play Store, you can install only the latest version that Play Store currently serves.
There is no supported way in Play Store to select or install an older Expo Go version (such as an SDK 53–compatible build).
----
Me: I tested devct app with Expo Go on emulator. It shows the new app icon during app loading (splash icon is same as app icon). The app seems to work as expected.
...
Me: I am able to run both Closed Testing app and devct app thru Expo Go, at the same time (on emulator). I can switch btw the apps and operate each app independently.
Expo Go app info. on emulator shows version 2.33.22. But Expo Go app's settings icon shows:
Client Version: 2.33.22
Supported SDK: 53
...
Me: For next step of APK build and test, I plan to go straightaway to release APK. Also, I think I will try EAS cloud build instead of local build, and specify my own keystore and passwords
...
Me: I think I may have to create a new EAS project which matches my new package name/application Id for devct branch. Also, I may have to ensure that I delete eas.json before I do that to prevent confusion. So I will have two different eas.json files, one for main and one for devct branch.
===========
13:23, 25 December 2025
Me: ...
My app.json has:
"extra": {
"eas": {
"projectId": "--snipped--"
}
}
__________________
this is the main branch eas project.
If I do eas init now on devct branch, will eas init overwrite it with the new project id?
...
Me: I think I should do things before running eas init:
1) Delete the entire extra.eas block from app.json
2) Delete eas.json file
CG agreed.
Me: It is at eas build time that I will have to specify the keystore and password for cloud build, isn't it?
CG said yes.
----
Before above steps:
git commit -m "Dev version name, package, icon, version changes in app.json and package.json ONLY"
git push -u origin devct
--
[Continuing on devct branch]
Modified app.json as above.
Deleted eas.json
eas init
√ Would you like to create a project for @ravisiyer/dev-timestamp-tracker? ... yes
✔ Created @ravisiyer/dev-timestamp-tracker: https://expo.dev/accounts/ravisiyer/projects/dev-timestamp-tracker
√ Project successfully linked (ID: --snipped--) (modified app.json)
TimestampTracker>
------
Me: ... eas.json file is not created so far.
Next step is to do an eas android build (for devct branch which is where I am now).
For this dev version app, I think I can let eas create the keystore and password as this is not a version that I will be publishing to Google Play.
what do u say?
CG agreed.
Me: U wrote: EAS will:
generate a debug-style release keystore
---------------
I just want to confirm that even with the above, it will create a release APK and not a debug APK
CG: Yes — it will create a release APK, not a debug APK.
...
eas build -p android
EAS always performs a release build unless you explicitly request a debug build.
...
TimestampTracker> eas build -p android
★ eas-cli@16.28.0 is now available.
To upgrade, run:
npm install -g eas-cli
Proceeding with outdated version.
√ Generated eas.json. Learn more: https://docs.expo.dev/build-reference/eas-json/
Resolved "production" environment for the build. Learn more: https://docs.expo.dev/eas/environment-variables/#setting-the-environment-for-your-builds
No environment variables with visibility "Plain text" and "Sensitive" found for the "production" environment on EAS.
No remote versions are configured for this project, versionCode will be initialized based on the value from the local project.
✔ Incremented versionCode from 7 to 8.
android.versionCode field in app config is ignored when version source is set to remote, but this value will still be in the manifest available via expo-constants. It's recommended to remove this value from app config.
✔ Using remote Android credentials (Expo server)
√ Generate a new Android Keystore? ... yes
✔ Created keystore
Compressing project files and uploading to EAS Build. Learn more: https://expo.fyi/eas-build-archive
✔ Uploaded to EAS 1s
✔ Computed project fingerprint
See logs: --snipped--
Waiting for build to complete. You can press Ctrl+C to exit.
| Build in progress...
--------
By default eas build produces AAB. But I need an APK. So I have two options:
Edit the generated eas.json:
{
"build": {
"production": {
"android": {
"buildType": "apk"
}
}
}
}
Then run:
eas build -p android
OR
eas build -p android --profile production --apk
------
I will go for eas.json editing option as that will prevent default AAB builds.
-----
Meanwhile earlier build ...
✔ Build finished
🤖 Android app:
https://expo.dev/artifacts/eas/--snipped--.aab
---------
Now generating APK.
added to build.production in eas.json:
"android": {
"buildType": "apk"
}
----
But to be on safer side will run: eas build -p android --profile production --apk
That gave an error.
https://docs.expo.dev/build-reference/apk/ does not show --apk as a valid flag.
After sharing above, CG said: The only supported way to choose APK vs AAB is via eas.json.
Ran: eas build -p android --profile production
TimestampTracker> eas build -p android --profile production
★ eas-cli@16.28.0 is now available.
To upgrade, run:
npm install -g eas-cli
Proceeding with outdated version.
Resolved "production" environment for the build. Learn more: https://docs.expo.dev/eas/environment-variables/#setting-the-environment-for-your-builds
No environment variables with visibility "Plain text" and "Sensitive" found for the "production" environment on EAS.
✔ Incremented versionCode from 8 to 9.
android.versionCode field in app config is ignored when version source is set to remote, but this value will still be in the manifest available via expo-constants. It's recommended to remove this value from app config.
✔ Using remote Android credentials (Expo server)
✔ Using Keystore from configuration: Build Credentials --snipped-- (default)
Compressing project files and uploading to EAS Build. Learn more: https://expo.fyi/eas-build-archive
✔ Uploaded to EAS 1s
✔ Computed project fingerprint
See logs: --snipped--
Waiting for build to complete. You can press Ctrl+C to exit.
✔ Build finished
🤖 Android app:
https://expo.dev/artifacts/eas/--snipped--.apk
√ Install and run the Android build on an emulator? ... no
TimestampTracker>
----------
Me: eas build said:
android.versionCode field in app config is ignored when version source is set to remote, but this value will still be in the manifest available via expo-constants. It's recommended to remove this value from app config.
----
I don't see version code 9 in app.json or eas.json. So that must be internal to eas.
CG: ...
4. Optional cleanup
Since EAS ignores android.versionCode in this mode, you could remove it from app.json to avoid confusion. It will still be available programmatically via expo-constants.manifest.versionCode.
✅ In short: The incremented 9 is EAS’s internal remote version management, not something you wrote in app.json or eas.json. It is normal and expected.
---------
For devct branch, I will remove android.versionCode from app.json after APK test.
...
Was able to install on emulator. It worked as expected.
==========================
Quick Share from DPC was not able to see M21. But Bluetooth file transfer from M21 to DPC worked.
Tried lot of stuff including using Quick Share settings of share with everybody and receive from everybody or equivalent options on both DPC and M21, PC restart etc. but that did not work.
Quick Share settings on M21 showed Google account as dG user. Changed it to rG user (which is the user on Quick Share on DPC) - after that when I kept phone somewhat close to Bluetooth dongle on DPC, Quick Share on DPC saw it and I was able to transfer a 56 MB file within few seconds.
A few days back, I was modifying PlayStore account on M21 phone from dG to rG and then back to dG. Perhaps that reset Quick Share settings. Don't recall if earlier on I had set it to rG user.
==========================
Install on phone brought up PlayProtect Scan screen. On saying OK, it is showing Installing ... for a long time.
Did APK install again and chose don't send for scan. Install went through quickly.
The app is working as expected. I was able to run both TT closed test app and this devct version app at same time and operate both. They worked correctly.
App Info for devct app shows name as Dev Timestamp Tracker, and for App details in Store field it shows: App downloaded from My Files. Version is shown as 1.3.1
-----
git commit -m "Built release APK using EAS; Successful test"
Removed android.versionCode from app.json
Me: I will need android.versionCode if I am doing non-eas local build (using gradlew). Am I right?
CG: Yes ...
https://expo.dev/accounts/--snipped--/projects/dev-timestamp-tracker shows expo.version number followed by versionCode it generated with increment for each Build. So the last APK eas build shows 1.3.1 (9).
So if I mix local builds with eas cloud builds, I need to set local build android.versionCode to one more than last (successful) eas cloud build.
----
Made some changes to app code.
git commit -m "Changed launch to open; Updated date; Remove word Note"
eas build -p android --profile production
Got done.
Copied to emulator -> install. The install automatically updated the older version app to current one.
App seems to work OK.
Copied APK to phone. Tapping it showed popup asking whether I want to update the app. I chose Update.
Play protect screen came up. The 'install without scan' option was hidden behind some Details button. By the time I opened the Details button and was about to tap install without scan, the screen changed to 'Installing...' and got stuck there. I think it is essentially doing a google scan again.
I closed My Files app and then reopened it. Now when I tapped the APK (and chose Update, I guess though I don't recall that clearly), the Play Protect screen came up with a Don't send option which I tapped immediately. That installed the app right away.
========================
git log --oneline devct
4b5dce6 (HEAD -> devct, origin/devct) Changed launch to open; Updated date; Remove word Note
9a0c8d6 Built release APK using EAS; Successful test
80214e7 Dev version name, package, icon, version changes in app.json and package.json ONLY
af2005c (origin/main, main) Improved Readme
...
I need only commit 4b5dce6 to go into main. So shall I use the following:
git switch main
[Then confirm I am in main. VSCode will show current branch]
Then: git checkout -b main-before-devct-merge
git switch main
[Then confirm I am in main. VSCode will show current branch]
Then: git cherry-pick 4b5dce6
...
[after some exchanges]
CG: ...
git switch main
git switch -c main-before-devct-merge
git switch main
git cherry-pick 4b5dce6
-----
Did the above.
git cherry-pick 4b5dce6 gave a message: CONFLICT (content): Merge conflict in app.json
error: could not apply 4b5dce6... Changed launch to open; Updated date; Remove word Note
---
In VSCode I got some Merge Resolve button which I used to ignore app.json changes [It appeared in this commit as I had removed android.versionCode after earlier app.json changes commit. Perhaps I should have separately committed even the minor android.versionCode change separately.]
Other two file changes had no conflicts.
VSCode gave me an option to commit the changes which I did.
Then I pushed the commit to remote GitHub. That worked.
...
git diff devct main
shows only expected differences in app.json, eas.json and package.json
git diff main main-before-devct-merge
shows only expected differences in App.js and Readme.md
----
CG response: ...
6. Final assessment
-
Cherry-pick strategy: Correct
-
Conflict handling: Correct
-
Branch hygiene: Excellent
-
Verification discipline: Excellent
-
Outcome: Clean and production-safe
Nothing needs to be undone or amended.
You handled this exactly as a careful maintainer should.
-----------
Now in main branch I will change
- In app.json expo.version to 1.3.1 from 1.2.1
- In package.json version to 1.3.1 from 1.2.1
I will commit that.
Then I will do an Expo Go test to check if app is working OK.
After that I will build an aab using eas cloud build.
---
Expo Go app works well on emu.
[Decided to commit after Expo Go check]
git commit -m "Bumped version to 1.3.1 for release"
Now I need to do eas build but specify my own keystore file and password
Can I do that on eas.dev web interface before I issue eas build?
---
https://expo.dev/accounts/--snipped--/projects/timestamp-tracker/credentials -> Android -> click on com.ravisiyer.timestamptracker
I have a .keystore file. eas web UI accepts only .jks or .p12
[From https://raviswdev.blogspot.com/2025/06/using-chatgpt-to-write-react-native.html ]
I had generated the keystore using this command:
keytool -genkeypair -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
CG: Yes — that command unambiguously confirms that your keystore is a JKS keystore.
Let me state this clearly and definitively.
What your command proves
You ran:
Key facts:
-
No -storetype specified
-
RSA 2048 / 10000 days
-
Alias-based keypair
Therefore:
Your file is a valid JKS keystore, regardless of the .keystore extension.
Why EAS rejects .keystore
EAS is extension-strict, not format-confused.
It accepts:
It rejects:
This is a UX/validation decision, not a technical limitation.
What to do now (no ambiguity)
Step 1 — Rename the file
On Windows:
================
Me: I will copy it as .jks. This way my local build config does not change (it uses .keystore file). Is that OK?
[CG was OK with it. I copied the file.]
I created a new Build Credentials with above keystore file and related password. I named the Build Credentials "Google Play Store" and set it as the default Build Credentials.
...
TimestampTracker> eas build -p android
★ eas-cli@16.28.0 is now available.
To upgrade, run:
npm install -g eas-cli
Proceeding with outdated version.
Resolved "production" environment for the build. Learn more: https://docs.expo.dev/eas/environment-variables/#setting-the-environment-for-your-builds
No environment variables with visibility "Plain text" and "Sensitive" found for the "production" environment on EAS.
✔ Incremented versionCode from 6 to 7.
android.versionCode field in app config is ignored when version source is set to remote, but this value will still be in the manifest available via expo-constants. It's recommended to remove this value from app config.
✔ Using remote Android credentials (Expo server)
✔ Using Keystore from configuration: Google Play Store (default)
Compressing project files and uploading to EAS Build. Learn more: https://expo.fyi/eas-build-archive
✔ Uploaded to EAS 5s
✔ Computed project fingerprint
See logs: --snipped--
Waiting for build to complete. You can press Ctrl+C to exit.
...
Waiting for build to complete. You can press Ctrl+C to exit.
✔ Build finished
🤖 Android app:
https://expo.dev/artifacts/eas/--snipped--.aab
TimestampTracker>
===========
Me: ... Can Google Play Console (GPC) pick up the aab from above url or do I have to download it on my PC and then upload it to GPC?
CG: You must download the AAB to your local machine and then upload it to Google Play Console.
Google Play Console
cannot pull artifacts directly from an Expo (or any third-party) URL.
...
Me: The eas web page says: eas submit --platform android
can be used to submit to app store
...
Me: https://docs.expo.dev/submit/android/ gives the procedure but does not mention Google Cloud a/c.
I think I can meet all the requirements.
But as this is my first Google Play Store app, I will go with download followed by upload to GPC. In future I may explore eas submit.
...
Me: Downloaded aab to pc.
Now in Google Play Console (GPC) I need to create a new release in my closed testing track, isn't it?
CG said yes.
-----------
In Closed testing track
Clicked “Create new release”
Uploaded new .aab file
Confirmed that the version code and version name match what I expect:
Version name: 1.3.1
Version code: 7
Skipped giving Release notes.
Saved
Next step: Send to Google for review.
But before that: Waiting for "Running quick checks for commonly found issues" to complete.
...
It completed and says: Your changes can now be sent for review. We may find additional issues when reviewing your app.
Clicked Send 1 change for review button
----
Perhaps within half an hour to an hour after send for review, the app got published.
Now for the TT closed track app on my device, I see an Update button on Google Play Store page. I also saw the Auto Update is enabled. So I will wait and see if it gets auto updated.
-------
GPC shows: 7 (1.3.1)
Available to selected testers
1 version code
Released on Dec 25 11:10 PM
===================
06:03, 26 December 2025
My TT app closed testing track did not get updated automatically on both my Samsung M21 phone and on emulator though it is over 6 hours since the update was published. The Google Play Store page for the app shows an Update button and Enable auto update is checked.
Now I use 4G mobile Internet. Is there some setting on phone which disables auto update when not connected over WiFi?
CG: ...
Why auto-update did not happen (even after 6+ hours)
1. Play Store global setting: Wi-Fi only
In Google Play Store:
-
Open Play Store
-
Tap your profile photo (top-right)
-
Settings → Network preferences → App download preference
Very commonly set to:
-------
Me: Yes, my above setting for Google Play Store is "Update over Wi-Fi only"
That explains my phone not updating. But emulator connection though eventually through my PC connected to mobile phone hotspot, is shown as Android WiFi.
On emulator, the Settings → Network & internet → Internet -> connected Wi-Fi (AndroidWifi) -> Network usage: is "Detect automatically"
Could it be that the emulator detects that it is a metered network and so does not auto update the app?
CG: Yes. Your reasoning is sound, and that is exactly what is happening.
Even though the emulator shows “AndroidWifi”, it can still be treated as a metered Wi-Fi network, which prevents auto-updates.
...
------------
Me: Clicked Update on Play Store to update the app on both emulator and device. The update got done quickly. Opened the app on both phone and emulator and confirmed that it shows the updated app functionality (minor changes but those minor changes are shown). Also app version number is shown as 1.3.1 (earlier it was 1.2.1) in App Info page for both emul and device. So the closed testing track app update seems to have got done correctly.
CG agreed.
GPC shows: 12 testers have currently been opted in for 6 days continuously
Ratings and reviews -> Testing feedback: Have been same since past few days I think. 18 feedback entries with latest entry dated: Dec 23, 2025, 19:39. Most ratings are 5 star but few are 3 or 4 star.
=======================
13:28, 27 December 2025
Today on GPC home page, against my only app of TT, I saw 33 as the Installed audience, with App Status as Closed testing.
Yesterday, IFIRC, it was showing 4 as the Installed audience. It was showing 4 over past few days, IFIRC and was showing 0 for many days earlier.
So there seems to be a delay of some days in "Installed audience" reporting.
The app dashboard shows: 12 testers have currently been opted in for 7 days continuously
No new testing feedback since last entry of Dec 23, 2025, 19:39
=======================
29 Dec 2025 ~11.30 AM
I think I had not mentioned this: Early hours of 27 Dec., I added timestamp tracker again to Testers Community app. Now, 11.51 AM, it shows 12 testers as "Testers Opted".
GPC App Dashboard: "12 testers have currently been opted in for 9 days continuously".
Testing feedback has one more entry with 5 star feedback, dated: Dec 28, 2025, 01:22.
GPC Home page continues to show Installed audience of 33.
- From https://www.betacircle.app/ which seems to be a free service for getting 12+ testers
- An individual who said she provided "active human testers with proper feedback" and asked me to DM her for details.
I responded on or around 28 Dec. thanking them but mentioning that I already got 12 testers. Both responded back.
=======================
06:06, 30 December 2025
GPC Home page now shows installed audience as 28 (a drop from earlier 33, IFIRC).
GPC App Dashboard shows: 12 testers have currently been opted in for 10 days continuously
As condition is: Run your closed test with at least 12 testers, for at least 14 days
I am 4 days away from meeting the condition.
2025-12-30 08-44-57: Added timestamp tracker again to Testers Community app few minutes back
12:51, 30 December 2025
GPC: One more feedback - 4 stars. Totally 20 reviews.
========
13:47, 31 December 2025
GPC Home page now shows installed audience as 33 (up from earlier 28).
Testers Community app shows Testers Opted as 12 testers. Perhaps that resulted in above installed audience number increasing to 33 from 28.
GPC App Dashboard shows: 12 testers have currently been opted in for 11 days continuously
GPC: No new feedback. Totally 20 reviews. Last feedback: Dec 30, 2025, 12:24
07:00, 01 January 2026
GPC Home page: Installed audience is 35.
GPC App Dashboard shows: 12 testers have currently been opted in for 12 days continuously
GPC: No new feedback. Last feedback: Dec 30, 2025, 12:24
========
08:56, 02 January 2026
GPC Home page: Installed audience is 34.
GPC App Dashboard shows: 12 testers have currently been opted in for 13 days continuously
GPC: No new feedback. Last feedback: Dec 30, 2025, 12:24
09:22, 03 January 2026
GPC Home page: Installed audience is 30.
GPC App Dashboard shows a green tickmark against: Run your closed test with at least 12 testers, for at least 14 days. The 'Apply for production' button below is enabled.
GPC: No new feedback. Last feedback: Dec 30, 2025, 12:24
So now I can apply for production!
10:01, 03 January 2026
GPC App Store needs a "Feature graphic" of 1,024 px by 500 px.
I am using a two screenshot combo pic (light & dark mode SS): 20260103-Mobile-Light-Dark-Combo.jpg but which is 2160x2340.
It has to be compressed and cropped to 1,024 px by 500 px. I don't recall how I had done it in the first submission of this app.
It was easy as GPC itself enabled me to do it. I had to upload 20260103-Mobile-Light-Dark-Combo.jpg and then choose to crop it to Feature graphic (which appeared automatically on using crop option as I was trying to upload it as Feature graphic asset). Now I could move the crop rectangle to the area I wanted and Save (it) as copy. Next was to use that asset as 'Feature graphic'.
------
To check/modify the app entry in app store
GPC -> TT app -> Left side bar 'Grow users' -> 'Store presence' -> 'Store listings' -> 'Default store listing' right arrow button on extreme right of entry -> Shows details of 'Default store listing'
...
To keep things simple for first production release and associated review, I am not mentioning links like associated blog post in app description.
...
After saving changes to App store listing, I sent them for review which got done a little later.
...
Went through 'Apply for production' process and successfully completed that.
GPC showed: "We have your application for production access
We're reviewing your application form. We'll email the account owner with an update. This usually takes 7 days or less, but may occasionally take longer.
Applied today, 12:54 PM."
----------
Timestamp Tracker icon is different in Google Play (GP) store listing and app icon shown on mobile after installation. GPC did not accept the app icon I use in the app itself. So I had to provide it a different icon suitable for the resolution it wanted.
As per CG:
Because of these different technical requirements, it is very common that:
-
The launcher icon cannot be reused as-is for the Play Store
-
Developers must supply a separate, adjusted icon for the listing
=====================
22:17, 03 January 2026
Got production access for TT app.
Making public release of TT app.
Chose all countries/regions.
Created new release from version 1.3.1 app bundle already there in library (used in closed testing)
For release note:
<en-US>
Initial public release.
</en-US>
-------
Shows 1 Error: Your app does not support 16 KB memory page sizes.
But I have a 'Proceed anyway' option.
Chose it.
----
Shows 1 warning: There is no deobfuscation file associated with this App Bundle. If you use obfuscated code (R8/proguard), uploading a deobfuscation file will make crashes and ANRs easier to analyze and debug. Using R8/proguard can help reduce app size.
----
This was there for test releases too. I ignored it then and am ignorning it now.
---------
Sent the changes for publishing review.
Will follow procedure for 'Publish your app on Google Play' after publishing review is done for earlier steps that I saved.
----------
The app has got published as production even without me having to follow procedure for 'Publish your app on Google Play'. I guess the earlier changes sent for publishing review after clearing that review, triggered the 'Publish your app on Google Play' action.
GPC home page now shows Timestamp Tracker with App status as "Production", Installed audience: 30, and Last updated: Jan 3, 2026.
GPC Timestamp Tracker App Dashboard states
Timestamp Tracker
com.ravisiyer.timestamptracker
Publishing overview: You have no unpublished changes
Test and release: Latest production release . 13 minutes ago (Released on Jan 3, 2026, 22:33) . 100% (Available to 100% of users).
[Device types:] Phones and tablets, + 2 more (Available on Phones and tablets, Android XR, Chrome OS)
Installs: 29
Install base: 87.9%
Device acquisitions: 50
First opens: 37
MAU: 39
===================
On my mobile, the 'closed testing' app's info page -> App details in store -> took me to Google Play page of app which seems to have got promoted to production as there is no mention of testing on it now.
Looks like as the app bundle was the same, the closed testing release has got changed to production release on Google Play, and there is no need for existing users to install the production release app separately. In other words, the closed testing release app on their phone seems to have got promoted to production release app without any additional automatic/manual update.
=======================
4 Jan. 2026
Comments
Post a Comment