Android:无法实例化活动/ ClassNotFoundException


69

我最近在市场上发布了一个应用程序,但现在出现了一些用户错误,该应用程序启动时可能崩溃了。不幸的是,我无法直接与他联系,并且该应用程序在模拟器以及我的手机(以及某些朋友的手机)上都可以正常运行。
编辑:我想这会发生在不止一个用户上,因为我在市场上收到了诸如“开始崩溃”或“不起作用”之类的评论。我只收到了这一个堆栈跟踪信息,但没有有关配置,设备,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>

因此,我已经在此处和某些论坛中阅读的所有可能的错误均不适用于我的应用。

  • 该活动存在于清单中。
  • 超级方法在重写方法中调用。
  • ContentView是在访问视图中的元素之前设置的。

我知道很难找出无法重现的错误源,但是也许有人有一个聪明的主意可以帮助我。

一些问题:

  • 清单中是否需要“意图”部分?Eclipse是在创建项目时创建的。(是的,根据Mayra)
  • 超级方法应该在哪里被调用吗?(是的,根据Mayra)

编辑:现在剩下的主要问题是:为什么PathClassLoader中的路径不同于我的包名?John J Smith发布的页面似乎可以解决相同的问题,但是我不理解在那里应用的修复程序。

谢谢,Select0r


这仅发生在单个用户身上吗?您知道什么硬件,SDK版本等吗?
谢丽尔·西蒙

您可以显示onCreate的其余部分吗?
谢丽尔·西蒙

1
回答您的问题:是的,先调用超级按钮应该没问题。是的,要使您的应用具有启动器图标,必须使用意图过滤器。参见developer.android.com/guide/topics/intents/intents-filters.html
Cheryl Simon

@Mayra:我不知道这发生了多少用户,我只是在Android市场上得到了报告(有一个报告,但是可能还有很多其他人没有发送报告)。不幸的是,该报告没有告诉我有关用户使用的配置的任何信息。我已经编辑了包含(几乎)所有onCreate方法的问题。感谢您的回答。
Select0r 2011年

您可以显示清单文件的其余部分,还是仅显示声明“清单”标签的顶部?
Olegas 2011年

Answers:


38

我通过选择以下项目解决了这个问题:Project-> properties-> order and export

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


2
项目->属性-> Java构建路径->订单和导出
Sebastien FERRAND 2013年

该死的,这应该是答案
Aivan Monceller 2013年

3
对于Android Studio,这是项目设置>模块> [要测试的项目]>依赖关系
Makibo,2013年

是!!这也对我有用。我还必须删除与在“项目”->“属性”->“ Java构建路径”->“库”下添加的相同的jar,否则我会遇到异常“多个dex文件-转换为Dalvik格式失败”。
BruceHill

38

自ADT更新到修订版22(2013年5月)以来,您必须为较旧的项目选中“项目”->“属性”->“ Java构建路径”->“订购和导出”中的“ Android Private Libraries”复选框,以摆脱此异常.. 。


2
工作,但必须检查后进行清洁。升级Android工具总是令人恐惧。总有东西坏了。
史密斯先生

1
android tools-> fix project properties,自动为我检查了一下。
SuperShalabi

5
有谁知道如何在IntelliJ / Android Studio Gradle设置中解决此问题?
Will Calderwood 2015年

20

