Android ClassNotFoundException:在路径上找不到类


97
10-22 15:29:40.897: E/AndroidRuntime(2561): FATAL EXCEPTION: main
10-22 15:29:40.897: E/AndroidRuntime(2561): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.gvg.simid/com.gvg.simid.Login}: java.lang.ClassNotFoundException: Didn't find class "com.gvg.simid.Login" on path: DexPathList[[zip file "/data/app/com.gvg.simid-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.gvg.simid-1, /vendor/lib, /system/lib]]
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.os.Looper.loop(Looper.java:137)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at java.lang.reflect.Method.invokeNative(Native Method)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at java.lang.reflect.Method.invoke(Method.java:525)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at dalvik.system.NativeStart.main(Native Method)
10-22 15:29:40.897: E/AndroidRuntime(2561): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.gvg.simid.Login" on path: DexPathList[[zip file "/data/app/com.gvg.simid-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.gvg.simid-1, /vendor/lib, /system/lib]]
10-22 15:29:40.897: E/AndroidRuntime(2561):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
10-22 15:29:40.897: E/AndroidRuntime(2561):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
10-22 15:29:40.897: E/AndroidRuntime(2561):     ... 11 more

我不太确定是什么原因导致的,因为清单中正确列出了它:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gvg.simid"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.READ_OWNER_DATA" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <uses-feature android:name="android.hardware.usb.host" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.gvg.simid.Login"
            android:label="@string/app_name" 
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我还添加了“ Android Private Libraries”来构建路径,并将其移至“ Order and Export”的顶部,但是它仍然给我同样的错误。

编辑:我完全重建了该项目,并且无法重现该错误。不知道是什么原因造成的。


2
您在使用proguard吗?
Juangcg

未启用Proguard。
菲多


尝试在android:name中使用“ .Login”,如果无法检测到,Android会自行附加其余前缀。可能只是Eclipse的一个奇怪的解析问题
Darryl Bayliss 2013年

@Juangcg我在写这篇文章之前已经读过这篇文章,但是不幸的是,我从那里尝试过的所有方法都没有用。
菲多

Answers:


76

我的项目遇到了同样的问题。这是由于我的项目与我在项目中添加的库项目之间的android支持库版本冲突而发生的。将相同版本的android支持库放入您的项目和包含的库项目中,并清理构建 ...一切正常。


3
谢啦!!!我确定我已经做过,但是我检查了一下,版本不一样!非常感谢!
Rodrigo Venancio 2014年

2
我评论这是为了记住下次“更新” SDK,请观看此答案
Enrique SanMartín2014年

1
如果不使用支持库,为什么会出现问题,您有什么想法吗?
布达2015年

33

以下方法对我有用

  • 右键单击您的project并选择properties
  • “属性”面板将打开。从左侧菜单转到Java Build Path->Order and Export
  • 在下面的列表中,取消选中旁边的框 "Android Dependencies"
  • 终于clean your project

8
那对我有用。“ Android依赖关系”的含义是什么?为什么在这种特殊情况下有帮助?
Oleg Gryb 2014年

为我完美地工作!非常感谢!
prajitdas

7
这些说明是否适合日食?我无法按照这些说明操作android studio。我的是什么project?那是什么意思?
亚当·约翰斯

1
是的,这些说明只适用于日食
克里斯

2
此连结Android Studio中的步骤stackoverflow.com/questions/18533054/...
约瑟夫Selvaraj

13

对于那些在Android Studio上遇到此问题的人,合并后我遇到了同样的问题,由于某种原因,它甚至在操作后仍然存在cleaninvalidate cash/restart这令我发疯。

事实证明,可以通过从命令行运行gradle build一次来修复它。只需在项目目录中运行以下命令:

./gradlew assemble clean
./gradlew assemble

我希望这可以节省我不得不经历的时间和沮丧。


也为我工作
davedavedave



7

如果我们更改APP的构建路径,则会发生这种情况,在任何情况下都可以添加或删除或更改库或.jar文件。最好的解决方案是重新启动Eclipse。


7

如果您将新Library Project模块作为模块添加到Android项目中,并且正在Kotlin库中使用,请不要忘记添加

apply plugin: 'kotlin-android'

在模块的Gradle文件顶部。创建新模块时,Android Studio不会添加此行,这可能会像我一样浪费您的时间。

编辑:过了一会儿,我再次遇到这个问题,这次我忘记添加模块作为对项目的依赖。:)


为我解决了这个问题,我只想发布一个答案。谁跳到SO的第二页寻求解决方案?
库诺

当我们使用Java库项目时会发生此问题...此解决方案解决了我的问题
Devrath

6

如果您在Android Studio 2.0及更高版本中使用新的“即时运行”功能时遇到此错误,则说明这是他们的错误。
要解决此问题,您必须在设备/仿真器上手动停止您的应用(如果尚未停止),然后从Android Studio中选择BuildRebuild Project
然后单击“ 运行”按钮或SHIFT + F10


