Getting Rid of Ads on Android Is Harder Than It Should Be
You install an app, open it, and suddenly a full-screen ad for a game you didn't ask for slides onto the screen. Then a banner appears at the bottom. Then a pop-up. It's everywhere. The whole experience is exhausting, and the average person just learns to live with it. I stopped doing that a few years ago and now I run a setup that blocks nearly everything automatically. Here's how this actually works in practice. There are three layers, and you should use all of them. One layer alone leaves gaps. That's the mistake most people make. The first layer is a local DNS blocker. You run something like AdGuard or DNS66 on the device itself. It intercepts domain requests before they leave your phone and drops anything matching an ad list. This catches in-app ads, ad trackers, and analytics payloads. It doesn't need root. It doesn't need a special OS. It runs as a regular VPN-connection on Android, which is the only way an app can intercept DNS without system-level access.
The second layer is a per-app firewall. Tools like NetGuard or Firewallapp let you cut off internet access for specific apps. A flashlight app shouldn't need to phone home. A calculator shouldn't be able to reach any server at all. You pick which apps get zero network access and which get full access. This stops telemetry and background data leaks that DNS blocking misses. The third layer is content filtering in your browser. Use Bromite or Firefox with uBlock Origin if you're comfortable with custom ROMs or enabled developer flags. Default Chrome has no ad-blocking capability. You either accept ads in Chrome or you install a browser that does. That's it. No complicated setup. I ran into a specific problem last year with a budget Android phone from a brand most people have heard of. The system DNS settings were locked by the manufacturer. I couldn't set a custom DNS resolver in the WiFi settings because the option simply didn't exist in the UI. The DNS66 app was installed, the rules were loaded, and nothing was blocking. I spent about forty minutes digging through settings before I realized the issue.
The workaround was installing the ad-blocking DNS resolver directly inside the app rather than using the system-level DNS override. DNS66 creates its own local DNS server on the device and routes traffic through that. It bypasses the manufacturer lock entirely because it doesn't touch the system network settings. You just enable the built-in resolver mode and everything starts working. This is worth knowing because at least three major OEMs lock system DNS on their devices and most people give up at that point. There are important limitations you need to understand before you spend time on this. DNS-level blocking does not work against SDK-implemented ads that resolve through the same domain as the legitimate content. If an ad network shares a CDN endpoint with the actual app data, blocking the domain blocks both. This is rare but it happens, usually with poorly configured first-party ad integrations. The result is a broken app experience where buttons stop working or pages load white. The fix is usually adding an exception rule for that specific domain in your ad block list. Another thing nobody tells you: HTTPS inspection doesn't happen with basic DNS blocking. Modern ads embed themselves in encrypted traffic. A DNS block stops the domain lookup, which usually kills the request, but some apps pre-fetch or cache ad content before the DNS check runs. You will see occasional ad leaks in apps that aggressively pre-load. This is especially common with video-heavy apps and games. Switching to a full proxy-based blocker like AdGuard with the HTTPS filtering enabled closes most of those gaps, but it requires trusting the app with your decrypted traffic. That's a real security decision. You give the app the ability to read encrypted data in exchange for better blocking. Most people accept that trade-off. You should know what you're giving up.
Get the Full Details

The per-app firewall layer has its own failure mode. Some apps refuse to function if they detect no internet connection at all. They check connectivity on startup and crash or show an error screen instead of running normally. This is more common with apps that validate licenses or require online authentication. If you block an app and it breaks, try allowing only specific domains instead of cutting all access. Most apps only need connectivity to their own API endpoints. Everything else is unnecessary. Here's what the setup actually looks like after it's done. I run DNS66 with a combined blocklist of approximately 180,000 domains. NetGuard blocks internet for seventeen apps that don't need it. Firefox with uBlock Origin handles all browsing. The result is roughly a 70 percent reduction in daily data usage on my primary device and maybe three ads per week across everything I use. That's not zero. Zero is unrealistic. But thirty ads a day drops to almost nothing, and that's the difference between a functional phone and one that fights you constantly. If you want a starting point, download DNS66 from the official site or F-Droid. Grab NetGuard from F-Droid. For browser blocking, install Firefox and add uBlock Origin from the add-ons page. Set DNS66 to built-in resolver mode if your phone has locked DNS settings, which about a third of budget devices do. Configure NetGuard by going through your installed apps and cutting access for anything that doesn't need network. Then use Firefox with the filter enabled for everything else.
The configuration takes about twenty minutes the first time. After that it runs silently. You'll notice the difference immediately when you open apps and nothing bursts onto the screen. It's quiet. It's boring. That's the point.