Android: Unable to instantiate activity / ClassNotFoundException

AndroidException

Android Problem Overview


I recently published an app to the market and I'm now getting an error by some user, the app presumably crashes right when it starts. Unfortunately I can't contact him directly and the app works fine in the emulator as well as on my phone (and some friends' phones).
EDIT: I guess that this happens to more than one user as I received comments in the market like "crashes on start" or "doesn't work". I only received this one stacktrace but there's no info about the configuration, device, Android version, etc.

The app is a simple soundboard, so there's really no magic involved, but I can't get why it fails on some phones. Here's the stack trace I'm getting, I hope anybody can help me out:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.app/com.my.app.SoundMachine}: java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
... 11 more

These are the first couple of lines from my activity:

public class SoundMachine extends Activity {
  private SoundManager mSoundManager;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

EDIT: This is the (almost) complete onCreate:

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSoundManager = new SoundManager();
    mSoundManager.initSounds(getBaseContext());

    int counter = 0;
    for (Integer soundFile : soundFiles) {
      counter++;
      mSoundManager.addSound(counter, soundFile);
    }

    ImageButton SoundButton1 = (ImageButton) findViewById(R.id.sound1);
    SoundButton1.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mSoundManager.playSound(1);
      }
    });
    SoundButton1.setOnLongClickListener(new OnLongClickListener() {
      public boolean onLongClick(View v) {
        saveSoundChoice(soundFiles[0], soundNames[0]);
        return true;
      }
    });

(...more of this...)

    Button StopButton = (Button) findViewById(R.id.stopbutton);
    StopButton.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mSoundManager.stopAll();
      }
    });
  }

And here's my manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.my.app" android:installLocation="preferExternal"
	android:versionCode="9" android:versionName="1.2">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".SoundMachine" android:label="@string/app_name"
			android:screenOrientation="portrait">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" />
</manifest>

So all possible errors I already read about here and in some forums don't apply to my app.

  • The activity is present in the manifest.
  • The super-method is called in the overriden method.
  • The ContentView is set before accessing elements in the view.

I know it's hard to pinpoint the source of an error without being able to reproduce it, but maybe somebody has a bright idea and can help me out.

Some questions:

  • Do I need the "intent"-part in the manifest? Eclipse created it when I created the project. (Yes, according to Mayra)
  • Should the super-method be called where it is? (Yes, according to Mayra)

EDIT: The main question that remains now is: How come the path in PathClassLoader is different from my package-name? The page John J Smith posted seems to deal with the same problem, but I don't understand the fix that was applied there.

Thanks, Select0r

Android Solutions


Solution 1 - Android

I solved this problems by selecting : Project->properties->order and export

select the all external jar files. clean and build it solved the issue

Solution 2 - Android

Since ADT update to revision 22 (May 2013) you have to check "Android Private Libraries" check box in Project -> Properties -> Java Build Path -> Order and Export in Eclipse for your older projects to get rid of this exception ...

Solution 3 - Android

I just got the same error (Unable to instantiate activity...) with Opera Mini. Opera Mini was on SD card (moved to SD card in the app setting). The error seems to be related to the fact that I swapped the SD card yesterday. The device was shutdown, I copied all data from the old card over to the new card (with cp -a) and then inserted the new card and started the device again. Everything seems to work as expected, but I see now that all apps on the SD card crashes with the same error.

  • Device: HTC Desire HD (Android 2.2)
  • Old SDHC card: SanDisk 8GB class 4
  • New SDHC card: Kingston 16GB class 4

So I would say that this is a an Android bug and not something that can be fixed by app developers.

Also see: http://android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html

> It has always been the case that when you swap SD cards on an Android device, if you physically copy the contents of the old card to the new one, the system will use the data on the new card as if nothing had changed. This is also true of apps which have been installed on the SD card."

This seems to be incorrect.

Solution 4 - Android

This happened to me when I refactored one of my package names and the refactor tool removed the leading "." from all of my activity names. so in the AndroidManifest.xml, I had to change android:name="MyActivity" to android:name=".MyActivity"

hope this helps someone, I just wasted a bunch of time o

Solution 5 - Android

This doesn't apply to the OP's question, but it did to mine and it took me quite some time to figure it out: when using the Google Maps API, make sure you've included the library declaration in the application manifest.

For instance:

public class MyActivity extends MapActivity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}

}

In AndroidManifest.xml:

<application>
	<uses-library android:name="com.google.android.maps" />
	<activity android:name="MyActivity" android:label="@string/app_name">
		<intent-filter>
			<action android:name="android.intent.action.MAIN" />
			<category android:name="android.intent.category.LAUNCHER" />
		</intent-filter>
	</activity>
</application>

Solution 6 - Android

I don't know why the path in the PathClassLoader is different to your package name but when testing on the emulator try forcing a close then run it again, as per this link

Solution 7 - Android

I had the same problem of you and, after hours of search, I discovered something interesting. I'll try to expose that as clearly as possible:

  • I created a project with a package called "myapp.sound" containing the activity. Program ran normally;
  • I renamed that package calling it "app.soundapp" and program still ran normally.

However, in the manifest.xml file of the program there was something strange: the name of package was the old "myapp.sound". I changed manifest with correct new name and, from that moment on, our error occured. I don't know why, but seems that the "package name changer" of Eclipse doesn't update all the dependencies. If it's not strictly necessary, don't rename the package containing activity. Maybe, to solve your problem you have to create a new project and copy inside it all your java class.

Solution 8 - Android

Look at the package defined at the top of the manifiest file and make sure that it matches the package where you class is defined.

My problem was that I did not have matching package names.

Also enusre that you have a folder named "libs" with an 's'. Put all of you jar files that you added inside it and add to build path.

Solution 9 - Android

This problem can also occur if you have a constructor with one or more parameters in your activity class.

Solution 10 - Android

This problem might exist when you change the name of your class and update the manifest file and the manifest file is not updated on the emulator. Try uninstall the application from emulator and then reinstall it. This will work.

Solution 11 - Android

I was coming across this problem when I was including java Projects in my buildpath for my android project targeting JavaSE-1.7.

For some reason my emulator would not throw a class not found if the java project it was including was originally created targeting JavaSE-1.6. Eclipse would give me a warning "Build path specifies execution environment JavaSE-1.6. There are no JREs installed in the workspace that are strictly compatible with this environment." But the Android emulator would launch and I would not get a classnotfoundexception

So if you are including projects that target JavaSE-1.7, remake them targeting JavaSE-1.6 and this may solve your problem.

Good luck!

Solution 12 - Android

Similar to Bobf Cali, I first saw this error after renaming my base package to change the "example" section. To fix it, I had to delete my gen and bin directories, clean the project, and rebuild.

Note depending on what version of the eclipse android plugin you're using (if any), you may also have to update activity names in your AndroidManifest.xml

Solution 13 - Android

Saw the same error message after doing a simple upgrade of my app. Fixed it by doing this:

Project->Build automatically OFF
Project->Clean->Selcting my project

Then I did a new export of my signed app, and it worked.

Solution 14 - Android

Are you sure your package name is unique? I don't know what happen if the user has another app using the same package name, but maybe it can cause strange errors like this.

EDIT: I just saw this page, it remembers me I already had this problem when downloading an app from the Android market. The app crashed on startup, I tried a lot of times but I always ended with the same result. Then I tried to uninstall the app, reinstall it, and everything worked fine. I'm still using it today and the problem never happened again.

On my link, you can also see that they reproduced your error by making the app unreachable (unmount SD), so it's definitely not a problem with your code.

Solution 15 - Android

Check out this article: http://www.androidguys.com/2010/05/22/storing-apps-sd-froyo/ which explains the limitations of storing apps on SD cards. If your users have their SD card mounted by a computer, that might make the SoundMachine class invisible. And I wonder if the cp command fails (perja's attempt to fix) because it might change the ownership of the files such that the userid of the app and the ownership of the files don't match anymore.

