ClassNotFoundException:在路径上找不到类:DexPathList
Posted
技术标签:
【中文标题】ClassNotFoundException:在路径上找不到类:DexPathList【英文标题】:ClassNotFoundException: Didn't find class on path: DexPathList 【发布时间】:2015-07-01 05:50:07 【问题描述】:我在 Playstore 上更新了我的应用后遇到了问题。自本次更新以来,引发了异常,但我没有更改与此异常相关的任何内容。
堆栈跟踪:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfode.opiatefuchs.onthejobtimerlight/de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity: java.lang.ClassNotFoundException: Didn't find class "de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity" on path: DexPathList[[zip file "/data/app/de.opiatefuchs.onthejobtimerlight-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn't find class "de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity" on path: DexPathList[[zip file "/data/app/de.opiatefuchs.onthejobtimerlight-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
... 10 more
Suppressed: java.lang.ClassNotFoundException: de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
问题是,我之前的应用程序版本运行没有问题,我没有更改与此活动相关的任何内容。我刚刚添加了一个与此活动无关的新信息对话框。这个应用程序是免费的精简版,我在专业版上做了完全相同的更改,没有任何东西被抛出。这按预期工作。 专业版和精简版之间的唯一区别是,我在精简版中集成了 Admob(以新方式),在专业版中集成了 Google Play 许可证。但是我从一开始就已经整合了这一点,并且没有对此进行任何更改。 我也没有对清单进行任何更改,我在这里阅读了很多帖子,但没有任何帮助。
它似乎只发生在 5.0 之后的 Android 版本上。有没有人知道这个问题可能导致什么或有任何人有同样的经历? proguard 是否有可能只是通过混淆(同样在这里,没有变化)破坏了任何东西?
我没有发布代码,因为它对这个问题并不重要,就像我说我没有对这个异常进行任何更改。
此问题被标记为重复,但事实并非如此。带有链接的评论不能解决我的问题,所有库都经过检查并以正确的方式集成。另外,我不使用 NDK。
【问题讨论】:
这不是重复的,正如我所描述的,因为所谓的重复问题与我的不成比例。 反对者!如果这个问题值得被否决并被关闭,请给我一个理由? @TheLittleNaruto...有时我想知道这里是否有一些人只是为了好玩而投反对票。我看到很多次投票的问题,没有解释评论,也没有理由...... 他们只能是没有经验的用户。 @Opiatefuchs 你能解决这个问题吗?因为我得到了类似的错误。但是当我尝试从备份中导入以前版本的程序时发生了这种情况。 【参考方案1】:更新
看了半天,原来肯定和proguard有关系。我不能真正说出错误的确切原因,但我尝试了一点,这就是我注意到的(在我使用 Eclipse IDE 的情况下):
我必须关闭我要签名的项目中的每个选项卡 我必须清理项目,清理后,除了导出 apk 什么都不做 在清单中进行小幅更改,保存并撤消更改(并保存) 如果清单中有任何名为“YourClass”或“.YourClass”的类,请将其更改为“com.yourpackage.yourClass”这就是我所做的四点,然后它奏效了。这看起来很可疑,但我认为混淆存在问题。因为不做这些点,我可以简单地编译我的apk并从eclipse安装它。对我来说,这种行为没有明显的原因。 如果我只从 Eclipse 安装它,包名称也可以在不改变的情况下工作。 我希望这些观点可以帮助某人。
【讨论】:
我遇到了同样的问题,基于我得出了同样的结论:proguard。特别是因为我的非签名调试版本工作得很好。有趣的副作用:搞砸的签名构建导致同一个应用程序的两个图标!仍在努力寻找解决方案。我正在使用 Android Studio 您的意思是在您设备的应用抽屉中安装了两个应用吗? 只安装了一个应用程序 - 但您可以在应用程序启动器中看到两个应用程序图标。正如我最初假设的那样(或至少不完全),问题与 proguard 无关 - 重复的图标和丢失的类是由以特定风格覆盖 AndroidManifest.xml 并具有两个启动器活动 xD 引起的。我仍然对 proguard 有问题,但我想这只是现在找到正确的配置。谢谢你回复我:)! 这对我有用,我只需要将完整的类名添加到我的自定义应用程序类中。此错误仅在将项目移动到我的本地硬盘驱动器后发生。 @Peter....这很有趣。好吧,我的项目并非如此,但无论如何都很好知道。【参考方案2】:如果你的清单包名没问题, 如果你关闭了项目, 并在文件资源管理器中重命名您的项目 但是在导入一个之后你又遇到了这个问题 这里唯一的方法是
删除该文件夹 .gradle。
这个可以使用文件资源管理器在项目文件夹中找到。 它具有包含该旧项目名称的工件文件。 在 Android Studio 中重新打开项目后,文件夹将自动重新创建。
【讨论】:
哇。这是一个非常具体的问题,你有一个答案!非常感谢!【参考方案3】:我刚把我的gradle从com.android.tools.build:gradle:2.2.2改成了com.android.tools.build:gradle:2.2.0,问题就解决了!
【讨论】:
你太棒了!【参考方案4】:对我来说,它发生在包名称(目录名称)更改时。
我意识到“构建”文件夹神奇地维护了项目构建的中间文件。 我删除了“app”文件夹下的“build”文件夹。现在 gradle 必须用新的包名重新制作所有文件。现在它可以正常工作了。
【讨论】:
【参考方案5】:tl;dr: 这似乎是由AndroidManifest.xml
中的相对声明和绝对声明混合引起的。我认为最好的解决方案是在您的AndroidManifest.xml
中声明<application .../>
、<activity .../>
、<receiver .../>
和<service .../>
时使用相对符号。
完整解释:
我遇到这个问题太久了,这是因为我在 AndroidManifest.xml
中同时使用了绝对和相对 <application .../>
、<activity .../>
、<receiver .../>
和 <service .../>
声明。这是我为修复它所做的:
在您的AndroidManifest.xml
中确保<manifest .../>
部分的package:
属性指定正确,它需要是确切的绝对路径,如下所示:
<manifest
package="com.my.absolute.package.path"
xmlns:android="http://schemas.android.com/apk/res/android">...</manifest>
现在您已经在 <manifest .../>
部分中指定了正确的绝对路径,您需要为定义在你的AndroidManifest.xml
。
示例:
<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".activity.SomeActivity"
android:configChanges="orientation"
android:label="@string/app_name"
android:parentActivityName=".activity.ParentActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.ParentActivity"/>
</activity>
<activity
android:name=".activity.MyActivity"
android:configChanges="orientation"
android:label="@string/app_name"
android:parentActivityName=".activity.ParentActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme"
/>
<receiver
android:name=".receivers.MyReceiver"
android:enabled="true"
android:exported="false">
</receiver>
<service
android:name=".services.MyService"
android:enabled="true"
android:exported="false"
/>
</application>
当然,也一定要清理你的项目。
【讨论】:
【参考方案6】:如果您有多个模块,我认为这与 multidex 和多个包名称有关。清理项目并删除所有 build/ 文件夹。
【讨论】:
【参考方案7】:有时当我们生成签名的apk文件时,如果我们有一些依赖库问题(重复的jar库),那么就会发生这个错误。请检查构建路径并删除重复库,并检查是否有任何库未从订单和导出选项卡中检查。
【讨论】:
你所说的~"检查构建路径"是什么意思?如何检查?【参考方案8】:原因是,android无法在dexpath中找到具体的activity。
所以我们应该在“Manifest 文件”中提供活动的完整路径。
例如,您的活动名称是“SplashActivity”,它位于“com.packagename.package”中。所以我们应该提供该活动的完整包名。
com.packagename.package.SplashActivity
【讨论】:
【参考方案9】:我遇到了类似的问题,这是我的解决方案:
-
将 AndroidManifest 中的应用名称更改为完整路径
清理项目
重建项目
构建 APK
【讨论】:
【参考方案10】:我加了
compile "com.android.support:support-core-utils:25.3.1"
compile 'com.android.support:support-v4:25.3.1'
【讨论】:
【参考方案11】:通过简单地重命名目录名称并导入来更改我的目录名称后,我得到了类似的错误。不能再安装了。重新启用 USB 调试和重建项目都不起作用。
我通过创建新项目并手动将所有相关内容复制到新项目来解决它。
【讨论】:
这可能是一项漫长的任务。尝试删除 app/build 文件夹。它对我有用。以上是关于ClassNotFoundException:在路径上找不到类:DexPathList的主要内容,如果未能解决你的问题,请参考以下文章
ClassNotFoundException-.BaseDexClassLoader.findClass
java.lang.ClassNotFoundException 运行 jar 文件时 Spring Boot 中的 java.lang.ClassNotFoundException - 添加库
ClassNotFoundException:org.sqlite.JDBC