Android:无法实例化activity / ClassNotFoundException

时间:2011-01-27 18:55:23

标签: android exception

我最近向市场发布了一个应用程序,我现在收到一些用户的错误,应用程序可能会在启动时崩溃。不幸的是我无法直接与他联系,该应用程序在模拟器以及我的手机(以及一些朋友的手机)上工作正常。左编辑:我想这会发生在多个用户身上,因为我收到了评论在市场上像“开始时崩溃”或“不起作用”。我只收到了这一个堆栈跟踪,但没有关于配置,设备,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方法中调用super方法。
  • 在访问视图中的元素之前设置ContentView。

我知道很难在不能重现错误的情况下查明错误的来源,但也许有人有一个好主意可以帮助我。

有些问题:

  • 我需要清单中的“意图”部分吗? Eclipse在创建项目时创建了它。(是的,根据Mayra的说法)
  • 是否应该调用超级方法?(是的,根据Mayra说)
编辑:现在仍然存在的主要问题是:为什么PathClassLoader中的路径与我的包名不同? John J Smith发布的页面似乎处理了同样的问题,但我不理解那里应用的修复。

谢谢,Select0r

31 个答案:

答案 0 :(得分:38)

自从ADT更新到第22版(2013年5月)以来,您必须在项目 - &gt;中选中“Android私有库”复选框。属性 - &gt; Java构建路径 - &gt; Eclipse中的订单和导出,以便您的旧项目摆脱此异常......

答案 1 :(得分:38)

我通过选择以下方式解决了这个问题: 项目 - &gt;属性 - >订单和导出

选择所有外部jar文件。 清理并构建它解决了问题

答案 2 :(得分:20)

我在Opera Mini中遇到了同样的错误(无法实例化活动...)。 Opera Mini在SD卡上(在应用程序设置中移动到SD卡)。这个错误似乎与我昨天交换SD卡的事实有关。设备关闭,我将旧卡上的所有数据复制到新卡(使用cp -a),然后插入新卡并再次启动设备。一切似乎按预期工作,但我现在看到SD卡上的所有应用程序都崩溃了同样的错误。

  • 设备:HTC Desire HD(Android 2.2)
  • 旧SDHC卡:SanDisk 8GB class 4
  • 新SDHC卡:金士顿16GB 4级

所以我会说这是一个Android错误,而不是应用程序开发人员可以解决的问题。

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

  

一直以来,当您在Android设备上交换SD卡时,如果您将旧卡的内容物理复制到新卡,系统将使用新卡上的数据,就好像什么都没有改变一样。对于已经安装在SD卡上的应用程序也是如此。“

这似乎不正确。

答案 3 :(得分:7)

当我重构我的一个包名并且重构工具删除了前导“。”时发生了这种情况。来自我的所有活动名称。所以在AndroidManifest.xml中,我不得不将android:name =“MyActivity”更改为android:name =“。MyActivity”

希望这有助于某人,我只是浪费了很多时间o

答案 4 :(得分:6)

这不适用于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>

答案 5 :(得分:4)

我不知道为什么PathClassLoader中的路径与您的包名称不同,但是在模拟器上进行测试时尝试强制关闭然后再次运行它,按照此link

答案 6 :(得分:4)

查看最明显文件顶部定义的包,并确保它与定义类的包匹配。

我的问题是我没有匹配的包名。

还要确保您有一个名为“libs”且带有's'的文件夹。将您添加到其中的所有jar文件放入其中并添加到构建路径。

答案 7 :(得分:4)

我遇到了同样的问题,经过数小时的搜索,我发现了一些有趣的东西。我会尝试尽可能清楚地揭露它:

  • 我使用名为“myapp.sound”的包创建了一个包含该活动的项目。程序运行正常;
  • 我将该程序包重命名为“app.soundapp”,程序仍然正常运行。

但是,在程序的manifest.xml文件中有一些奇怪的东西:包的名称是旧的“myapp.sound”。我用正确的新名称更改了清单,从那一刻起,我们发生了错误。我不知道为什么,但似乎Eclipse的“包名称更改者”并未更新所有依赖项。如果不是绝对必要,请不要重命名包含活动的包。 也许,要解决您的问题,您必须创建一个新项目并将其复制到您的所有Java类中。

