Android ClassNotFoundException:在路径上找不到类

Posted

技术标签:

【中文标题】Android ClassNotFoundException:在路径上找不到类【英文标题】:Android ClassNotFoundException: Didn't find class on path 【发布时间】:2013-10-31 15:16:00 【问题描述】:
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 ComponentInfocom.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”的顶部,但它仍然给了我同样的错误。

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

【问题讨论】:

你在用proguard吗? Proguard 未启用。 查看这篇文章:***.com/questions/10866431/… 在 android:name 中尝试“.Login”,如果无法检测到,Android 将自行附加前缀的其余部分。可能只是 Eclipse 的一个奇怪的解析问题 @Juangcg 我在写这篇文章之前读过那篇文章,但不幸的是我从那里尝试的一切都没有奏效。 【参考方案1】:

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

【讨论】:

谢谢大佬!!!我确定我已经完成了,但是我检查了,版本不同!非常感谢! 我评论这个以记住下次“更新”sdk,看这个答案 如果我不使用支持库,您知道为什么会出现问题吗? 就我而言,这是一个Didn't find class "android.graphics.ColorSpace" 错误。 Android SDK 应该没有冲突。【参考方案2】:

以下方法对我有用

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

【讨论】:

这对我有用。 “Android Dependencies”是什么意思,为什么它在这种特殊情况下有帮助? 非常适合我!非常感谢! 这些指令是 Eclipse 的吗?对于 android studio,我无法按照这些说明进行操作。我的project 是什么?这是什么意思? 是的,这些说明适用于 eclipse 此链接包含适用于 Android Studio 的步骤***.com/questions/18533054/…【参考方案3】:

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

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

./gradlew assemble clean
./gradlew assemble

我希望它可以节省我不得不经历的时间浪费和挫折。

【讨论】:

也为我工作【参考方案4】:

我有同样的问题,这对我有用

1) mainfest 中活动的完整路径代替相对路径。

2) 删除“build”文件夹并清理项目。

【讨论】:

删除构建文件夹对我有用。我在这个问题上浪费了几个小时,谢谢 也为我工作。谢谢。 这是真正的交易。 XD【参考方案5】:

如果您在 Android 项目中添加了一个新的 Library Project 作为模块,并且您在库中使用了 Kotlin不要忘记添加

apply plugin: 'kotlin-android'

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

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

【讨论】:

为我解决了,我只是想发布一个答案。谁跳到关于 SO 的第二页寻求解决方案? 当我们使用java库项目时会出现这个问题......这个解决方案解决了我的问题 这对我有用,并让我知道我失踪了classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"【参考方案6】:

如果您使用的是 Eclipse,请尝试 Project -> Clean

【讨论】:

适用于 android studio - 清理/重建项目并运行【参考方案7】:

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

【讨论】:

【参考方案8】:

如果您在 Android Studio 2.0 及更高版本中使用新的 Instant Run 功能时遇到此错误,那么这是他们方面的某种错误。 要解决此问题,您必须在 Device/Emulator 上手动停止您的应用,如果它没有停止,然后从 Android Studio 中选择 BuildRebuild Project。 然后点击运行按钮或SHIFT+F10

【讨论】:

【参考方案9】:

对于任何启用 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();

    

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

 <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...完美的答案..我看到了这个答案但没有人投票所以我忽略了这一点并选择了投票的答案但没有奏效..最后我刚刚测试了这个答案我得到了,谢谢马恩。:):):):) 很高兴它有帮助:) 重点是从MultiDexApplication类而不是Application扩展应用程序。 谢谢。我已经在 Manifest 中有一些应用程序。从 MultiDexApplication 扩展而来,异常在 Android 4.4 上消失了。【参考方案10】:

如果您在 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 用户,请参阅 tool 我为简化流程而制作的

【讨论】:

链接您自己的工具时,be sure to declare you own it.【参考方案11】:

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

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

-keep class com.someimportant3rdpartypackage.**  *; 

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

信不信由你……我尝试了几乎所有在***上找到的答案。没有任何帮助,直到我重新启动机器。我的 Android Studio 在 Ubuntu 16.04 LTS 上运行。

【讨论】:

这里一样,尝试了所有并根据您的评论重新启动。我在输出中看到一个对重构类名称的引用,尽管我删除了整个构建文件夹,但“无法找到”.. 刚刚启动 android【参考方案15】:

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

