You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

7.0 KiB

Android Custom API IP Configuration

Author: Matthew Raymer
Date: 2025-01-27
Status: COMPLETE - Custom API IP support for physical device development

Overview

When deploying TimeSafari to physical Android devices during development, you may need to specify a custom IP address for the claim API server. This is necessary because physical devices cannot access localhost or 10.0.2.2 (Android emulator IP) to reach your local development server.

Problem

During Android development:

  • Emulator: Uses 10.0.2.2:3000 to access host machine's localhost (default)
  • Physical Device: Cannot access localhost or 10.0.2.2 - needs actual IP address

Solution

The Android build system defaults to 10.0.2.2:3000 for emulator development and supports specifying a custom IP address for the claim API server when building for physical devices.

Usage

Command Line Usage

# Default behavior (uses 10.0.2.2 for emulator)
./scripts/build-android.sh --dev

# Custom IP for physical device
./scripts/build-android.sh --dev --api-ip 192.168.1.100

# Test environment with custom IP
./scripts/build-android.sh --test --api-ip 192.168.1.100

# Build and auto-run with custom IP
./scripts/build-android.sh --dev --api-ip 192.168.1.100 --auto-run

NPM Scripts

# Default development build (uses 10.0.2.2 for emulator)
npm run build:android:dev

# Development build with custom IP (requires IP parameter)
npm run build:android:dev:custom 192.168.1.100

# Test build with custom IP (requires IP parameter)
npm run build:android:test:custom 192.168.1.100

# Development build + auto-run with custom IP
npm run build:android:dev:run:custom 192.168.1.100

# Test build + auto-run with custom IP
npm run build:android:test:run:custom 192.168.1.100

Examples

Scenario 1: Development on Emulator (Default)

# Default behavior - uses 10.0.2.2 for emulator
npm run build:android:dev

# Build and immediately run on emulator
npm run build:android:dev:run

Scenario 2: Development on Physical Device

# Your development server is running on 192.168.1.50:3000
npm run build:android:dev:custom 192.168.1.50

# Build and immediately run on device
npm run build:android:dev:run:custom 192.168.1.50

Scenario 3: Testing on Physical Device

# Your test server is running on 192.168.1.75:3000
npm run build:android:test:custom 192.168.1.75

# Build and immediately run on device
npm run build:android:test:run:custom 192.168.1.75

Scenario 4: Direct Script Usage

# Default behavior (emulator)
./scripts/build-android.sh --dev --studio

# Custom IP for physical device
./scripts/build-android.sh --dev --api-ip 192.168.1.100 --studio
./scripts/build-android.sh --test --api-ip 192.168.1.100 --apk

How It Works

Environment Variable Override

The build system handles API server configuration as follows:

  1. Default behavior: Uses http://10.0.2.2:3000 for emulator development
  2. Custom IP specified: Overrides with http://<custom-ip>:3000 for physical device development
  3. Maintains other APIs: Image and Partner APIs remain at production URLs
  4. Logs the configuration: Shows which IP is being used in build logs

Build Process

# Development mode with default IP (10.0.2.2)
export VITE_DEFAULT_ENDORSER_API_SERVER="http://10.0.2.2:3000"
npm run build:capacitor -- --mode development

# Development mode with custom IP
export VITE_DEFAULT_ENDORSER_API_SERVER="http://192.168.1.100:3000"
npm run build:capacitor -- --mode development

Default Behavior

  • No --api-ip specified: Uses default emulator IP (10.0.2.2:3000)
  • Custom IP specified: Uses provided IP address for physical device development
  • Invalid IP format: Build will fail with clear error message
  • Network unreachable: App will show connection errors at runtime

Finding Your IP Address

On Linux/macOS

# Find your local IP address
ifconfig | grep "inet " | grep -v 127.0.0.1
# or
ip addr show | grep "inet " | grep -v 127.0.0.1

On Windows

# Find your local IP address
ipconfig | findstr "IPv4"

Common Network Patterns

  • Home WiFi: Usually 192.168.1.x or 192.168.0.x
  • Office Network: May be 10.x.x.x or 172.16.x.x
  • Mobile Hotspot: Often 192.168.43.x

Troubleshooting

Common Issues

1. Device Cannot Connect to API

# Check if your IP is accessible
ping 192.168.1.100

# Check if port 3000 is open
telnet 192.168.1.100 3000

2. Build Fails with Invalid IP

# Ensure IP format is correct
./scripts/build-android.sh --dev --api-ip 192.168.1.100  # ✅ Correct
./scripts/build-android.sh --dev --api-ip localhost        # ❌ Wrong

3. Firewall Blocking Connection

# Check firewall settings
sudo ufw status  # Ubuntu/Debian
sudo firewall-cmd --list-all  # CentOS/RHEL

Debug Mode

# Enable verbose logging
./scripts/build-android.sh --dev --api-ip 192.168.1.100 --verbose

Best Practices

1. Use Consistent IP Addresses

# Create aliases for common development scenarios
alias build-dev="npm run build:android:dev:custom 192.168.1.100"
alias build-test="npm run build:android:test:custom 192.168.1.100"

2. Document Your Setup

# Create a development setup file
echo "DEV_API_IP=192.168.1.100" > .env.development
echo "TEST_API_IP=192.168.1.100" >> .env.development

3. Network Security

  • Ensure your development server is only accessible on your local network
  • Use HTTPS in production environments
  • Consider VPN for remote development scenarios

4. Team Development

# Share IP configuration with team
# Add to .env.example
DEV_API_IP=192.168.1.100
TEST_API_IP=192.168.1.100

Integration with CI/CD

Environment Variables

# Example CI/CD configuration
variables:
  DEV_API_IP: "192.168.1.100"
  TEST_API_IP: "192.168.1.100"

build:
  script:
    - npm run build:android:dev:custom $DEV_API_IP

Automated Testing

# Test with different IP configurations
npm run build:android:test:custom 192.168.1.100
npm run build:android:test:custom 10.0.0.100

Migration from Legacy

Previous Workarounds

Before this feature, developers had to:

  1. Manually edit environment files
  2. Use different build configurations
  3. Modify source code for IP addresses

New Approach

# Simple one-liner
npm run build:android:dev:custom 192.168.1.100

Future Enhancements

Planned Features

  1. IP Validation: Automatic IP format validation
  2. Network Discovery: Auto-detect available IP addresses
  3. Port Configuration: Support for custom ports
  4. Multiple APIs: Support for custom IPs for all API endpoints

Integration Opportunities

  1. Docker Integration: Automatic IP detection in containerized environments
  2. Network Profiles: Save and reuse common network configurations
  3. Hot Reload: Automatic rebuild when IP changes

Status: Complete and ready for production use
Last Updated: 2025-01-27
Version: 1.0
Maintainer: Matthew Raymer