6

对于拥有multidex的任何人,请启用此代码

内部build.gradle

apply plugin: 'com.android.application'

android {
 defaultConfig {
      multiDexEnabled true
  }
 dexOptions {
        javaMaxHeapSize "4g"
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.google.android.gms:play-services:+'
    compile 'com.android.support:multidex:1.0.1'
}

EnableMultiDex像下面这样写一个类

import android.content.Context;
import android.support.multidex.MultiDexApplication;

public class EnableMultiDex extends MultiDexApplication {
    private static EnableMultiDex enableMultiDex;
    public static Context context;

    public EnableMultiDex(){
        enableMultiDex=this;
    }

    public static EnableMultiDex getEnableMultiDexApp() {
        return enableMultiDex;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();

    }
}

并在Application标签内AndroidManifest.xml写入这个className

 <application
    android:name="YourPakageName.EnableMultiDex"
    android:hardwareAccelerated="true"
    android:icon="@drawable/wowio_launch_logo"
    android:label="@string/app_name"
    android:largeHeap="true"
    tools:node="replace">

ohhhhh mahn ...完美的答案..我看到了这个答案,但是没有人投票,所以我忽略了这个,去投票了,但是没有用..最后,我刚刚测试了这个,我明白了,谢谢mahn。:) :) :) :)
Sachin Varma

很高兴它有所帮助:)
Manohar Reddy

2
重点是从MultiDexApplication类而不是从类扩展应用程序Application
VSB

谢谢。我已经在清单中有一些应用程序。从扩展了它MultiDexApplication,Android 4.4上的异常消失了。
CoolMind

6

如果您在Android 4.4更低版本上使用Multidex,则问题可能出在您的活动类位于第二个dex文件中,因此android系统找不到。

要将活动类保留在主dex文件中,请参见以下页面:

https://developer.android.com/studio/build/multidex.html#keep


要查找dex文件中的哪些类,请使用Android Studio

只需将您的APK拖放到Android Studio中即可。您应该能够在apk资源管理器中查看您的dex文件。

然后选择dex文件以查看其中包含哪些类。


另一个替代方法是dexdump:

您可以使用dexdump命令来检查apk中包含的dex文件的内容,该命令可以在

android-sdk / build-tools / 27.0.3 / dexdump

对于Windows用户,请参阅我为简化此过程而制作的此工具


1
链接自己的工具时,请确保声明您拥有它
LW001

5

就我而言,是Proguard缩小过程从我的生产apk中删除了一些重要的类。

解决方案是编辑proguard-rules.pro文件并添加以下内容:

-keep class com.someimportant3rdpartypackage.** { *; }

3

1)在项目根目录下创建libs文件夹
2)复制jar文件并将其粘贴到其中
3)配置构建路径(添加jar)
4)清理并运行

欢呼声:-)


3

信不信由你...我几乎尝试了所有在stackoverflow上找到的答案。在我重新启动计算机之前,没有任何帮助。我的Android Studio可在Ubuntu 16.04 LTS上运行。


同样在这里,尝试全部并按照您的评论重新启动。在我的输出参考,以重构的类名,我看到“无法找到”尽管我删除整个生成文件夹..刚开始的Android
阿尔文凯斯勒

2

当我定义一个扩展视图但使用错误名称在布局文件中引用此自定义视图的类时,我曾遇到此错误。而不是<com.example.customview/>,我已经包含<com.customview/>在XML布局文件中。


2

我遇到了相同的问题,并通过执行以下操作解决了该问题:

从构建菜单中选择

1-清理项目。

2-建立APK。


我总是花几个小时在SO上寻找解决方案,结果我需要做的就是Clean-> Build。
Shishir Shetty

2

我遇到了同样的问题,我注意到示例代码放在目录“ java”下,而不是目录“ src”下。将代码移至src后,问题得以解决。

还要确保将应用程序目录拆分为多个文件夹。例如/main/com/site/appname//main/com.site.appname/

希望它能起作用〜


您解决了我头上的问题!睡眠不足,甚至没有意识到类在Java文件夹中:)
bran.io 2014年


1

我最近遇到了这个问题,我正在使用Android Studio 0.8.4

问题是我决定重命名一个名为main.xml的XML菜单布局文件。

右键单击它,然后选择Refactor-> Rename。重命名之前,请确保取消选中“在注释和字符串中搜索”,然后按“ 重构”

因为我的文件最初名为'main',所以它在app.iml和build.gradle中重命名了关键路径,主要是build.gradle中的java.srcDirs,因为该路径被定义为'src/main/java'

希望这对可能遇到此问题的任何人有所帮助。


1