Solution 16 - Android

I solved this and could locate the causes: -The Manifest will be corrupt. Even if the package-structure is right and every single data was written down correctly the activity will not be found. -R will be in the package-structure which was first declared before renaming. -The run-configurations are setup with the wrong package of R. So the activity can't be found.

What we have tried: -Manually editing the run-configs via export/import -Manually renaming the package-structure -Manually renaming the R-package-structure -Deleting the run-config (it will be rebuild if you try to start the app)

Solution: Try to setup a new project without reusing your manifest. I have tried to reuse it and got the same problems all over again. So after the main cause has to be the corrupt manifest. I hope this helps!

Solution 17 - Android

Maybe it is too late to solve your problem but hopefully it will help someone else.
I had a similar problem and after many tries, I decided to delete R.java.
That did the trick.

Solution 18 - Android

Make sure your /src dir is listed in your projects>properties>java build path>source

Solution 19 - Android

This error can also occur when you (at the project level) incorrectly Import > Android > Existing Android Code Into Workspace, via Eclipse. In my case, this resulted in an empty "src" folder, but then I noticed new folder starting with "java" at the root and continuing with the package path (i.e. com/zyzcorp/...), leading to the MainActivity.java file.

To test what I thought may fix the problem, I copied the com.*.MainActivity.java file into the src folder, refreshed, cleaned, and restarted Eclipse. I was able to build and run the app on the target device.

Solution 20 - Android

I don't see anything obviously wrong. All I can say is to try to test it in as many different configurations as possible.

Test it in the emulator for every possible SDK level, follow the guidelines for testing on different sized screens (although that doesn't seem to be your problem).

Try to test it on a phone from each of the major providers, if you can find friends that have them: HTC Sense, Motoblur, etc.

If you only get one report, it might just be something screwy with that guys device. See if you get other, similar reports that add more data.

Solution 21 - Android

You had renamed the package anytime? This normally happens if the package was renamed after creation. Following link should be helpfull in that case http://code.google.com/p/android/issues/detail?id=2824. If this is not the case,please post your complete manifest file.

Solution 22 - Android

I had the same issue in a recent Android project. The problem turned out to be pretty simple yet it was hard to locate. This happened to me then I refactored the package name of the entry point activity of the app. This created a conflict with the gen/.../R.java file, since the package there was not refactored. Eclipse did not complain, but at runtime i got the same error you posted: could not instantiate... classNotFoundException...

Lesson learned from this: do NOT refactor the package name that holds your main activity!

Hope this helps you or anyone breaking his/her head over this error!

Solution 23 - Android

I has the same problem but this fixed it. In my androidmanifest.xml i had this line called android:name = myappnameActivity. Although my class name was just myappname. Hence i took off the Activity part in the xml file and all was fine.

Solution 24 - Android

I had 5 different packages. And for some reason the compiler was looking for the activity on the wrong package.

So I switched my activity and all the class that inherits the activity to the package that it was looking into.

I got the name of the package it was looking for in the beginning of the logcat.

Solution 25 - Android

I was just having a problem with this myself, so I want to bring up what caused the problem for me. I had just included some new libraries setting up expansion APKs. The libraries are dependant on each other and I was only including one of them in my properties > android > libraries.

So this could happen if the user is missing a library on their phone that most users have.

It showed ClassNotFoundException on my main activity because it implements a class which was in the missing library.

Solution 26 - Android

I fix this problem by deleting "bin" and "gen" folder, and rebuilding project.

Solution 27 - Android

I had the same problem I solved it by uncheck the Android Dependencies from Project--> Properties-->Java builder Path-->android dependencies

Solution 28 - Android

Delete BIN and GEN folder files. Rebuild, everything should work. Check if theres another error below the "unable to instantiate", sometimes another error is firing this (activity cant load because of something even if its class has been found.

Solution 29 - Android

What I had to do is just re-do the building/exporting process with no modification to the code whatsoever. It worked for me, which I did was to export it two times. On my first export, the build APK has lower file size and the second export (with no any modification to the code/configuration) produced a slightly larger file size (about 200KB diff).

This bug in building is really costly, kills you in front of your manager, and should be really fixed by Android/Eclipse team. Kind of sucks

Solution 30 - Android

After spending 6 hours on this issue, found that it was a silly mistake. Apparently if you're defining your Application class in android manifest and you have enabled MultiDex enabled, you have to add that on Application Class. Here is example from my app.

It only gave me error on devices running on < Android 5.0

AndroidManifest.xml

 ......
 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name=".AppClass"
.........

AppClass.java

class AppClass : Application() {
    override fun onCreate() {
        super.onCreate()
    }



    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)   //Don't forget this !!!!
    }
    
}

