~/nevie/blog / apkbuilder-boilerplate-era

The craft

The APKBuilder Era: Everything Boilerplate, Nothing Abstract

No libraries. No Gradle. No abstractions. Just Java and Android, written by hand, switching between the two constantly, figuring out by force what each one actually was.

·Nevie Technologies·8 min read

Every Android activity started the same way. You opened a new file, and you typed the same lines again — package declaration, import statements, the class signature extending AppCompatActivity, the onCreate method, setContentView. Every single time. By hand.

No snippet. No template. No IDE that offered to generate it for you. APKBuilder gave you an empty file and a cursor. The rest was you.

// the tool

What APKBuilder was — and what it was not

APKBuilder is an Android app that lets you write Java code and compile it into an APK directly on-device. For what it was, it was remarkable. The fact that it worked at all — that it could take Java source code typed on a phone keyboard and produce a real, installable Android application — was genuinely impressive.

What it was not was forgiving. The feature set was limited. The editor was basic. There was no refactoring, no intelligent autocompletion, no error highlighting while you typed. You wrote, you compiled, you found out what was wrong. Sometimes the error messages were clear. Sometimes they pointed at a line that was not the actual problem.

The APKBuilder workflow in full

Create project → create .java source files manually → create res/layout/ XML files manually → write the AndroidManifest.xml manually → tap Build → wait → read error → fix → repeat. No dependency manager. No Gradle. No automated anything. Everything you wanted in the app, you had to write.

The limitation that drove me the most was the library support — or more accurately, the lack of it. External libraries were either not supported or painful to integrate. Which meant that anything an external library would normally do, I had to write myself. No RecyclerView adapter boilerplate generated for me. No networking library handling HTTP. No image loading library. If the app needed it, I built it.

At the time this felt like a severe handicap. In retrospect, it was a kind of education that most developers now skip entirely.

// the switching

Java one moment. Android the next. Constantly.

The hardest conceptual problem in those early months was not any specific Java concept or any specific Android component. It was the constant switching between the two.

Java is a general-purpose language. It has classes, objects, interfaces, inheritance, generics, exceptions, collections, threads. Android is a framework built on top of Java. It has activities, fragments, intents, views, adapters, services, broadcast receivers, content providers, the manifest. They are different bodies of knowledge that use the same syntax but operate on different levels of abstraction.

When you are reading a tutorial app that mixes them together without distinguishing which is which, and then you go into APKBuilder to try and apply what you just read, the confusion compounds. You are not sure whether the problem is your Java or your Android. You fix what looks like a Java error and produce an Android error. You fix that and hit a different Java error. You lose track of which level you are supposed to be thinking on.

There was no one to ask. I was at Mzuzu University studying Forestry. The people around me were interested in trees and land and ecosystems — not in why ListView needed an ArrayAdapter and why that ArrayAdapter required a specific constructor signature. I worked it out by writing code that failed and reading why.

// what i built

The apps that came out of it

Despite the constraints — or because of them — I shipped things. Not impressive things by any external measure. But real things, installed on real phones, used by real people.

I built computer skills apps for friends — simple offline reference tools with notes on computing concepts. I built personal utility apps. A quiz app. Small tools for things I needed to do repeatedly that I could automate with three screens and some SharedPreferences.

What they all had in common was that every component was hand-written. Every ListView had a custom adapter written from scratch. Every screen transition was an explicit Intent. Every data save was explicit SharedPreferences calls. There were no abstractions I had not personally authored. I could trace every line of every app back to a decision I had made.

That is an unusual relationship to have with your own code. Most developers today, working with modern tools and libraries, could not tell you what is happening two or three layers beneath their abstractions. I had no layers I had not built. I knew exactly what was happening because I was the one who wrote it happening.

// the ceiling

The point where APKBuilder ran out of room

There came a point where the tool could not keep up with what I wanted to build. Not because I had outgrown Android development — I was just getting started with that. But because the apps I was imagining needed things APKBuilder could not provide cleanly. Better layout support. Better project organisation. The ability to use external libraries when the standard SDK genuinely did not have what I needed. Better error messages.

That ceiling was frustrating. I had learned as much as I could within the constraints of the tool, and now the tool itself was the constraint. I needed something better. Not a laptop — I still did not have one. Something better that still ran on the phone.

That frustration is what eventually pointed toward NexaIDE. But before that, there was one more thing the APKBuilder era produced. The most personal project of that whole period. The one that came directly out of the combination of bad tutorial apps and limited tools and the specific frustration of learning Android on a budget phone in Malawi.

That was JavAndroid.