从版本18升级后,我遇到了这个问题。升级后,我得到了以下内容:Project Build Target为5.01,targetSDKVersion = 21

但是: 构建工具仍来自Android 4.3.1(18)我注意到的是,那些从ActionBarActivity派生其活动的应用由于上述错误而崩溃了,但那些仍未运行。

因此,简单的解决方法是使用最新的Android SDK Build Tools 21.1.2, 而不是仅使用Android SDK Build Tools 18的工具,这似乎是默认设置。

因此,罪魁祸首似乎是Appcompat库,我将其用于Actionbar的向后兼容性。

并且顺便说一下:使用程序兼容性库我必须设置/修复: $SDKInstallDIR$\Android\android-sdk\extras\android\support\v7\appcompat\project.properties target=android-21(这是在其他一些有用的建议后,并具有默认情况下为19值))



1

这里提到的解决方案-> Multidex Issue解决方案对我有用。以下是需要添加到应用程序上下文中的内容:

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

0

我遇到了这个问题,这是由多种原因引起的,但是我在您的堆栈跟踪“ **Unable to instantiate activity ComponentInfo{...}: java.lang.ClassNotFoundException: Didn't find class "..." on path: DexPathList[[**”中看到了这个问题,.classpath在停止工作之前我发现了一个不同之处。

 <?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

我添加了一行:

<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>

这是最终版本:

  <?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

现在可以了!=)


0

我有同样的问题。正如@weiweia所建议的,将代码从java目录移动到src对我有用。我还从项目->属性-> Java构建路径->订单和导出中删除了Android依赖项,并确保仅在Android屏幕中包括Library Projects。


0

我有一段时间了这个问题,和其他所有人一样,以上答案不适用于我的项目。

在我的项目中,我已经将一个项目链接到我的项目,并且每次执行另一个项目的某些代码时,它都会引发ClassDefNotFoundError。

这就是我的解决方案。我去了我的项目和Java Build Path的项目属性。在另一个项目的src文件夹中按下“源”选项卡和“链接源”到我自己的项目,并命名一个新文件夹“ core-src”。

希望这个解决方案可以帮助某人


0

我遇到过同样的问题。我正在使用Xamarin.Android。

我的问题是我更改了versionCode和versionName。

当我将它们设置为这样时,我没有问题:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="pac.ka.ge" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">

当我将其更改为此版本(版本代码2和versionName 0.0.1)时,出现了问题:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=" pac.ka.ge " android:versionCode="2" android:versionName="0.0.1" android:installLocation="auto">

我通过更改为versionCode 2和versionName 1.0.0.1来解决了该问题,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=" pac.ka.ge " android:versionCode="2" android:versionName="1.0.0.1" android:installLocation="auto">

我不确定为什么这是一个问题,也许Android不喜欢带有更高versionCode的更低versionName吗?

我在http://developer.android.com/guide/topics/manifest/manifest-element.html#vname上找到了以下内容

android:versionCode内部版本号。该数字仅用于确定一个版本是否比另一个版本新,而更高的数字则表示最新版本。这不是显示给用户的版本号;该数字由versionName属性设置。该值必须设置为整数,例如“ 100”。您可以根据需要定义它,只要每个后续版本的编号都更高。例如,它可以是内部版本号。或者,您可以通过分别在低16位和高16位中编码“ x”和“ y”,将“ xy”格式的版本号转换为整数。或者,您可以在每次发布新版本时将数字简单地增加一。

android:versionName向用户显示的版本号。该属性可以设置为原始字符串或对字符串资源的引用。该字符串除了显示给用户外没有其他用途。versionCode属性保存内部使用的有效版本号。


0

万一有人遇到与我相同的问题,并且这里没有建议的答案会有所帮助。

对我而言,原因是Android Studio重构存在错误。我将内部类移到了一个类之外,该类是一个View,因此也有一个xml,在其中设置了直接路径。Studio不会重构此路径!并且不会抛出任何错误。

希望这对任何人有帮助。干杯。


0

在我们的例子中,我们想编译Vagrant版本,并且有同样的错误。我们通过clean projectrebuild project在“构建”菜单中对其进行了修复


0

我刚刚重新启动设备并运行了该应用程序。它的工作没有任何问题。希望这可以帮助某人:)


0

当我尝试在使用API 23的设备中进行调试时,我在Android Studio中发现了此错误,因此我检查了Android Studio,并发现我没有安装此API 23版本。安装后,我解决了问题。


0

我有几次这个问题,而且我经常没有对依赖项做任何明显错误的事情。

检查最终apk中是否存在“未找到”类始终是一个好主意。如果是这样,就像我的情况一样,问题通常是:

不是没有找到给定的类,而是因为缺少其超类而无法加载。

检查您扩展的类是否可用,然后尝试相应地修复您的构建脚本或依赖项。

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.