My pinky cramped as it’s known to do after long coding sessions. I had to rest it, otherwise it would wither into a cursed monkey paw. Then some poor child would find it on the beach and end up possessed by a demon. I couldn’t have that on my conscience.

I hacked away at an Android application. And worked feverishly to replace an in-app virtual store with ads by AdMob. I never imagined I would push my favorite finger to its limits for such a worthless cause.

I’ve built over a dozen Android apps and not once did I ever incorporate ads. Why? Mobile ads suck, and we all know it. So why now, why this app?

I worked on Quotograph for over a year. It started as a passion project and evolved far beyond that. When I launched it, I chose a modest $1.99 price tag. And just like every other app, it earned several million dollars in the first week alone. And as I lay naked in a fleshy mass of snoozing super models, I thought to myself, “Quotograph could earn more.”

First I removed the price barrier. Then I added new features, and placed them behind a pay-wall within a virtual store. I experienced a tidal wave of cash. Soon I had enough money, power, and business acumen to run for president of the United States. All I needed was the perfect hairpiece.

My app was too ‘uge to fail

Real talk: by that point I’d spent 200 hours designing, developing, and marketing Quotograph. And as of today it’s raked in a record-breaking $6.57. If you count the five months I paid for to schedule social media posts — and I do. And factor in a consultant rate of $100 per hour, Quotograph has earned me a net profit of -$20,043.38. I’m ready to retire.

In-app purchases were a dud, and I couldn’t understand why. I complained about cheap users and their unwillingness to buy virtual products. But that all changed when I turned the lens on myself. “When have I ever bought something from an app?”


Ads it is.

The State of Ads in Mobile

Web ads take several disgusting forms. Sponsored content, link-bait, and eye-of-Sauron style product placement that follows you everywhere. Thanks to their shady tactics, these ads remain relevant and actionable on the web.

Meanwhile, after 10 years, I still see mobile ads like this:

“Download Free Audiobook” is not even a complete sentence.

We get it, developers incorporate ads so they can earn money and keep their servers running. But why do these ads suck so many moldy bananas? Here’s the scientific answer.

When a website incorporates the Eye of Sauron Ad Network™, it leaves little breadcrumbs in your cache. And when you visit another site that serves ads from the same network, those breadcrumbs act as a trail to your interests.

“Looks like you’re seeking a ‘fellowship.’ Users who sought ‘fellowship’ also sought the following products…”

Imagine you were shopping for a knife set on Amazon, I recommend Wusthof. And you left the page without purchasing. When you weren’t paying attention — shame on you — Amazon dropped a little breadcrumb in your cache that pointed to that exact knife set.

Later, you innocently visited LifeTime’s website to catch an episode of Project Runway. And LifeTime also relied on the same all-seeing fiery eyeball wizard for its ad revenue. LifeTime found the knife set breadcrumb and served you an ad for it. You bought it immediately because Sauron is the destined ruler of Middle-Earth; all hail Sauron.

They call that process “retargeting.” But the web is not limited to retargeting. These ad networks collect copious amounts of personal information about us. They can look through our browsing history and discover other things we like. And Google even scans our email content to look for keywords.

It’s creepy, invasive, and for advertisers: highly effective. The complete opposite is true on mobile. On your phone, each app lives in its own little sandbox. Inter app communication is possible. But that requires a mass of developers to agree on a standard communication protocol. And sweet mother of Mary Poppins that has yet to happen.

And by a modern privacy miracle, AdMob, a Google product, remains oblivious to my interests. It has access to the device and the ability to discover which Google accounts associate with it. And still it has no flipping clue what I’m into. And that’s why I still get PoS ads like this:

I can’t even buy dresses at Zulily anymore, not since I gained all that menopause weight

Ads as Deterrents

You may not be aware, but there was a naive time when serving an advertisement to a mobile user was worth money. Pennies, yes, but money still. Some publishers paid up to 8 cents per impression, some even more.

An impression is just that: the user saw the ad. Clicking the ad would earn you more, but even showing the ad was a valued act. Not any more.

Serving an ad is worthless in today’s mobile economy, and that makes sense because {see previous section}. Knowing this, developers focused on two things. They turned their users into addicts, and then tortured those addicts with advertisements.

At this point it’s a numbers game. Let the user fall in love with your app, then bombard them with advertisements until they accidentally tap one. Or better yet, they pay a sanity fee to remove your ads once and for all.

This is the approach I’m currently taking, and look how un-ironically I support it:

It’s “totally uncool” when developers infect users with an ad disease just so they can offer them a cure. But we also siphon precious resources from the device, so that bumps us to “Jesus Christ, man” status.

I incorporated the AdMob SDK just like these two comedic Gods instructed. But my UI thread became hung like a horse — and not in the complimentary phallic way. The app started hitting ANRs — crashes due to long screen freezes.

Karma was punishing me for trying to recuperate my losses. I Googled the issue and found that other developers were experiencing the same. I wrote this little research-grade beauty to get around the problem:

// Ew, AdMob, ew…
content.postDelayed(new Runnable() {
public void run() {
if ((Build.VERSION.SDK_INT >= 17 && LWQSettingsActivity.this.isDestroyed())
|| LWQSettingsActivity.this.isFinishing()) {
}, 1000);

Yup, that’s an arbitrary one-second delay to avoid clogging the pipeline. That definitely will work on every device predictably forever.

The app still experiences intermittent failures, and I can’t predict when they will occur. More importantly, each ad request hits the network and drains battery.

And for icing on the 💩-cake: the AdMob SDK fails Android’s own StrictMode analysis. StrictMode provides a series of checks that ensure optimal app performance. Yes, that means incorporating advertisements from Google objectively reduces the quality of an application.

I never wanted to do this to my users, but ¯_(ツ)_/¯, I’m passing the savings onto them!

Quit Complaining

I hear you. I bet you’re thinking, “you don’t deserve to succeed just because you worked hard.” And you’re right; I have no rebuttal to that. I tried to build something, it failed, and I’m still hacking away at it for reasons unknown to everyone.

I don’t even have a solution to the problem I faced when incorporating these ads. I would love to use an ad network that didn’t bathe in slime, but I’m not sure one exists. Let me know if one does appear. And until then, I’ll be monitoring my pennies as they slide in under the door.


Please enter your comment!
Please enter your name here