Solution 31 - Android

To solve this problem, we need to change the MainActivity.kt or MainActivity.java the following code:

package com.example.yourapp

Solution 32 - Android

I recently purchased a new tablet for development only with Android 4.0. It did not have an external SD card. The demo program I was running would crash with the same error. It had the same line in the manifest asking for SD permission:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

After installing an external SD card, the problem went away. It is possible the person does not have an SD card and your software is not handling it properly. My demo program does not check for the existence of an SD card. Here is a stackflow link describing the issue:

https://stackoverflow.com/questions/6771089/android-development-test-for-sd-card-or-assume-its-there

I realize I am late to the party, but this may help someone else.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSelect0rView Question on Stackoverflow
Solution 1 - Androiduser1219096View Answer on Stackoverflow
Solution 2 - AndroidMilan DoubekView Answer on Stackoverflow
Solution 3 - AndroidperjaView Answer on Stackoverflow
Solution 4 - AndroidBobView Answer on Stackoverflow
Solution 5 - AndroidPaul LammertsmaView Answer on Stackoverflow
Solution 6 - AndroidJohn J SmithView Answer on Stackoverflow
Solution 7 - AndroidmatteopucView Answer on Stackoverflow
Solution 8 - AndroideliteslayerView Answer on Stackoverflow
Solution 9 - AndroidJohannes SvenssonView Answer on Stackoverflow
Solution 10 - AndroidBalajiView Answer on Stackoverflow
Solution 11 - AndroidMentosView Answer on Stackoverflow
Solution 12 - AndroidJ M RossyView Answer on Stackoverflow
Solution 13 - AndroidJbrunttView Answer on Stackoverflow
Solution 14 - AndroidDalmasView Answer on Stackoverflow
Solution 15 - AndroidDave MacLeanView Answer on Stackoverflow
Solution 16 - AndroidDublinCoreView Answer on Stackoverflow
Solution 17 - AndroidBbbView Answer on Stackoverflow
Solution 18 - AndroidAnnaMView Answer on Stackoverflow
Solution 19 - AndroidTope OluwoleView Answer on Stackoverflow
Solution 20 - AndroidCheryl SimonView Answer on Stackoverflow
Solution 21 - AndroidTushar VengurlekarView Answer on Stackoverflow
Solution 22 - AndroidRDMView Answer on Stackoverflow
Solution 23 - AndroidCodeGeek123View Answer on Stackoverflow
Solution 24 - AndroidkhadkaraView Answer on Stackoverflow
Solution 25 - AndroidAC ArcanaView Answer on Stackoverflow
Solution 26 - AndroidTadas ValaitisView Answer on Stackoverflow
Solution 27 - AndroidImran KhanView Answer on Stackoverflow
Solution 28 - AndroidRenato ProbstView Answer on Stackoverflow
Solution 29 - Androidpatrickjason91View Answer on Stackoverflow
Solution 30 - AndroidShubh PatelView Answer on Stackoverflow
Solution 31 - AndroidWilliam RomeroView Answer on Stackoverflow
Solution 32 - AndroidJohn TerryView Answer on Stackoverflow