My pinky cramped, that’s what it does 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 become possessed by a demon — I couldn’t have that on my conscience.

I was hacking away at an Android application and working feverishly to replace an in-app virtual store with ads by AdMob.

I never imagined pushing 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, Quotograph earned several million dollars in the first week alone. And as I lay naked and coked-out in a pile of sexually-exhausted bodies, I thought to myself, “Quotograph could earn more.”

First I removed the price barrier. Then I added new features placed behind a pay-wall within a virtual store. Before I even hit ‘deploy,’ a tidal wave of cash hit my bank account.

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: 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 Kuku.io 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?

F@#k. Ads it is.

The State of Ads in Mobile

Web ads take several effective forms: sponsored content, link-bait, and eye-of-Sauron style product placement that follows you everywhere. Thanks to their 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:

This extra-stinks because I just paid full-price for my summer frocks

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 publisher 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 at 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 started to hang, and I was jealous because after putting ads in my app, I wished I could hang myself.

The app started hitting ANRs — crashes due to long screen freezes.

Karma was punishing me for trying to recuperate my production 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() {

@Override

public void run() {

if ((Build.VERSION.SDK_INT >= 17 && LWQSettingsActivity.this.isDestroyed())

|| LWQSettingsActivity.this.isFinishing()) {

return;

}

requestNewInterstitial();

}

}, 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 the battery.

And for the 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 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 it exists. Let me know if one does appear.

And until then, I’ll be monitoring my pennies as they slide in under the door.