Skip to content

frezot/nemo

Repository files navigation

NEMO

NEMO is an Android network conditioner for testing apps under degraded mobile and Wi-Fi conditions.

It runs as a local VpnService, forwards traffic through a userspace datapath, and applies configurable network degradation without requiring root.

Features

  • preset network profiles
  • one custom profile
  • latency
  • jitter
  • uplink and downlink bandwidth limiting
  • packet loss
  • temporary traffic stalls
  • per-app targeting

Build

Clone with submodules:

git clone --recurse-submodules <repo-url>
cd <repo-directory>

If you already cloned the repo:

git submodule update --init --recursive

Build a debug APK:

./gradlew :app:buildDebug

The APK will be produced under:

app/build/outputs/apk/debug/

Release Build

Create a signing keystore:

keytool -genkeypair -v \
  -keystore nemo-release.keystore \
  -alias nemo \
  -keyalg RSA \
  -keysize 2048 \
  -validity 10000

Create a local keystore.properties from the example:

cp keystore.properties.example keystore.properties

Then set:

  • storeFile
  • storePassword
  • keyAlias
  • keyPassword

Build a signed release APK:

./gradlew :app:assembleRelease

Or an Android App Bundle:

./gradlew :app:bundleRelease

Project Notes

  • Android app code lives in app/src/main/java
  • native datapath and conditioner code lives in app/src/main/jni
  • zdtun is included as a git submodule in submodules/zdtun
  • synthetic TCP loss is asymmetric by design: downlink TCP packets are not dropped directly; instead loss is modeled through uplink ACK loss to produce more realistic TCP degradation in the local VPN datapath

Acknowledgements

NEMO builds on ideas explored in:

It also depends on:

About

Network Emulation Mobile Operator

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors