# Mobile Development – Common Errors & Fixes

When developing mobile applications for Android or iOS, encountering build errors is a regular part of the process. These errors can stem from SDK misconfigurations, dependency issues, or quirks in cross-platform libraries like React Native. Below is a list of common issues developers face, along with tested solutions.

### 1. Broken or Missing Build Tools (Android)

**Error:**

```
Build-tool 35.0.0 is missing AAPT at /.../build-tools/35.0.0/aapt

FAILURE: Build failed with an exception.
> Installed Build Tools revision 35.0.0 is corrupted. Remove and install again using the SDK Manager.
```

**Symptoms:**

* Gradle build fails almost immediately.
* Compilation of Java sources (`:app:compileDebugJavaWithJavac`) cannot proceed.
* Error points to a corrupted or incomplete installation of Build Tools.

**Solution:**

1. Open **Android Studio**.
2. Go to **SDK Manager → SDK Tools**.
3. Uncheck and re-check **Android SDK Build-Tools 35.0.0**, then click **Apply** to reinstall.
4. Alternatively, run:

   ```bash
   sdkmanager --uninstall "build-tools;35.0.0"
   sdkmanager "build-tools;35.0.0"
   ```

### 2. `expo run:android` Fails – Emulator Not Detected

**Error:**

```
adb.exe: device 'emulator-5554' not found
CommandError: Failed to get properties for device (emulator-5554)
```

**Likely Cause:**

* The Android Debug Bridge (ADB) cannot find a running emulator.
* Emulator may not be initialized or started properly.

**Solution:**

1. Start Android Studio.
2. Go to **Tools → Device Manager**, then **launch a virtual device**.
3. Verify the emulator is listed using:

   ```bash
   adb devices
   ```

   You should see a list like:

   ```
   List of devices attached
   emulator-5554   device
   ```

**Note:** If no devices are listed, try restarting ADB:

```bash
adb kill-server
adb start-server
```

### 3. Path Handling Errors in `react-native-libsodium` (Windows)

**Error Symptoms:**

* Build fails due to invalid escape sequences (`\A`, `\b`, etc.).
* Common when project paths include backslashes (e.g., `D:\Application\...`).

**Root Cause:**\
CMake interprets `\\` in Windows-style paths as escape sequences. This causes malformed paths when building native dependencies.

**Solution:**\
Manually modify the `CMakeLists.txt` file in the `react-native-libsodium` dependency:

**File Path:**

```
node_modules/react-native-libsodium/android/CMakeLists.txt
```

**Fix:**\
Add the following lines to convert `NODE_MODULES_DIR` into a valid CMake path:

```cmake
file(TO_CMAKE_PATH "${NODE_MODULES_DIR}" SAFE_NODE_MODULES_DIR)
set(JSI_CPP_PATH "${SAFE_NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/jsi.cpp")
```

Then replace references to `NODE_MODULES_DIR` with `SAFE_NODE_MODULES_DIR`. For example:

```javascript
# set the base libsodium build directory
set(LIBSODIUM_BUILD_DIR ${CMAKE_CURRENT_LIST_DIR}/../libsodium/build)

# set the libsodium build directory depending on the target abi
if (${ANDROID_ABI} STREQUAL arm64-v8a)
  set(LIBSODIUM_BUILD_DIR ${LIBSODIUM_BUILD_DIR}/libsodium-android-armv8-a+crypto)
elseif(${ANDROID_ABI} STREQUAL armeabi-v7a)
  set(LIBSODIUM_BUILD_DIR ${LIBSODIUM_BUILD_DIR}/libsodium-android-armv7-a)
elseif(${ANDROID_ABI} STREQUAL x86)
  set(LIBSODIUM_BUILD_DIR ${LIBSODIUM_BUILD_DIR}/libsodium-android-i686)
else()
  set(LIBSODIUM_BUILD_DIR ${LIBSODIUM_BUILD_DIR}/libsodium-android-westmere)
endif()

add_library(sodium SHARED IMPORTED)
include_directories( ${LIBSODIUM_BUILD_DIR}/include/ )
set_target_properties( sodium PROPERTIES IMPORTED_LOCATION ${LIBSODIUM_BUILD_DIR}/lib/libsodium.so )

# --- BEGIN MODIFICATION ---
# Convert NODE_MODULES_DIR to a CMake-friendly path
file(TO_CMAKE_PATH "${NODE_MODULES_DIR}" SAFE_NODE_MODULES_DIR)

# Construct the JSI CPP path using the safe path and forward slashes
set(JSI_CPP_PATH "${SAFE_NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/jsi.cpp")

# here we define a library target called "libsodium"
# which will be built from the listed source files
add_library(libsodium
  SHARED
  "${JSI_CPP_PATH}" # Use the corrected path variable
  ../cpp/react-native-libsodium.cpp
  ../cpp/react-native-libsodium.h
  cpp-adapter.cpp
)
# --- END MODIFICATION ---

# link the sodium lib with our "libsodium" library target defined earlier
target_link_libraries(libsodium sodium)
```

**After saving the file:**\
Clean and rebuild your Android project:

```bash
cd android
./gradlew clean
cd ..
npx expo run:android
```

**Recommended Tip:**\
Avoid placing your project in folders with capital letters or special characters (e.g., `D:\Application\Xion`) to reduce CMake path issues.

### 4. ADB Shows Duplicate or Ghost Devices

**Symptoms:**

* Android Studio’s AVD only lists one emulator, but `adb devices` shows multiple.
* Build errors or confusion about which emulator is active.

**Cause:**

* Stale ADB device entries from previously deleted or corrupted emulator instances.

**Fix:**\
Restart the ADB server:

```bash
adb kill-server
adb start-server
adb devices
```

If this doesn't resolve it:

* Delete all unused emulators from **Android Studio → Device Manager**.
* Recreate new AVDs to avoid misconfigured devices.

### Extra Tips for Smooth Builds

* Always use **Node.js LTS versions** for React Native projects (avoid experimental versions like v23).
* Run `npx expo doctor` or `npx react-native doctor` regularly to diagnose config issues.
* Keep your Expo CLI and dependencies up to date:

  ```bash
  npm install -g expo-cli
  npm outdated
  ```

### Still Stuck?

If you continue to encounter issues:

* Run the command with `--verbose` or `--stacktrace` to get detailed logs.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.burnt.com/xion/developers/accounts/mobile-app/mobile-development-common-errors-and-fixes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