从构建菜单中选择

1- 清理项目。

2- 构建 APK。

【讨论】:

我总是花几个小时在 SO 上寻找解决方案,结果发现 Clean -> Build 是我所要做的。【参考方案16】:

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

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

希望有效果~

【讨论】:

你解决了我的问题!睡眠不足,甚至没有意识到类在Java文件夹中:)【参考方案17】:

我遇到了同样的问题,经过大量的工作和搜索,我找到了解决方案:我刚刚清理了项目,然后构建了 apk。 -构建->清理项目 -构建-> 构建 APK(s) 我希望它是有用的.....

【讨论】:

【参考方案18】:

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

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

右键单击它并选择Refactor --> Rename。在重命名之前,请务必取消选中 “在 cmets 和字符串中搜索” 并按下 重构

因为我的文件原名为'main',所以重命名了app.iml和build.gradle中的关键路径,主要是build.gradle中的java.srcDirs,因为路径已经定义好了作为'src/main/java'

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

【讨论】:

【参考方案19】:

从版本 18 升级后我遇到了这个问题。 升级后我有以下内容: 项目构建目标为 5.01,targetSDKVersion=21

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

所以简单的解决方法是使用最新的 Android SDK Build Tools 21.1.2 而不仅仅是那些似乎是默认的 Android SDK Build Tools 18 的那些。

所以罪魁祸首似乎是 Appcompat 库,我用它来实现 Actionbar 的向后兼容性。

还有一个顺便说一句:使用我必须设置/修复的 appcompat 库: $SDKInstallDIR$\Android\android-sdk\extras\android\support\v7\appcompat\project.properties target=android-21(在其他一些有用的帖子中推荐过,默认值为 19)

【讨论】:

【参考方案20】:

我多次遇到这个问题,而且我经常没有对依赖项做一些明显错误的事情。

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

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

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

【讨论】:

【参考方案21】:

我在 Windows 上遇到了同样的问题。我已将项目的路径重命名为包含空格的内容。

确保项目的路径不包含空格。

【讨论】:

你在说什么路径?【参考方案22】:

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

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

【讨论】:

【参考方案23】:

我遇到了这个问题,由多种原因引起,但我在你的堆栈跟踪“**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>

现在可以了! =)

【讨论】:

【参考方案24】:

我也有同样的问题。正如@weiweia 建议的那样,将代码从 java 目录移动到 src 为我工作。我还从 Project --> Properties --> Java Build Path --> Order and Export 中删除了 Android 依赖项,并确保仅在 Android 屏幕中包含 Library Projects。

【讨论】:

【参考方案25】:

我遇到这个问题已经有一段时间了,和其他人一样,上面的答案并不适用于我的项目。

在我的项目中,我将一个项目链接到我的项目,每次执行另一个项目的某些代码时它都会抛出 ClassDefNotFoundError。

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

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

【讨论】:

【参考方案26】:

我有同样的问题。我正在使用 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 和版本名称 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 不喜欢较低的 versionName 和较高的 versionCode?​​p>

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

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

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

【讨论】:

【参考方案27】:

以防万一有人遇到和我一样的问题,不建议 在这里回答会有所帮助。

对我来说,原因是 Android Studio 重构存在错误。 我将一个内部类移到一个类之外,这是一个视图,因此 还有一个xml,其中设置了直接路径。这条路径不会得到 由工作室重构!并且不会抛出任何错误。

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

【讨论】:

【参考方案28】:

在我们的例子中,我们想要编译 Vagrant 版本并且有同样的错误。我们在 Build 菜单中通过 clean projectrebuild project 修复了它

【讨论】:

【参考方案29】:

我刚刚重启了设备并运行了应用程序。它没有任何问题。希望这对某人有帮助:)

【讨论】:

【参考方案30】:

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

【讨论】:

以上是关于Android ClassNotFoundException:在路径上找不到类的主要内容,如果未能解决你的问题,请参考以下文章

IDEA攻略合辑

java_父类

自定义声纳规则 - ClassNotFoundException: com.sonar.sslr.api.AstAndTokenVisitor

致命异常:java.lang.NoClassDefFoundError 解析失败:某些设备中的 Ljava/time/Month

Android逆向系列文章— Android基础逆向

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )