How to · Android

APK converter: four different jobs, one word

Four different source files going into one APK build
Timothy Lindblom

Founder, Newly

Search for an apk converter and you land on a row of upload boxes. Drop a file in, get an app out. It is a good business, because four unrelated groups of people type that phrase and only one of them is holding a file that can be converted at all.

The other three need a build, a wrapper, or an app that does not exist yet. Sorting yourself takes about ten seconds and saves an afternoon spent feeding a zip to sites that were never going to return anything installable. If you already know your case, you want a signed build and you are not installing Android Studio to get one, Newly’s APK builder does that end to end. Everyone else: start with the router.

.zip
a folder someone sent me
code
screens, scripts, AI output
a site
a URL or some HTML
.aab / .apks
a bundle that will not install

Four searches. One phrase. Almost no overlap in what has to happen next.

Find your case

Key Takeaways

  • One word, four jobs. “APK converter” covers a zip of source, loose code, a live website and a .apks bundle, and each has a different real route.
  • Nothing converts an arbitrary zip. The manifest, bytecode and signature have to be built; no tool can rename them into existence.
  • bundletool is the only converter that exists. It turns Play bundles into APKs. Everything else marketed as a converter is a builder or a wrapper.
  • Most people should not convert at all. Describing the app and letting a builder compile it is faster than reassembling files by hand.

Start with what is on your disk.

These are not four variations on one method. They share the file extension at the finish line and nothing else, different tools, different failure modes, wildly different odds of working.

What have you actually got?

One question. The answer decides whether a converter is even the right kind of tool.

Two answers, and it depends on what is inside

Open the zip before you do anything else. If you can see a build.gradle, an app.json or a package.json in there, you are holding source code and the route is a build, not a conversion. If you see photos, PDFs, a few HTML files or one component someone pasted for you, no tool on the internet can turn that into an APK, because there is nothing in the archive that a compiler could ever have produced a classes.dex from.

  1. Step 1

    your-project.zip

    unknown contents

  2. Step 2

    Unzip and check

    is it a project?

  3. Step 3

    Build it

    Gradle, or a service

  4. Step 4

    Signed APK

    installs on a phone

Scroll the route sideways to see every step.

Realistic time
20-60 minutes the first time, most of it spent installing a toolchain
The bit that catches people
Renaming the file to .apk does nothing. An APK is a zip, but one holding compiled dex bytecode, a binary manifest and a signature block, none of which appear because you changed four characters.

Next: converting a zip file to an APK.

Renaming the file never works. Here is the reason.

An APK is a zip. That one true fact has probably cost more wasted evenings than any other piece of Android trivia, because the obvious next thought is that the reverse must also hold. It does not. A zip becomes an APK the way a pile of bricks becomes a house: the parts are related and the work is all of it.

Open a working APK with any archive tool and you find five things a renamed folder cannot contain.

classes.dex
Your code, compiled to Dalvik bytecode. A compiler produced this. Nothing in a zip of source files becomes it by being renamed.
AndroidManifest.xml
The binary form, not the readable XML in your project. It declares the package name, the launcher activity and every permission.
resources.arsc and res/
The compiled resource table plus the assets it points at. Strings, layouts, densities, and the mapping between them.
lib/
Native libraries, one folder per CPU architecture. This is a large part of why one app can ship as several different APKs.
META-INF/
The signature block. Without it the package installer stops before it starts, and no amount of retrying the download helps.

The last one is the wall. Android’s platform documentation states it without hedging: every app that is run on the Android platform must be signed by the developer, and packages that are not get rejected by Google Play or by the device’s installer. So a converter that hands back an unsigned file has handed you a file, not an app.

Six things people call converting

Ranked by nothing. Read the row that matches what you have, and ignore the rest, the times are what these actually take on a laptop that has never built an Android app before.

RouteWhat it actually doesWhat you needTimePublishable?
Renaming .zip to .apkChanges four characters in a filename.Nothing10 secondsNo. Parse error on install.
An online converter siteEither runs a real build of a project it found in your upload, or wraps your files in a WebView.An upload, and trustMinutes, or a failed buildUsually not. Signed with their key, if at all.
bundletool build-apksTurns an .aab or .apks into APKs a device can install, including one universal APK.A JDK and the bundletool jarUnder 5 minutesYes with --ks. A debug key otherwise.
Gradle assembleReleaseCompiles a real Android project into an APK on your machine.JDK, Android SDK, the project itself20-60 minutes the first timeYes, once a signing config exists.
BubblewrapGenerates and builds an Android app that opens your website in a Trusted Web Activity.Node, a JDK, Android command-line toolsAbout an hourYes. It outputs app-release-signed.apk.
A cloud build serviceBuilds the project on someone else's machine, so nothing is installed on yours.An account and a project it can read5-15 minutes per buildYes, when you hold the key.

Toolchain requirements and command names checked against Android and Chrome developer documentation, September 2026. Times are from first-run installs, not warm caches.

If you have a bundle

A bundle to an APK is the only real conversion here

You downloaded something and your phone refuses it. Check the extension. If it ends in .aab, .apks or .xapk, you are holding a publishing format rather than an app, and the fix is mechanical.

Why the phone says no

An Android App Bundle carries every version of your app’s code and resources in one container, and Google Play slices it into the specific APKs each device needs. A phone has no slicer. bundletool is the slicer, published by Google, and it is the same one Android Studio and Play use internally. Point it at a bundle with --mode=universal and it builds a single APK that covers every configuration your app supports.

Terminal · bundletool
bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks --mode=universal
Verbatim from Android's bundletool documentation, minus the line break. Add --ks, --ks-key-alias, --ks-pass and --key-pass to sign with your own keystore; leave them off and bundletool signs with a debug key.

The whole procedure

  1. 1Install a JDK if you do not have one. bundletool is a jar, so java -version has to answer.
  2. 2Download bundletool from the Android developer site and keep the jar somewhere you can type the path to.
  3. 3Run build-apks with --mode=universal against your .aab, pointing --output at a .apks file that does not exist yet.
  4. 4Unzip the .apks, it is an ordinary zip, and take the single APK the universal mode left inside, or run install-apks to push it to a connected device.
  5. 5Only if this build is going to a store or a real tester: pass --ks, --ks-key-alias and the password flags, so it is signed with your key rather than a debug one.

One caveat about .xapk and .apkm: those are not Android formats at all. Third-party download sites invented them to ship an APK plus its split or OBB files together, so the honest description is unpack, not convert. Rename to .zip, open it, and the APK is usually sitting right there.

If you have a website

A website is content you wrap, not code you convert

Google publishes a tool for this and it is genuinely good. Bubblewrap is a Node command-line tool that reads your web manifest, asks you to confirm the values it pulled out, generates an Android project around them and builds it. Two commands, and the second one leaves app-release-signed.apk on disk.

Terminal · Bubblewrap
bubblewrap init --manifest=https://my-twa.com/manifest.json
bubblewrap build
From Chrome's Trusted Web Activity quick start. Requires Node 10 or higher, a JDK and the Android command-line tools; init prompts you through the values it reads from your manifest.

The catch is a file, and it is the step people skip. A Trusted Web Activity only drops the browser address bar once your domain hosts an assetlinks.json that names the app. Miss it and the build still installs, still runs, and still looks like a browser, which was the one thing you were trying to avoid.

Be clear-eyed about what this gets you. It is your site, in an app shell, reaching the APIs a browser exposes to a page and no others. For a content site that is exactly right and takes an hour. For anything that needs the camera roll, background location or a native share sheet, wrapping is the wrong shape and you will feel it in week two.

If you have code

“Code to apk converter” splits in two

Whether this is a five-minute job or a fortnight depends on one question: is what you have already an app?

If it is a real project, you want a build

A zip with build.gradle.kts and a settings file in it is an Android project, and the conversion you are looking for is one Gradle task. Android’s command-line build docs spell it out: ./gradlew assembleDebug produces a debug APK signed with a debug key, in project/module/build/outputs/apk/, and assembleRelease produces the one you can ship once a signingConfig exists in your module’s build file. A React Native or Expo project answers to a different toolchain, but the shape is the same, resolve dependencies, compile, sign.

The first run is slow and the failures are dull: a JDK version mismatch, an SDK licence you have not accepted, a dependency that wants a newer Gradle plugin. None of it is conceptually hard. It is just an afternoon.

If it is not an app yet, no converter can save you

This is the case most people are actually in, and the reason “code to apk converter” converts so well as a search: you have working logic and nothing around it. No manifest. No launcher activity. No navigation, no icon, no dependency graph an Android build could resolve, no keystore. The distance between a folder of code and an APK is authoring an app, and file converters do not author anything.

So the realistic options are to build the app around your logic by hand, or to describe the app and have it generated and built for you. The second one is what Newly does: you write what the app should do in plain English, it generates a React Native project, and the Android build runs in the cloud rather than on your laptop.

What the build step looks like

Newly’s documented flow for an Android test build is four inputs long: open your project, click Deploy, choose APK, enter your bundle identifier, and start the build. A download link comes back in five to ten minutes. Nothing is installed locally, no Android Studio, no SDK, no Gradle daemon eating your battery.

Newly Deploy panel showing the Android targets Simulator, APK, AAB and Play Store with APK selected
Deploy offers a testing APK and a Play Store AAB as separate targets. Pick the first one for anything that is going to a person rather than a store.
Step 1 of 4 in Newly's Android wizard: the bundle identifier field filled with com.yourcompany.shiftsync
The bundle identifier is the only thing you have to decide. Reverse-domain form, and it is awkward to change after a store release.
Newly's finished build state with Rebuild APK and Download APK buttons and the build history open
Five to ten minutes later, a download link. Sideload it, or send it to a tester who has installs from unknown sources enabled.

For Google Play you pick the AAB target instead, and the wizard adds three inputs: your app version, and the generation and download of a signing keystore. Save both files it gives you. That keystore is what proves the next version came from you, and there is no recovery if it is lost.

The limitation, stated plainly

Newly is not a converter and has no free tier. There is no upload box that takes your existing zip and returns an APK, the input is a description of the app you want, not the files you already have. And it starts at $25 a month for 50 credits, with one credit spent per prompt, so you cannot try it first and decide afterwards. If your zip really does contain a buildable project, Gradle on your own machine is free and it is the better call.

Is an apk converter online safe to use?

Depends entirely on which of the four jobs it is doing. A site that runs bundletool on your .aab is doing a mechanical, verifiable thing, and you can check the result yourself. A site that promises an APK from any zip is either running a build it has not described or wrapping your files in a WebView, and neither is what you asked for.

The part that costs real money is signing. Android identifies your app by the key it was signed with, so a release signed by a stranger’s key is an app you can publish once and never update. Before you upload anything:

  • The site says which build it runs, and names the toolchain. A converter that will not say what it does with your files is telling you something.
  • You keep the signing key, or the output is explicitly a debug build for testing only.
  • It promises an APK from any zip. That promise cannot be kept, so something else is going on.
  • It signs the release for you with a key you never see. That app can be installed once and updated never.
  • You are uploading a client's unreleased source to a site with no company name on it.

Common questions

The ones people actually ask.

No, and it is worth being blunt about why. An APK is a zip archive, but the things inside it are compiled: dex bytecode produced by a compiler, a binary AndroidManifest.xml, a resources.arsc table, and a signature block. A zip of photos, PDFs or HTML files contains none of that, and no tool can generate bytecode for code that was never written. A zip to apk converter only ever works when the archive already holds an Android or React Native project, and in that case the tool is not converting anything, it is building the project for you.

If there was never a file to convert

Two of the four cases on this page end the same way: the app has to be built, because it does not exist yet. Writing it down in plain English is a faster start than installing a toolchain, and the APK comes back from the cloud in minutes.