Developers, testers, and power users often need to see how an app behaves when the connection is slow, spotty, or has high latency. Real‑world testing on a flaky Wi‑Fi hotspot can be time‑consuming and unreliable. Android ships with a hidden but powerful Network simulation feature that lets you throttle speed, add artificial latency, and even drop packets—all from the device itself.
This tutorial shows you how to enable the feature, use the graphical UI, and fine‑tune the same settings from a computer using adb. No rooting, no third‑party apps, and no extra hardware required.
Why this matters: USB debugging opens a secure channel between your computer and the phone, allowing adb to send commands that modify system‑wide settings.
adb devices. You should see a line with your device’s serial number followed by device.
adb devices
List of devices attached
ABCD1234567 device
unauthorized, look at your phone – a dialog will ask you to allow USB debugging from this computer. Tap Allow and optionally check “Always allow”.Successful verification means you can now send commands to the device.
Android’s UI provides a quick way to pick common speed presets. This works on Android 8.0 (Oreo) and newer, though the exact menu path may vary slightly by manufacturer.
What you’ll see: When the speed is limited, large files load slower, video playback buffers more often, and UI animations that rely on network data become choppy. Latency shows up as a noticeable pause before a request is sent.
The UI only offers a handful of presets. If you need a custom bandwidth (e.g., 1 Mbps down / 256 kbps up) or want to script multiple profiles, ADB gives you full control.
Android stores the simulated network parameters in the global settings database under the keys:
net_simulated_speed_kbps – bandwidth in kilobits per second.net_simulated_latency_ms – added latency in milliseconds.net_simulated_packet_loss_percent – optional packet‑loss percentage (available on Android 10+).When any of these values is non‑zero, the system‑wide NetworkThrottle service activates.
adb ready.1500 with the desired kilobits per second (e.g., 1500 kbps ≈ 1.5 Mbps):
adb shell settings put global net_simulated_speed_kbps 1500
adb shell settings get global net_simulated_speed_kbps
The terminal should echo 1500.adb shell settings put global net_simulated_latency_ms 300
adb shell settings get global net_simulated_latency_ms
adb shell settings put global net_simulated_packet_loss_percent 5
adb shell settings get global net_simulated_packet_loss_percent
When you’re done testing, clear all three keys:
adb shell settings put global net_simulated_speed_kbps 0
adb shell settings put global net_simulated_latency_ms 0
adb shell settings put global net_simulated_packet_loss_percent 0
Or, if you used the UI, simply toggle Simulate network speed back to None and Simulate network latency to 0 ms.
Testing often requires switching between several conditions quickly. Below is a tiny Bash script you can run on macOS/Linux (or via Git Bash on Windows). Save it as net‑profile.sh and make it executable (chmod +x net‑profile.sh).
#!/usr/bin/env bash
# Usage: ./net-profile.sh [profile]
# Profiles: fast, moderate, slow, very‑slow, custom
DEVICE="$(adb get-serialno)"
if [ -z "$DEVICE" ]; then
echo "No device connected. Connect via USB and enable USB debugging."
exit 1
fi
case "$1" in
fast)
SPEED=5000 # 5 Mbps
LATENCY=50 # 50 ms
;;
moderate)
SPEED=1500 # 1.5 Mbps
LATENCY=150
;;
slow)
SPEED=500 # 0.5 Mbps
LATENCY=300
;;
very‑slow)
SPEED=200 # 200 kbps
LATENCY=600
;;
custom)
read -p "Enter speed (kbps): " SPEED
read -p "Enter latency (ms): " LATENCY
;;
*)
echo "Invalid profile. Choose fast|moderate|slow|very‑slow|custom"
exit 1
;;
esac
adb shell settings put global net_simulated_speed_kbps $SPEED
adb shell settings put global net_simulated_latency_ms $LATENCY
echo "Applied profile '$1': ${SPEED}kbps, ${LATENCY}ms latency"
Run ./net-profile.sh slow to switch to a 500 kbps connection with 300 ms latency instantly.
After you set a profile, you’ll want to confirm the numbers are actually affecting traffic. Two easy ways:
chrome://network (or use the DevTools Network tab). The “Throttling” dropdown will show Custom and display the current speed/latency.If the numbers don’t line up, double‑check that no other network‑optimizing app (e.g., a VPN or data‑saver) is overriding the settings.
Android clears the simulated network values on a clean reboot. To make a profile persist across reboots, you can create a simple adb command that runs at boot via adb shell su (requires root) or use a Tasker profile that sends the settings put commands on the Device Boot event. Since this tutorial targets non‑root devices, the easiest approach is to re‑apply the profile manually after each restart.
Some OEM skins (e.g., certain Samsung One UI builds) isolate the network‑throttle service to the cellular stack. If you’re on Wi‑Fi and see no change, try switching to mobile data or use the ADB method, which works at the global level on most stock Android builds.
This usually means USB debugging is not enabled or the computer isn’t authorized. Re‑visit Step 1 and accept the RSA key prompt on the phone. If the problem persists, try revoking USB debugging authorizations (Settings → Developer options → Revoke USB debugging authorizations) and reconnect.
Packet‑loss simulation is only available from Android 10 onward and only when the device is in “developer mode”. Ensure your Android version meets the requirement (Settings → About phone → Android version) and that you are using the ADB method (the UI does not expose packet loss).
adb logcat while testing to see how your app logs network‑related errors under throttled conditions.Simulating network conditions is especially useful for:
It’s not a replacement for real‑world field testing, but it dramatically reduces the time spent chasing network‑related bugs.
By enabling Developer options, using the built‑in UI, and leveraging ADB for custom profiles, you now have a full‑featured toolkit to simulate any network condition on Android – all without rooting or installing third‑party apps. Remember to reset the settings when you’re done, and consider scripting repetitive profiles for faster iteration. Happy testing!