答案 8 :(得分:3)

如果您的活动类中包含一个或多个参数的构造函数,也会发生此问题。

答案 9 :(得分:3)

当您更改类的名称并更新清单文件并且模拟器上未更新清单文件时,可能存在此问题。尝试从模拟器卸载应用程序,然后重新安装。这将有效。

答案 10 :(得分:3)

当我在我的构建路径中包含java Projects时,我遇到了这个问题,我的android项目定位于JavaSE-1.7。

由于某些原因,如果它包含的java项目最初是针对JavaSE-1.6创建的,那么我的模拟器不会抛出未找到的类。 Eclipse会给我一个警告“Build path指定执行环境JavaSE-1.6。工作区中没有安装与这个环境严格兼容的JRE。”但Android模拟器将启动,我不会得到classnotfoundexception

因此,如果您要包含针对JavaSE-1.7的项目,请将它们重新定位到JavaSE-1.6,这可能会解决您的问题。

祝你好运!

答案 11 :(得分:3)

在对我的应用进行简单升级后看到相同的错误消息。修复它:

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

然后我对已签名的应用程序进行了新的导出,并且有效。

答案 12 :(得分:3)

与Bobf Cali类似,我在重命名基础包以更改“示例”部分后首次看到此错误。要修复它,我必须删除 gen bin 目录,清理项目并重建。

注意取决于你正在使用的eclipse android插件的版本(如果有的话),你可能还需要在AndroidManifest.xml中更新活动名称

答案 13 :(得分:2)

我解决了这个问题并找出原因: - 清单将腐败。即使包结构正确并且每个数据都被正确写下,也无法找到活动。 -R将在重命名之前首先声明的包结构中。 - 使用错误的R包设置运行配置。因此无法找到活动。

我们尝试过: - 通过导出/导入手动编辑run-configs - 手动重命名包结构 - 手动重命名R-package结构 - 删除run-config(如果你尝试启动应用程序,它将重建)

解决方案: 尝试设置新项目而不重用清单。我试图重复使用它,并再次遇到同样的问题。因此,主要原因必须是腐败的表现。 我希望这有帮助!

答案 14 :(得分:2)

当您(在项目级别)错误导入&gt;时也会发生此错误Android&gt;现有的Android代码通过Eclipse进入Workspace。在我的情况下,这导致一个空的“src”文件夹,但后来我注意到新的文件夹以root开头的“java”并继续包路径(即com / zyzcorp / ...),导致MainActivity。 java文件。

为了测试我认为可能解决问题的方法,我将com。*。MainActivity.java文件复制到src文件夹中,刷新,清理并重新启动Eclipse。我能够在目标设备上构建和运行应用程序。

答案 15 :(得分:2)

查看这篇文章:http://www.androidguys.com/2010/05/22/storing-apps-sd-froyo/,它解释了在SD卡上存储应用程序的限制。如果您的用户通过计算机安装了SD卡,则可能导致SoundMachine类不可见。我想知道cp命令是否失败(perja试图修复)因为它可能会改变文件的所有权,使得应用程序的用户ID和文件的所有权不再匹配。

答案 16 :(得分:2)

解决问题可能为时已晚,但希望能帮到别人 我遇到了类似的问题,经过多次尝试后,我决定删除R.java.。这就是诀窍。

答案 17 :(得分:2)

确保你的/ src dir列在你的项目&gt; properties&gt; java build path&gt; source

答案 18 :(得分:2)

您确定您的包裹名称是唯一的吗?我不知道如果用户有另一个使用相同包名的应用程序会发生什么,但可能会导致这样的奇怪错误。

编辑:我刚刚看到this page,它还记得我从Android市场下载应用时遇到此问题。该应用程序在启动时崩溃,我尝试了很多次,但我总是以相同的结果结束。然后我尝试卸载应用程序,重新安装它,一切正常。我今天仍在使用它,问题再也没有发生过。