我只是在Opera Mini上遇到了相同的错误(无法实例化活动...)。Opera Mini位于SD卡上(已在应用程序设置中移至SD卡)。该错误似乎与我昨天更换SD卡有关。设备已关闭,我将所有数据从旧卡复制到新卡上(使用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卡上已安装的应用程序也是如此。”

这似乎是不正确的。


1
这可能是我无法重现该错误的原因,因为我没有Froyo,也无法在SD上安装应用程序。另一方面,人们会在市场上报告此问题听起来很奇怪……因为下载应用程序后您会做什么?我认为不要启动它,而要随机移动SD卡。但这仍然要牢记,感谢您指出。市场确实应该允许与直接发表评论的人进行交流,以摆脱这种疯狂的猜测……
Select0r 2011年

1
许多用户已安装了app2sd。此应用程序会通知您是否可以将新安装的应用程序移至SD卡。但是,我无法简单地将应用程序移至SD卡(尝试过HTC Desire HD,Nexus One和Samsung Galaxy Tab)来重现此问题。
2011年

感谢检查出来!即使它困扰着我,我想我也必须坚持这样的信念,即这种情况几乎不会发生,而且我对此无能为力……
Select0r 2011年

7

当我重构了一个包名称,并且重构工具删除了开头的“”时,这发生在我身上。从我所有的活动名称中 因此在AndroidManifest.xml中,我不得不将android:name =“ MyActivity”更改为android:name =“。MyActivity”

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


2
将您的eclipse android插件更新为> r12,这不会再次发生。
布伦德尔

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>

这就是我在寻找的内容
VenomVendor

4

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


尝试了一下,但没有崩溃。不在模拟器中,不在我的手机中。
Select0r 2011年

我阅读并重新阅读了该文章,但是老实说,我并没有真正理解该文章中“静态应用程序引用”的含义,或者为什么“应该更改类名”,您能帮我吗?
Select0r 2011年

1
我会尝试从getBaseContext()更改为getApplicationContext()或更改为getApplicationContext(),如此处更详细所述:stackoverflow.com/questions/1026973/… 如果您按照本文中指向Romain Guy文章的链接进行操作,则可以看到获取资源时的上下文,我认为值得研究。我假设“静态应用程序引用”也正在讨论获取上下文的静态调用。
约翰·史密斯

真的很有意义,谢谢。我从来没有质疑过这种方法,因为它是从Soundboard-tutorial复制而来的,并且对我一直有用。我将尝试研究是否可以重现该错误以及在交换上下文时是否将其修复。
Select0r 2011年

不幸的是,我仍然无法重现该错误。我给了镜头,删除了getBaseContext。我将看到市场的反应:)
Select0r 2011年

4

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

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

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


4

查看在manifiedt文件顶部定义的包,并确保它与您定义类的包匹配。

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

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



3

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


3

当我在针对JavaSE-1.7的android项目的buildpath中包含java Projects时遇到了这个问题。

出于某种原因,如果仿真器最初包含的Java项目是针对JavaSE-1.6创建的,则我的仿真器不会抛出未找到的类。Eclipse会警告我“构建路径指定了执行环境JavaSE-1.6。工作区中没有安装与该环境严格兼容的JRE。” 但是Android模拟器会启动,并且我不会得到classnotfoundexception

因此,如果您包含针对JavaSE-1.7的项目,请使其针对JavaSE-1.6进行重新制作,这可能会解决您的问题。

祝好运!


3

与Bobf Cali类似,在重命名基本包以更改“示例”部分后,我第一次看到此错误。要解决此问题,我必须删除genbin目录,清理项目,然后重新构建。

注意根据您所使用的eclipse android插件的版本(如果有),您可能还必须更新AndroidManifest.xml中的活动名称。


3

简单升级我的应用程序后,看到了相同的错误消息。通过执行此操作来修复它:

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

然后,我对签名的应用程序进行了新的导出,并且可以正常工作。


为我工作。谢谢
Rahul

2

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

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

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


