Skip to main content

Overview

APK Extractor supports managing multiple Android devices simultaneously, whether connected via USB or WiFi. You can assign custom names, save WiFi devices for quick reconnection, and switch between devices instantly.

Device Types

USB Devices

Connected via USB cable with unique serial numbers

WiFi Devices

Connected wirelessly using Android’s wireless debugging feature (IP:port)

USB vs WiFi Comparison

FeatureUSBWiFi
ConnectionUSB cable requiredWireless (same network)
SpeedFast (~40-50 MB/s)Moderate (~10-20 MB/s)
StabilityVery stableCan drop if network changes
SetupPlug and playRequires pairing (one-time)
ConvenienceRequires physical cableNo cables needed
Serial FormatAlphanumeric (e.g., 1A2B3C4D5E6F)IP:Port (e.g., 192.168.1.100:5555)
You can have both USB and WiFi devices connected simultaneously. APK Extractor handles them identically once connected.

Detecting Devices

Automatic Detection

APK Extractor automatically detects all connected devices:
// server.js:175-191 - Poll endpoint for real-time updates
app.get('/api/devices/poll', async (req, res) => {
  const out = await runAdb('devices', null, 5000);
  const lines = out.split('\n').slice(1);
  const serials = [];
  
  for (const line of lines) {
    const tabIdx = line.indexOf('\t');
    if (tabIdx === -1) continue;
    const serial = line.substring(0, tabIdx).trim();
    const status = line.substring(tabIdx).trim();
    if (status === 'device' && serial) serials.push(serial);
  }
  
  res.json({ serials });
});
Web Interface: Polls every 4 seconds (adjusts to 2s when active, 8s when inactive) CLI: Scans when you select “Listar dispositivos conectados” from the main menu

Device Information

When a device is detected, APK Extractor fetches:
  • Serial/IP:Port - Unique identifier
  • Brand - Manufacturer (e.g., Google, Samsung)
  • Model - Device model (e.g., Pixel 6)
  • Connection Type - USB or Wireless
Detailed info is fetched using getprop commands:
// server.js:210-225 - Parallel property fetching
const props = await runAdb(
  `shell "getprop ro.product.manufacturer && getprop ro.product.model"`,
  serial, 5000
);
const lines = props.trim().split('\n').map(l => l.trim());
const brand = lines[0] || '';
const model = lines[1] || '';
if (brand && model && brand !== 'N/A') label = `${brand} ${model}`;
All device property queries run in parallel for multiple devices, so even with 5+ devices connected, detection is fast.

Switching Between Devices

Web Interface

Click any device in the sidebar:
  1. Instant switch - Shows cached app list immediately
  2. Background refresh - Fetches latest data without blocking UI
  3. Progress indicator - Shows when batch info is loading
// Instant device switch with cache
if (appListCache[newSerial]) {
  displayApps(appListCache[newSerial]); // Instant
  fetchBatchInfo(newSerial); // Background
} else {
  fetchApps(newSerial); // Full load
}

CLI

From the device list, enter the device number:
Dispositivos encontrados: 3

[1] Google Pixel 6  (1A2B3C4D5E6F)
[2] My Tablet  (192.168.1.100:5555)
[3] Test Device  (8G7H6I5J4K3L)

Selecciona un dispositivo [1-3]: 2
The CLI loads the selected device’s menu immediately.

Custom Device Names

Assign friendly names to devices for easier identification.

Why Use Custom Names?

If you have several devices of the same model (e.g., “Pixel 6 - Personal”, “Pixel 6 - Work”, “Pixel 6 - Test”).
Label devices by purpose: “Staging Device”, “QA - Android 11”, “Nightly Build Device”.
Distinguish between family members: “Dad’s Phone”, “Mom’s Tablet”, “Kids’ Device”.
WiFi serials are just IP:port - custom names make them recognizable.

Setting Names

  1. Click the device in the sidebar
  2. Click the pencil icon or “Rename” button
  3. Enter the new name in the modal
  4. Click “Save”
// API call
await fetch(`/api/device-names/${encodeURIComponent(serial)}`, {
  method: 'PUT',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: 'My Pixel 6' })
});

Name Storage

Names are stored in device-names.json:
{
  "1A2B3C4D5E6F": "My Pixel 6",
  "192.168.1.100:5555": "WiFi Tablet",
  "8G7H6I5J4K3L": "Test Device"
}
Custom names are shared between web and CLI. Set a name in one interface, see it in both!

Removing Names

  1. Open the rename modal
  2. Clear the name field
  3. Save (or use the Delete button if available)

Connecting Devices

USB Connection

1

Enable USB Debugging

On your Android device:
  1. Go to SettingsAbout phone
  2. Tap Build number 7 times to enable Developer Options
  3. Go back to SettingsDeveloper Options
  4. Enable USB debugging
2

Connect USB Cable

Plug in a USB cable between your PC and the Android device.
3

Authorize PC

A prompt appears on the device:“Allow USB debugging?”
Fingerprint: XX:XX:XX:…
  • Tap Allow (and optionally check “Always allow”)
4

Verify Connection

The device should appear in APK Extractor automatically within 4 seconds.
If the device shows as “unauthorized” in adb devices, you must accept the authorization prompt on the device. Disconnect and reconnect the cable to trigger the prompt again.

WiFi Connection