在我的链接上,您还可以看到他们通过使应用无法访问(卸载SD)来重现您的错误,因此您的代码绝对不会出现问题。

答案 19 :(得分:1)

我在最近的Android项目中遇到了同样的问题。事实证明这个问题非常简单但很难找到。这发生在我身上然后我重构了应用程序的入口点活动的包名称。这与gen /.../ R.java文件产生冲突,因为那里的包没有重构。 Eclipse没有抱怨,但在运行时我得到了你发布的相同错误:无法实例化... classNotFoundException ...

从中吸取的教训: NOT 重构包含主要活动的包名称!

希望这可以帮助你或任何人突破这个错误!

答案 20 :(得分:1)

我遇到了同样的问题 我解决了 取消选中项目中的Android依赖项 - &gt;属性 - &gt; Java构建器路径 - &gt; android依赖项

答案 21 :(得分:1)

我没有看到任何明显的错误。我只能说尝试尽可能多的不同配置。

在模拟器中针对每个可能的SDK级别对其进行测试,遵循different sized screens上的测试指南(尽管这似乎不是您的问题)。

如果您能找到拥有它们的朋友,请尝试在每个主要提供商的手机上进行测试:HTC Sense,Motoblur等。

如果你只收到一份报告,那可能只是那个家伙设备上的一些东西。看看是否有其他类似的报告可以添加更多数据。

答案 22 :(得分:1)

我通过删除“bin”和“gen”文件夹以及重建项目来解决此问题。

答案 23 :(得分:1)

我自己也遇到了这个问题,所以我想提出导致问题的原因。我刚刚添加了一些新的库来设置扩展APK。这些库彼此依赖,我只在其属性中包含其中一个&gt; android&gt;库。

如果用户错过了大多数用户手机上的库,就会发生这种情况。

它在我的主要活动上显示ClassNotFoundException,因为它实现了一个缺少库中的类。

答案 24 :(得分:1)

我有5个不同的套餐。由于某种原因,编译器正在寻找错误包上的活动。

所以我将我的活动和所有继承活动的类切换到它正在查看的包。

我在logcat开头找到了它正在寻找的软件包的名称。

答案 25 :(得分:1)

您是否已随时重命名该套餐?如果在创建后重命名了包,通常会发生这种情况。在这种情况下,以下链接应该是有用的http://code.google.com/p/android/issues/detail?id=2824。如果不是这种情况,请发布完整的清单文件。

答案 26 :(得分:1)

我有同样的问题,但这解决了它。在我的androidmanifest.xml中,我有一行名为android:name = myappnameActivity。虽然我的班级名称只是myappname。因此我取消了xml文件中的Activity部分,一切都很好。

答案 27 :(得分:0)

删除BIN和GEN文件夹文件。重建,一切都应该有效。检查是否有另一个错误低于“无法实例化”,有时另一个错误是触发这个(活动因为某些事情而无法加载,即使已经找到它的类。

答案 28 :(得分:0)

我必须做的只是重新进行构建/导出过程而不修改任何代码。它对我有用,我做的是将它输出两次。在我第一次导出时,构建APK的文件大小较小,第二次导出(没有对代码/配置进行任何修改)会产生稍大的文件大小(大约200KB差异)。

构建中的这个错误非常昂贵,会让你在经理面前杀死,并且应该由Android / Eclipse团队确定。有点糟透了

答案 29 :(得分:0)

在此问题上花费了6个小时后,发现这是一个愚蠢的错误。显然,如果要在android清单中定义Application类,并且已启用MultiDex,则必须在Application Class上添加它。这是我的应用程序中的示例。

它仅在运行

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 !!!!
    }

}

答案 30 :(得分:-1)

我最近购买了一款仅适用于Android 4.0的新平板电脑。它没有外部SD卡。我运行的演示程序会因同样的错误而崩溃。它在清单中有相同的行要求SD权限:

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

安装外置SD卡后,问题就消失了。该人可能没有SD卡,而您的软件没有正确处理它。我的演示程序不检查是否存在SD卡。这是描述问题的堆栈流链接:

Android development - test for SD card or assume it's there?

我意识到我迟到了,但这可能有助于其他人。