包名将是唯一的,我敢肯定。我想相信错误不在我的代码中,感谢您的链接,但是错误消息是如此奇怪,突然显示了一条不同的路径。即使那是错误,您将如何告诉用户?他们将降级该应用程序并立即将其卸载……另一个想法:这是否可以与该应用程序很大(> 1MB)有关,因为它包含很多声音?(只是
大胆

1
1MB并不是很大...我发布了一个3.6MB的应用程序,但从未看到此错误。顺便说一下,这里是我之前发布的链接的完整主题的链接:groups.google.com/group/android-developers/browse_thread/thread / ...他们谈论了很多您的问题。也许您会发现有用的东西……
Dalmas

2

请查看这篇文章:http : //www.androidguys.com/2010/05/22/storing-apps-sd-froyo/,其中介绍了在SD卡上存储应用程序的局限性。如果您的用户将SD卡安装在计算机上,则可能使SoundMachine类不可见。而且我想知道cp命令是否失败(perja尝试修复),因为它可能会更改文件的所有权,从而使应用程序的用户标识和文件的所有权不再匹配。


2

我解决了这个问题,并找到了原因:-清单将损坏。即使包结构正确且正确记录了每个数据,也不会找到活动。-R将位于重命名之前首先声明的包结构中。-使用错误的R包设置了运行配置。因此找不到活动。

我们尝试的操作:-通过导出/导入手动编辑运行配置-手动重命名程序包结构-手动重命名R程序包结构-删除运行配置(如果尝试启动应用程序,它将重新生成)

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


2

确保您的/ src目录在项目>属性> Java构建路径>源中列出


2

解决您的问题可能为时已晚,但希望对您有所帮助。
我遇到了类似的问题,经过多次尝试,我决定删除R.java.
那可以解决问题。


2

当您(在项目级别)通过Eclipse错误地将“导入”>“ Android”>“现有Android代码”导入工作区时,也会发生此错误。在我的情况下,这导致一个空的“ src”文件夹,但是随后我注意到新的文件夹在根目录中以“ java”开头并继续包路径(即com / zyzcorp / ...),从而导致MainActivity。 java文件。

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


1

我没有发现任何明显的错误。我只能说要尝试在尽可能多的不同配置中对其进行测试。

在模拟器中针对每个可能的SDK级别对其进行测试,并遵循在不同尺寸的屏幕上进行测试的准则(尽管这似乎不是您的问题)。

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

如果您仅收到一份报告,则可能与该设备无关。查看是否有其他类似的报告可以添加更多数据。


我尝试了所有SKD级别,并将使用屏幕分辨率。在实际的设备上,我可以测试1.6、2.1、2.2以及不同的制造商,但是它始终有效。我不认为一个报告意味着只有一个人有这个问题,因为我收到的市场评论说它崩溃了,只有一个人在stacktrace-log中发送了。
Select0r 2011年

1

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


我在用其他一些应用程序重命名软件包时遇到问题,但是直到修复了这些错误之前,我什至无法编译该应用程序,因此这在这里就不是问题了(特别是因为我没有重命名这个问题)。
Select0r 2011年

1

我在最近的Android项目中遇到了同样的问题。问题原来很简单,但很难找到。这发生在我身上,然后我重构了应用程序入口点活动的包名称。由于未重构软件包,因此与gen /.../ R.java文件产生了冲突。Eclipse没有抱怨,但是在运行时我遇到了与您发布的错误相同的消息:无法实例化... classNotFoundException ...

从中吸取的教训:不要重构保存您的主要活动的软件包名称!

希望这可以帮助您或任何人解决此错误!


1

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


1

我本人只是有一个问题,所以我想提出对我造成问题的原因。我刚刚加入了一些新库,用于设置扩展APK。这些库相互依赖,我只在属性> android>库中包括其中一个。

因此,如果用户缺少大多数用户拥有的手机库,则可能会发生这种情况。

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


1

我有5个不同的包裹。出于某种原因,编译器正在寻找错误的程序包上的活动。

因此,我将活动和继承该活动的所有类都切换到它正在寻找的包中。

我在logcat的开头得到了要查找的软件包的名称。



1

我有一个相同的问题,我通过从Project-> Properties-> Java builder Path-> androiddependency取消选中Android Dependencies解决了它


0

删除BIN和GEN文件夹文件。重建,一切都会正常。检查“无法实例化”下面是否还有另一个错误,有时还会引发另一个错误(即使找到了其类,活动也可能由于某些原因而无法加载。


0

我要做的就是重新构建/导出过程,而无需修改任何代码。它对我有用,我做了两次出口。在我的第一个导出中,构建APK的文件大小较小,第二个导出(未对代码/配置进行任何修改)生成的文件大小略大(差异约为200KB)。

这个构建错误确实代价高昂,会在您的经理面前丧命,并且应该由Android / Eclipse团队予以修复。有点烂


0

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

它仅在运行<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 !!!!
    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.