Do it yourself
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
See plans on the main pageChatGPT & Codex
Android builds fail for a short list of reasons: the wrong JDK, an Android Studio older than the project, a package rename that missed a file, a google-services.json for the old package, or a keystore that does not match. Codex reads Gradle output faster than anyone and can fix most of it in the project files. Here is the map, the safe prompt and the one file you keep to yourself.
From $109 one-time per platform, or let our team do it all from $698.
The WebViewGold Android project is a regular Android Studio project with a small set of files you actually touch. Knowing them makes any Gradle error readable:
applicationId, and in current versions namespace for the code package), versionCode and versionName, the SDK levels (compileSdk, targetSdk, minSdk), the dependencies, and the OneSignal app ID if you use OneSignal.strings.xml (app name and texts), colors.xml, the launcher icons in the mipmap-* folders and the splash GIF.And one file that should never be in the project folder at all: your upload keystore.
| Message | Cause | Fix | Codex? |
|---|---|---|---|
| "The project is using an incompatible version (AGP …) of the Android Gradle plugin. Latest supported version is AGP …" | Android Studio is older than the project | Update Android Studio (Help → Check for Updates), then File → Sync Project with Gradle Files. Do not downgrade the plugin | Explains; you update the IDE |
| "Android Gradle plugin requires Java 17 to run" / "Invalid Gradle JDK configuration found" | Gradle runs on the wrong JDK | Settings → Build, Execution, Deployment → Build Tools → Gradle → Gradle JDK: choose the JDK bundled with Android Studio. In a terminal, point JAVA_HOME to it | Yes |
| "SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable …" | No local.properties (fresh clone or a terminal build) | Open the project once in Android Studio, which writes the file, or create it with sdk.dir; never commit it | Yes |
| "Failed to find target with hash string android-…" / "Module … platform android-… not found" | The SDK platform for compileSdk is not installed | Tools → SDK Manager → install that API level, or click "Install missing SDK package(s)" in the Build window | Explains |
| "No matching client found for package name …" | google-services.json was issued for another package name, usually the template's | Register the new package in Firebase and download a fresh google-services.json into app/ | Finds it; you download |
| "Duplicate class ….BuildConfig" | A stale generated BuildConfig after a package rename | Delete the stale file, Build → Clean Project, then Rebuild Project | Yes |
| "Duplicate resources" | Two files with one resource name, e.g. ic_launcher.png and ic_launcher.webp from an icon generator | Keep one file per resource name | Yes |
| "resource mipmap/ic_launcher_foreground … not found" | A foreground icon is missing in one mipmap folder | Replace icons one by one, keeping every file name in every folder | Yes |
| "Keystore was tampered with, or password was incorrect" | Wrong keystore password or wrong file | Find the right file and password in your password manager; there is no recovery | No |
| Play Console: "Your Android App Bundle is signed with the wrong key" | Signed with a different upload key than Play expects | Sign with the original upload keystore; if it is lost, request an upload key reset in Play Console | Compares fingerprints |
| Play Console: "Version code … has already been used" | versionCode was not raised | Increase versionCode (and versionName for users) in app/build.gradle | Yes |
| Play Console: "You need to use a different package name because … already exists" | The template package com.webviewgold.myappname was never changed | Rename the package before the first upload (steps below) | Yes |
| Target API level warning or rejection | The bundle was built from an older template | Update the template and rebuild (see the callout below) | Explains |
Codex runs ./gradlew in a terminal, and a terminal is not Android Studio. Three differences explain most "but it works in the IDE" moments:
JAVA_HOME points to, often an old Java or nothing. Point it to the bundled one (on macOS usually /Applications/Android Studio.app/Contents/jbr/Contents/Home) before the build, or ask Codex to.local.properties with sdk.dir; a fresh clone does not have it. Codex can create it with your local SDK path, and it stays out of Git.A Codex cloud task can in principle build the Android project too, but only after its install script sets up a JDK and the Android SDK and its network rules allow Google's Maven and download hosts. For a one-off fix, building locally is simpler.

With a good optimized version of your web app you can have a stunning mobile app within a couple of minutes. Additionally to that the customer service is very nice and very helpful! I can just recommend WebViewGold :-)
Run in the Android project folder (the one with gradlew; on Windows use gradlew.bat), or let Codex run it. The debug build checks that the project compiles without involving your signing key.
# 1. Gradle version and the JDK Gradle runs on
./gradlew --version
# 2. Debug build with stack trace, log saved for Codex
./gradlew clean assembleDebug --stacktrace 2>&1 | tee gradle.log
# 3. Leftovers of the template package name after a rename
grep -rn "com.webviewgold.myappname" app/ --include=*.java --include=*.xml --include=*.gradle --include=*.json
# 4. Identity, versions and SDK levels Google checks
grep -n "applicationId\|namespace\|versionCode\|versionName\|compileSdk\|targetSdk\|minSdk" app/build.gradle
# 5. The package name your google-services.json was issued for
grep -n "package_name" app/google-services.json
# 6. Your upload key fingerprint (you run this; it asks for the keystore password)
keytool -list -v -keystore ~/keys/upload-keystore.jksThe rules stop the two classic agent mistakes: upgrading everything to fix one error, and touching signing.
This is the WebViewGold Android Studio project for our app. The Gradle build fails. Read gradle.log (output of ./gradlew clean assembleDebug --stacktrace) and fix the cause. Project facts: - App settings live in Config.java; identity, versions and SDK levels in app/build.gradle; texts in res/values/strings.xml. - Our package name: [com.yourbrand.app] (the template default was com.webviewgold.myappname). - Uploaded to Google Play already: [yes/no]. If yes, applicationId must not change. - We use Firebase or Firebase-based push: [yes/no]. If yes, app/google-services.json must be issued for our package name. Rules: - Find the first real error; ignore deprecation warnings. - Do not upgrade the Android Gradle Plugin, Gradle, Kotlin, compileSdk, targetSdk or any dependency unless the error requires it. If an upgrade is needed, stop and explain why and which Android Studio version it needs. - If the error is about the JDK or the SDK path, fix JAVA_HOME or local.properties for this machine; do not commit local.properties. - Never create, move, print or commit a keystore or its passwords, and do not add signing configuration to build.gradle. - Do not edit google-services.json by hand. If its package name does not match, tell me to download a new file from the Firebase console. Show the diff, then run ./gradlew assembleDebug again to verify, and summarize the cause in two sentences.
The template ships with com.webviewgold.myappname, which is taken on Google Play. Rename once, before any upload.
The Android publishing docs say it plainly: back up the source folder before renaming. With Git, a commit is the backup.
Reverse-DNS, lowercase, no hyphens, ideally identical to your iOS bundle ID. The first upload to any Play track locks it (why it is permanent).
Follow the rename video in the publishing docs (Android Studio's refactoring), or let Codex do it: applicationId and namespace in app/build.gradle, the package line at the top of every Java file together with the matching folder path, and AndroidManifest.xml. The docs also show how to shorten the name to drop the middle part.
If you use Firebase or Firebase-based push, add an Android app with the new package name in the Firebase console and replace app/google-services.json. Editing the old file by hand is not a fix.
Run the grep from the block above until it finds nothing, then Build → Clean Project and Rebuild Project. A "Duplicate class …BuildConfig" error at this point means a stale generated file; delete it and clean again.
OneSignal and RevenueCat app settings, RATE_MY_APP_URL in Config.java, and assetlinks.json on your domain if you use App Links.
Google Play accepts updates only when they are signed with your upload key, so the keystore is the most valuable file of your Android app. Create it once with Build → Generate Signed App Bundle or APK in Android Studio, store it outside the project folder, and keep the file and both passwords in a password manager plus a backup. Add *.jks and *.keystore to .gitignore even if you never plan to commit one.
With Play App Signing, the standard for new apps, Google keeps the app signing key and your keystore is only the upload key. That is good news if you lose it: you can request an upload key reset in the Play Console. It is not instant, so do not plan around it. What you must never do is let an agent generate a new keystore "to fix" a signing error for an app that is already on Google Play, or paste the passwords into a prompt. You run keytool -list -v and compare the SHA-1 fingerprint with the one the Play Console shows on its app integrity page; Codex only needs the result.
versionCode for every upload, including uploads to testing tracks.It needs a JDK and the Android SDK either way, and Android Studio is the easiest way to get both. With them installed, Codex can run ./gradlew in the terminal and fix most project-file errors.
The one the Android Gradle Plugin version in the project requires; current plugin versions need JDK 17 or newer. The JDK bundled with a current Android Studio works, which is why selecting it as Gradle JDK fixes most JDK errors.
Not if Play App Signing is enabled, which is the standard for new apps: request an upload key reset in the Play Console and sign future updates with the new upload key. Without Play App Signing you cannot update the app and have to publish a new one.
No. A different package name is a different app on Google Play, with a new listing and no ratings. Rename before the first upload to any track.
Update the WebViewGold template instead. It targets the current level and contains the code the new behavior needs; a bare number change can upload fine and then break notifications or file uploads.
Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
See plans on the main page$349 per license, one-time add-on
No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.
How the Cloud Builder works Try the free demo$698 per platform $798
Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.
Full Service details Powered byWinter Sale prices valid until December 31, 2026.
App Store & Google Play approval guarantee – or your money back within 14 days
Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.
Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.