Android:无法实例化活动/ ClassNotFoundException
我最近发布了一个应用程序到市场,我现在得到了一些用户的错误,应用程序可能会崩溃,当它开始。 不幸的是,我不能直接与他联系,该应用程序在模拟器以及我的手机(和一些朋友的手机)中工作正常。
编辑:我想这发生了多个用户,因为我收到市场的意见,如“开始崩溃”或“不工作”。 我只收到这个堆栈跟踪,但没有关于configuration,设备,Android版本等信息。
该应用程序是一个简单的音板,所以没有涉及的魔术,但我不明白为什么它在某些手机上失败。 这是我得到的堆栈跟踪,我希望有人能帮助我:
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
这是我的活动的第一个几行:
public class SoundMachine extends Activity { private SoundManager mSoundManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
编辑:这是(几乎)完成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(); } }); }
这是我的清单:
<?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>
所以我在这里和某些论坛已经阅读的所有可能的错误都不适用于我的应用程序。
- 活动存在于清单中。
- 超级方法在overriden方法中被调用。
- ContentView在访问视图中的元素之前设置。
我知道很难确定一个错误的来源而不能重现错误,但也许有人有一个聪明的想法,可以帮助我。
一些问题:
-
我需要清单中的“意图”吗?Eclipse在创build项目时创build了它。(是的,根据Mayra) -
超级方法应该被称为它在哪里?(是的,根据Mayra)
编辑:现在剩下的主要问题是:PathClassLoader中的path与我的包名称不同? 约翰·J·史密斯发布的页面似乎处理同样的问题,但我不明白在那里应用的修复。
谢谢,Select0r
由于ADT更新到版本22(2013年5月),您必须在项目 – >属性 – > Java构buildpath – >订单和在Eclipse中导出您的旧项目,以摆脱此exception检查“Android专用库”checkbox。 。
我通过select:Project-> properties-> order和export来解决这个问题
select所有的外部jar文件。 清理并构build它解决了这个问题
我只是用Opera Mini得到同样的错误(无法实例化活动…)。 Opera Mini在SD卡上(在应用程序设置中移动到SD卡)。 这个错误似乎与我昨天换了SD卡的事实有关。 设备已closures,我将所有数据从旧卡复制到新卡(使用cp -a),然后插入新卡并重新启动设备。 一切似乎按预期工作,但我现在看到,SD卡上的所有应用程序崩溃与相同的错误。
- 设备:HTC Desire HD(Android 2.2)
- 旧SDHC卡:SanDisk 8GB 4级
- 新的SDHC卡:金士顿16GB 4级
所以我会说,这是一个Android的错误,而不是应用程序开发人员可以修复的东西。
另见: http : //android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html
一直以来,当您在Android设备上交换SD卡时,如果您将旧卡的内容复制到新卡上,则系统将使用新卡上的数据,就像没有任何更改一样。 对于安装在SD卡上的应用程序也是如此。“
这似乎是不正确的。
这发生在我重构我的包名称之一,重构工具删除了领先的“。 从我所有的活动名称。 所以在AndroidManifest.xml中,我不得不将android:name =“MyActivity”更改为android:name =“。MyActivity”
希望这有助于某人,我只是浪费了一堆时间
这不适用于OP的问题,但它确实是我的,我花了相当长的一段时间才弄明白:在使用Google Maps API时,确保已经将库声明包含在应用程序清单中。
例如:
public class MyActivity extends MapActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected boolean isRouteDisplayed() { return false; } }
在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>
我不知道为什么PathClassLoader中的path与软件包名称不同,但是在模拟器上testing时试图强制closures,然后再次运行它,如此链接
我也有同样的问题,经过几个小时的search,我发现了一些有趣的东西。 我会尽可能清楚地说明这一点:
- 我创build了一个名为“myapp.sound”的包含活动的包。 程序正常运行;
- 我重命名该包称为“app.soundapp”和程序仍然正常运行。
然而,在程序的manifest.xml文件中有一些奇怪的东西:包的名字是旧的“myapp.sound”。 我用正确的新名字改变了清单,从那一刻起,我们的错误发生了。 我不知道为什么,但似乎Eclipse的“包名称转换器”并没有更新所有的依赖关系。 如果不是绝对必要,请不要重命名包含活动的包。 也许,为了解决你的问题,你必须创build一个新的项目,并在里面拷贝你所有的java类。
查看在最鲜明的文件顶部定义的包,并确保它与您定义类的包相匹配。
我的问题是我没有匹配的软件包名称。
还有,你有一个名为“库”的文件夹与“S”。 把你添加的所有jar文件添加到它并添加到构buildpath。
如果您的活动类中有一个或多个参数的构造函数,也会出现此问题。
当您更改类的名称并更新清单文件并且清单文件未在模拟器上更新时,可能会存在此问题。 尝试从模拟器卸载应用程序,然后重新安装它。 这将工作。
当我在我的构buildpath中包含java Projects时,遇到了这个问题,因为我的Android项目以JavaSE-1.7为目标。
由于某种原因,我的模拟器不会抛出一个没有find的类,如果它包含的Java项目最初是针对JavaSE-1.6创build的。 Eclipse会给我一个警告:“构buildpath指定了执行环境JavaSE-1.6。工作区中没有安装与此环境严格兼容的JRE”。 但Android模拟器将启动,我不会得到一个classnotfoundexception
因此,如果您要包含面向JavaSE-1.7的项目,请重新制定针对JavaSE-1.6的项目,这可能会解决您的问题。
祝你好运!
与Bobf Cali类似,在重命名我的基本包以更改“示例”部分后,我第一次看到这个错误。 要解决这个问题,我必须删除我的gen和bin目录,清理项目并重build。
请注意,根据您使用的eclipse android插件的版本(如果有),您可能还需要更新AndroidManifest.xml中的活动名称
做了一个简单的升级我的应用程序后,看到相同的错误信息。 通过这样做来修复它:
Project->Build automatically OFF Project->Clean->Selcting my project
然后我做了一个新的签名应用程序的导出,它的工作。
你确定你的包名是独一无二的吗? 我不知道如果用户有另一个应用程序使用相同的包名称会发生什么,但也可能会导致这样的奇怪的错误。
编辑:我刚看到这个页面 ,它记得我从Android市场下载一个应用程序时,我已经有这个问题。 该应用程序在启动时崩溃,我尝试了很多次,但我总是以相同的结果结束。 然后我试图卸载应用程序,重新安装它,一切工作正常。 我今天仍然在使用它,问题再也没有发生过。
在我的链接,你也可以看到,他们通过使应用程序无法访问(卸载SD),再现了你的错误,所以这绝对不是你的代码的问题。
看看这篇文章: http : //www.androidguys.com/2010/05/22/storing-apps-sd-froyo/它解释了在SD卡上存储应用程序的限制。 如果您的用户使用计算机安装了SD卡,则可能会使SoundMachine类不可见。 我不知道是否cp命令失败(perja的尝试修复),因为它可能会改变文件的所有权,使应用程序的用户标识和文件的所有权不再匹配。
我解决了这个问题,并find原因: – 清单将是腐败的。 即使包装结构是正确的,并且每一个数据都被正确地写下来,活动也不会被find。 -R将在重命名之前首次声明的包结构中。 – 运行configuration用错误的R包进行设置。因此无法find活动。
我们已经尝试过了: – 通过导出/导入手动编辑run-configs – 手动重命名包结构 – 手动重命名R-package-structure – 删除run-config(如果尝试启动应用程序,将会重build)
解决scheme:尝试设置一个新项目而不重复使用清单。 我试图重复使用,并重新得到同样的问题。 所以主要原因之后就是腐败的performance。 我希望这有帮助!
确保你的/ src目录在你的项目>属性> java构buildpath>源中列出
也许解决你的问题为时已晚,但希望能帮助别人。
我有一个类似的问题,经过多次尝试,我决定删除R.java.
那就是诀窍。
当您(在项目级别)错误地通过Eclipse导入> Android>现有的Android代码进入工作区时,也会发生此错误。 在我的情况下,这导致了一个空的“src”文件夹,但后来我注意到在根目录开始与“java”的新文件夹,并继续包的path(即com / zyzcorp / …),导致MainActivity。 java文件。
为了testing我认为可以解决的问题,我将com。*。MainActivity.java文件复制到src文件夹中,刷新,清理并重新启动Eclipse。 我能够在目标设备上构build和运行应用程序。
我没有看到任何明显的错误。 我只能说尽量以尽可能多的不同configuration进行testing。
在模拟器中对每个可能的SDK级别进行testing,遵循不同大小的屏幕上的testing指南(尽pipe这似乎不是你的问题)。
尝试从每个主要提供商的手机上进行testing,如果您可以find拥有它们的朋友:HTC Sense,Motoblur等
如果你只能得到一个报告,那可能就是那个家伙的设备。 看看你是否有其他类似的报告,添加更多的数据。
您是否随时更改了软件包? 如果在创build后重命名包,通常会发生这种情况。 在这种情况下,以下链接应该是有帮助的http://code.google.com/p/android/issues/detail?id=2824 。 如果不是这样,请发布完整的清单文件。
我在最近的一个Android项目中遇到了同样的问题。 问题结果很简单,但很难find。 这发生在我身上,然后我重构了应用程序入口点活动的包名称。 这造成了与gen /…/ R.java文件的冲突,因为这个包没有被重构。 Eclipse没有抱怨,但在运行时我得到了同样的错误,你张贴:不能实例化… classNotFoundException …
从中学到的教训: 不要重构包含主要活动的软件包名称!
希望这可以帮助你或任何人打破他/她的头这个错误!
我有同样的问题,但这固定它。 在我的androidmanifest.xml我有这个行称为android:name = myappnameActivity。 虽然我的类名只是myappname。 因此,我脱离了xml文件中的活动部分,一切都很好。
我自己只是有一个问题,所以我想提出是什么原因造成我的问题。 我刚刚包括一些新的库设置扩展APK。 这些库是相互依赖的,我只是在我的属性> android>库中包含其中的一个。
所以如果用户缺less大多数用户拥有的手机库,就可能发生这种情况。
它在我的主要活动中显示了ClassNotFoundException
,因为它实现了一个在缺less的库中的类。
我有5个不同的包。 由于某种原因,编译器正在寻找错误的包上的活动。
所以我把我的活动和所有inheritance活动的类切换到它正在查看的包中。
我得到了它在logcat的开始寻找的包的名字。
我通过删除“bin”和“gen”文件夹和重build项目来解决这个问题。
我有同样的问题,我解决了从项目 – >属性 – > Java生成器path – > Android依赖关系的Android依赖项
删除BIN和GEN文件夹文件。 重build,一切都应该工作。 检查在“无法实例化”下面是否有另一个错误,有时另一个错误是解决这个问题(即使find它的类,活动也无法加载。
我所要做的只是重新build设/出口过程,不用修改任何代码。 它为我工作,我所做的是出口两次。 在我的第一次导出时,构buildAPK具有较低的文件大小,第二次导出(不对代码/configuration进行任何修改)产生稍大的文件大小(差异大约200KB)。
构build这个bug是非常昂贵的,在你的经理面前杀死你,而且应该由Android / Eclipse团队来修复。 有点糟糕
我最近购买了一款新的平板电脑,只能在Android 4.0上进行开发。 它没有外部SD卡。 我正在运行的演示程序会崩溃,同样的错误。 清单中有同样的行要求SD许可:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
安装外置SD卡后,问题就消失了。 这个人可能没有SD卡,你的软件没有正确处理。 我的演示程序不检查是否存在SD卡。 这是一个描述问题的stackflow链接:
Android开发 – testingSD卡还是假设它在那里?
我意识到我晚了,但这可能会帮助别人。