error "activity class does not exist" when launching android app with adb shell am start
Categories:
Troubleshooting 'Activity Class Does Not Exist' in Android with ADB

Learn to diagnose and resolve the common 'Activity class does not exist' error when launching Android apps via adb shell am start
.
When developing or debugging Android applications, using adb shell am start
is a powerful way to launch activities directly from the command line. However, encountering the error message "Error: Activity class does not exist" can be frustrating. This article will guide you through the common causes of this error and provide systematic solutions to get your application running smoothly.
Understanding the 'Activity Class Does Not Exist' Error
This error typically indicates that the Android system cannot find the specified Activity class within the target application package. This can stem from several issues, including incorrect package names, misspelled activity names, an uninstalled application, or problems with the application's AndroidManifest.xml
.
flowchart TD A[Start `adb shell am start` command] --> B{Is Package Name Correct?} B -- No --> C[Verify Package Name (e.g., `adb shell pm list packages`)] B -- Yes --> D{Is Activity Name Correct?} D -- No --> E[Verify Activity Name (e.g., `AndroidManifest.xml`)] D -- Yes --> F{Is App Installed?} F -- No --> G[Install App (e.g., `adb install`)] F -- Yes --> H{Is Activity Exported?} H -- No --> I[Check `AndroidManifest.xml` (`android:exported="true"`)] H -- Yes --> J[Check for Typos/Case Sensitivity] J --> K[Error Resolved / Activity Launched]
Troubleshooting flow for 'Activity class does not exist' error.
Common Causes and Solutions
Let's break down the most frequent reasons for this error and how to address them.
adb devices
) before attempting to launch an activity.1. Incorrect Package Name or Activity Name
The most common reason for this error is a typo in either the package name or the activity name. Android is case-sensitive, so even a slight mismatch will cause the launch to fail.
1. Verify Package Name
To find the correct package name, you can use adb shell pm list packages
and filter for your app, or inspect your build.gradle
file (for applicationId
) or AndroidManifest.xml
(for the package
attribute of the <manifest>
tag).
2. Verify Activity Name
The activity name is defined in your AndroidManifest.xml
within the <activity>
tag. It's often a fully qualified class name (e.g., com.example.myapp.MainActivity
). Make sure the name you use in the am start
command exactly matches this. Sometimes, you might need to prepend a dot (.
) if the activity is in the root package, like .MainActivity
.
# Example of finding package name
adb shell pm list packages | grep 'your_app_identifier'
# Example of a correct am start command
adb shell am start -n com.example.myapp/com.example.myapp.MainActivity
# Or, if MainActivity is in the root package:
adb shell am start -n com.example.myapp/.MainActivity
Using adb shell pm list packages
and correct am start
syntax.
2. Application Not Installed
If the application is not installed on the device or emulator, the system obviously won't be able to find its activities. This can happen if the installation failed or if you're targeting a different device than where the app is installed.
1. Check Installation Status
Use adb shell pm path <your_package_name>
to check if the app is installed. If it returns a path, it's installed. If it returns nothing, it's not.
2. Install the Application
If the app is not installed, install it using adb install path/to/your/app.apk
. Ensure the APK is the correct one for your target device's architecture.
# Check if app is installed
adb shell pm path com.example.myapp
# Install the app (replace with your actual APK path)
adb install /path/to/your/app.apk
Verifying app installation and installing an APK via ADB.
3. Activity Not Exported or Missing Intent Filter
For an activity to be launchable by an external entity (like adb shell am start
), it typically needs to be 'exported'. This is controlled by the android:exported
attribute in the AndroidManifest.xml
. If android:exported="false"
or if the activity doesn't have an <intent-filter>
that matches the launch intent, it might not be accessible.
android:exported="true"
for activities that don't need to be publicly accessible can introduce security vulnerabilities. Only export activities that are intended to be launched by other applications or the system.<!-- AndroidManifest.xml example -->
<activity
android:name=".MainActivity"
android:exported="true"> <!-- This allows external launch -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MyExportedActivity"
android:exported="true"> <!-- Explicitly exported for other intents -->
<intent-filter>
<action android:name="com.example.myapp.ACTION_VIEW_DATA" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".MyInternalActivity"
android:exported="false"> <!-- Not launchable externally -->
</activity>
Example AndroidManifest.xml
showing android:exported
attribute.
If your activity is not the main launcher activity (which typically has MAIN
action and LAUNCHER
category), you might need to specify an action or category in your am start
command if it has a specific intent filter. However, for direct component launch (-n
), android:exported="true"
is usually the primary requirement.
4. Debugging with Logcat
When the am start
command fails, logcat
is your best friend. It often provides more detailed error messages from the Android system that can pinpoint the exact issue.
1. Start Logcat
Before running your am start
command, open a separate terminal and start adb logcat
.
2. Execute am start
Run your adb shell am start
command in the first terminal.
3. Analyze Logcat Output
Look for error messages (e.g., E/AndroidRuntime
, E/ActivityManager
) in the logcat output. These often contain stack traces or specific reasons for the activity not being found or launched.
# In one terminal:
adb logcat
# In another terminal:
adb shell am start -n com.example.myapp/.MainActivity
Using logcat
to capture detailed error messages.