See the Wireless Debugging guide for complete WiFi setup instructions. Quick Summary:
  1. Enable Wireless debugging in Developer Options (Android 11+)
  2. Pair using IP, port, and 6-digit code
  3. Connect using the connection port
  4. Device is saved automatically for future quick reconnection

Disconnecting Devices

USB Devices

Simply unplug the USB cable. The device disappears from the list within 4-8 seconds.

WiFi Devices

  1. Right-click the device in the sidebar (or long-press on mobile)
  2. Select “Disconnect”
  3. Confirm if prompted
Or use the API:
// Disconnect via ADB
await fetch('/api/adb/disconnect', {
  method: 'POST',
  body: JSON.stringify({ serial: '192.168.1.100:5555' })
});
Disconnecting a WiFi device does not remove it from saved devices. You can reconnect quickly later.

Saved WiFi Devices

WiFi devices are automatically saved to devices.json when you connect:
[
  {
    "id": "1678901234567",
    "label": "Google Pixel 6",
    "ip": "192.168.1.100",
    "port": "5555",
    "lastConnected": "2026-03-07T16:45:23.456Z"
  },
  {
    "id": "1678901234890",
    "label": "Samsung Galaxy Tab",
    "ip": "192.168.1.101",
    "port": "39021",
    "lastConnected": "2026-03-06T10:12:45.678Z"
  }
]

Quick Reconnection

Click “Add Device” or ”+” button → “Saved Devices” tab:
  • See all saved devices with last connected time
  • Click “Connect” for one-click reconnection
  • No need to enter IP, port, or pairing code again

Port Expiration

WiFi debugging ports change when:
  • The device restarts
  • Wireless debugging is toggled off/on
  • The device switches WiFi networks
If connection fails:
[!] No se pudo conectar. Los puertos pueden haber caducado.

¿Deseas re-vincular este dispositivo? [S/N]: S

IP: 192.168.1.100 (no modificable)
Nuevo puerto de vinculacion: 41823
Codigo de vinculacion: 987654
The CLI guides you through re-pairing with the same IP (preloaded), so you only need the new ports and code.
Use a static IP for your Android device in your router settings to avoid IP changes.

Managing Multiple Devices

Parallel Operations (Advanced)

While APK Extractor’s UI focuses on one device at a time, the API supports parallel operations:
// Extract APKs from multiple devices in parallel
const devices = ['1A2B3C4D5E6F', '192.168.1.100:5555'];
const package = 'com.example.app';

const extractions = await Promise.all(
  devices.map(serial => 
    fetch(`/api/devices/${serial}/apps/${package}/extract`, {
      method: 'POST'
    })
  )
);

console.log(`Extracted from ${extractions.length} devices`);

Device Information Comparison

Compare Android versions, models, or installed apps across devices:
// Fetch device info for all connected devices
const { devices } = await fetch('/api/devices').then(r => r.json());

devices.forEach(device => {
  console.log(`${device.label}: Android ${device.android} (API ${device.sdk})`);
});

Troubleshooting

Checklist:
  • USB debugging enabled on device?
  • USB cable supports data transfer (not charge-only)?
  • PC authorized on device?
  • Correct USB drivers installed? (Windows usually installs automatically)
  • Try a different USB port
  • Restart ADB: adb kill-server && adb start-server
You haven’t accepted the authorization prompt on the device:
  1. Disconnect and reconnect USB cable
  2. Look for the “Allow USB debugging?” prompt on the device screen
  3. Tap Allow and optionally check “Always allow from this computer”
If the prompt doesn’t appear:
  • Revoke USB debugging authorizations in Developer Options
  • Reconnect the cable
Common causes:
  • Weak WiFi signal - move device closer to router
  • Power saving mode - disable battery optimization for the wireless debugging service
  • Network switching - device may be switching between WiFi and mobile data
  • Router settings - check firewall or port blocking
Solutions:
  • Use USB for stable long-term connections
  • Set static IP for the Android device
  • Disable “Switch to mobile data” in WiFi settings
The name may not have saved:
  1. Check device-names.json exists in the APK Extractor directory
  2. Verify the file is valid JSON (not corrupted)
  3. Try setting the name again
  4. Restart APK Extractor (server or CLI)
The name should appear within seconds after saving.
For CLI:
  • Use [D] option in the saved devices menu
For web:
  • Use the delete button in the saved devices modal
Manual:
  • Edit devices.json and remove the device object
  • Or delete the entire file to clear all saved devices
Custom names don’t have to be unique. However, it’s recommended to use unique names to avoid confusion.If two devices share a name, they’re distinguished by:
  • Serial number (USB)
  • IP:port (WiFi)
displayed in parentheses next to the name.

Best Practices

Use Custom Names

Assign descriptive names to all devices, especially WiFi devices, for instant recognition.

Static IPs for WiFi

Configure your router to assign static IPs to devices you frequently connect wirelessly.

Keep USB Cables Handy

WiFi is convenient but USB is more stable for large operations (extracting 100+ apps).

Authorize PCs Permanently

Check “Always allow” when authorizing USB debugging to avoid repeated prompts.

Next Steps

Wireless Debugging

Complete WiFi debugging setup guide

Extracting APKs

Learn how to extract APKs from connected devices

Saved Devices Config

Understand devices.json format and management

Custom Names Feature

Deep dive into custom device naming

Device Detection

How automatic device detection works

Remote Connection

Connect to devices over the internet with Tailscale

Build docs developers (and LLMs) love