ClassNotFoundException:在路径上找不到 class:DexPathList
ClassNotFoundException: Didn't find class on path: DexPathList
我在 Playstore 上更新我的应用程序后遇到了问题。自从这次更新以来,抛出了异常,但我没有更改任何与此异常相关的内容。
堆栈跟踪:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{de.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.access0(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
事实是,我之前的应用程序版本运行没有问题,而且我没有更改任何与此相关的内容 activity。我刚刚添加了一个与此无关的新信息对话框 activity。这个应用程序是一个免费的精简版,我在专业版上做了完全相同的更改,没有任何东西被抛出。这按预期工作。
专业版和精简版之间的唯一区别是,我在精简版中集成了 Admob(以新方式),在专业版中集成了 Google Play 许可证。但是我从一开始就集成了这个并且没有对此进行更改。
我也没有对清单进行任何更改,我在这里阅读了很多帖子,但没有任何帮助。
它似乎只发生在 Android 5.0 之后的版本上。有没有人知道这个问题可能导致什么或有任何相同的经历? proguard 是否有可能通过混淆破坏了任何东西(同样在这里,没有变化)?
我没有发布代码,因为它对这个问题并不重要,就像我说的我没有做与此异常相关的更改。
这个问题被标记为重复,但事实并非如此。 link 的注释没有解决我的问题,所有库都以正确的方式检查和集成。另外,我不使用 NDK。
有时候我们在生成签名apk文件的时候,如果我们有一些依赖库问题(重复的jar库),那么就会出现这个错误。请检查构建路径并删除重复的库,并检查是否有任何库未从订单和导出选项卡中选中。
更新
搞了半天,原来肯定和proguard有关系。我真的不能说错误到底是什么导致的,但我尝试了一点,这就是我注意到的(在我使用 Eclipse IDE 的情况下):
- 我必须关闭我要签署的项目的每个选项卡
- 我必须清理项目,清理后除了导出 apk 什么也不做
- 在清单中做一个小改动,保存并撤消更改(并保存)
- 如果清单中有任何 class 以 "YourClass" 或“.YourClass”命名,请将其更改为 "com.yourpackage.yourClass"
这就是我做的四点,然后就奏效了。这看起来很可疑,但我认为混淆有问题。因为不做这些点,我可以简单地编译我的 apk 并从 eclipse 安装它。对我来说,这种行为没有明显的原因。
如果我只从 eclipse 安装它,包名称也可以在没有更改的情况下工作。
我希望这些观点可以帮助到一些人。
tl;dr: 这似乎是由 AndroidManifest.xml
中混合使用相对和绝对声明引起的。我认为最好的解决方案是在 AndroidManifest.xml
.[=32= 中声明 <application .../>
、<activity .../>
、<receiver .../>
和 <service .../>
时使用相对表示法]
完整说明:
我遇到这个问题太久了,这是因为我在我的文件中同时使用了绝对和相对 <application .../>
、<activity .../>
、<receiver .../>
和 <service .../>
声明AndroidManifest.xml
。这是我修复它的方法:
在 AndroidManifest.xml
中确保 <manifest .../>
部分正确指定了 package:
属性,它需要是准确的绝对路径,如下所示:
<manifest
package="com.my.absolute.package.path"
xmlns:android="http://schemas.android.com/apk/res/android">...</manifest>
现在您在 <manifest .../>
部分中指定了正确的绝对路径,您需要为所有 <application .../>
、<activity .../>
、[=15= 使用相对路径],以及 <service .../>
在您的 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>
当然,也一定要清理你的项目。
如果你有多个模块,我认为这与 multidex 和多个包名称有关。清理项目并删除所有构建/文件夹。
原因是,android 无法在 dexpath 中找到特定的 activity。
所以我们应该提供"Manifest file"中活动的完整路径。
例如,您的 activity 名字是 "SplashActivity",它在“com.packagename.package”中。所以我们应该提供 activity.
的完整包名
com.packagename.package.SplashActivity
我刚把我的gradle从com.android.tools.build:gradle:2.2.2改成了com.android.tools.build:gradle:2.2.0,问题来了很好!
我遇到了类似的问题,这是我的解决方案:
- 将 AndroidManifest 中的应用程序名称更改为完整路径
- 清理项目
- 重建项目
- 构建 APK
我加了
compile "com.android.support:support-core-utils:25.3.1"
compile 'com.android.support:support-v4:25.3.1'
通过简单地重命名目录名称并导入来更改我的目录名称后,我遇到了类似的错误。无法再安装。重新启用 USB 调试和重建项目都不起作用。
我通过创建新项目并手动将所有相关内容复制到新项目来解决。
对我来说,它发生在包名(目录名)被改变的时候。
我意识到 "build" 文件夹神奇地维护了项目构建的中间文件。 我删除了 "app" 文件夹下的 "build" 文件夹。现在 gradle 不得不用新的包名重新制作所有文件。现在可以正常使用了。
如果你的清单包名没问题,
如果你关闭了项目,
并在文件资源管理器中重命名您的项目
但是在导入之后你又遇到了这个问题
这里唯一的方法是
删除该文件夹 。gradle。
可以使用文件资源管理器在项目文件夹中找到这个。
它有包含旧项目名称的工件文件。
在 Android Studio 中重新打开项目后,将自动重新创建文件夹。
我在 Playstore 上更新我的应用程序后遇到了问题。自从这次更新以来,抛出了异常,但我没有更改任何与此异常相关的内容。
堆栈跟踪:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{de.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.access0(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
事实是,我之前的应用程序版本运行没有问题,而且我没有更改任何与此相关的内容 activity。我刚刚添加了一个与此无关的新信息对话框 activity。这个应用程序是一个免费的精简版,我在专业版上做了完全相同的更改,没有任何东西被抛出。这按预期工作。 专业版和精简版之间的唯一区别是,我在精简版中集成了 Admob(以新方式),在专业版中集成了 Google Play 许可证。但是我从一开始就集成了这个并且没有对此进行更改。 我也没有对清单进行任何更改,我在这里阅读了很多帖子,但没有任何帮助。
它似乎只发生在 Android 5.0 之后的版本上。有没有人知道这个问题可能导致什么或有任何相同的经历? proguard 是否有可能通过混淆破坏了任何东西(同样在这里,没有变化)?
我没有发布代码,因为它对这个问题并不重要,就像我说的我没有做与此异常相关的更改。
这个问题被标记为重复,但事实并非如此。 link 的注释没有解决我的问题,所有库都以正确的方式检查和集成。另外,我不使用 NDK。
有时候我们在生成签名apk文件的时候,如果我们有一些依赖库问题(重复的jar库),那么就会出现这个错误。请检查构建路径并删除重复的库,并检查是否有任何库未从订单和导出选项卡中选中。
更新
搞了半天,原来肯定和proguard有关系。我真的不能说错误到底是什么导致的,但我尝试了一点,这就是我注意到的(在我使用 Eclipse IDE 的情况下):
- 我必须关闭我要签署的项目的每个选项卡
- 我必须清理项目,清理后除了导出 apk 什么也不做
- 在清单中做一个小改动,保存并撤消更改(并保存)
- 如果清单中有任何 class 以 "YourClass" 或“.YourClass”命名,请将其更改为 "com.yourpackage.yourClass"
这就是我做的四点,然后就奏效了。这看起来很可疑,但我认为混淆有问题。因为不做这些点,我可以简单地编译我的 apk 并从 eclipse 安装它。对我来说,这种行为没有明显的原因。 如果我只从 eclipse 安装它,包名称也可以在没有更改的情况下工作。 我希望这些观点可以帮助到一些人。
tl;dr: 这似乎是由 AndroidManifest.xml
中混合使用相对和绝对声明引起的。我认为最好的解决方案是在 AndroidManifest.xml
.[=32= 中声明 <application .../>
、<activity .../>
、<receiver .../>
和 <service .../>
时使用相对表示法]
完整说明:
我遇到这个问题太久了,这是因为我在我的文件中同时使用了绝对和相对 <application .../>
、<activity .../>
、<receiver .../>
和 <service .../>
声明AndroidManifest.xml
。这是我修复它的方法:
在 AndroidManifest.xml
中确保 <manifest .../>
部分正确指定了 package:
属性,它需要是准确的绝对路径,如下所示:
<manifest
package="com.my.absolute.package.path"
xmlns:android="http://schemas.android.com/apk/res/android">...</manifest>
现在您在 <manifest .../>
部分中指定了正确的绝对路径,您需要为所有 <application .../>
、<activity .../>
、[=15= 使用相对路径],以及 <service .../>
在您的 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>
当然,也一定要清理你的项目。
如果你有多个模块,我认为这与 multidex 和多个包名称有关。清理项目并删除所有构建/文件夹。
原因是,android 无法在 dexpath 中找到特定的 activity。
所以我们应该提供"Manifest file"中活动的完整路径。
例如,您的 activity 名字是 "SplashActivity",它在“com.packagename.package”中。所以我们应该提供 activity.
的完整包名com.packagename.package.SplashActivity
我刚把我的gradle从com.android.tools.build:gradle:2.2.2改成了com.android.tools.build:gradle:2.2.0,问题来了很好!
我遇到了类似的问题,这是我的解决方案:
- 将 AndroidManifest 中的应用程序名称更改为完整路径
- 清理项目
- 重建项目
- 构建 APK
我加了
compile "com.android.support:support-core-utils:25.3.1"
compile 'com.android.support:support-v4:25.3.1'
通过简单地重命名目录名称并导入来更改我的目录名称后,我遇到了类似的错误。无法再安装。重新启用 USB 调试和重建项目都不起作用。
我通过创建新项目并手动将所有相关内容复制到新项目来解决。
对我来说,它发生在包名(目录名)被改变的时候。
我意识到 "build" 文件夹神奇地维护了项目构建的中间文件。 我删除了 "app" 文件夹下的 "build" 文件夹。现在 gradle 不得不用新的包名重新制作所有文件。现在可以正常使用了。
如果你的清单包名没问题, 如果你关闭了项目, 并在文件资源管理器中重命名您的项目 但是在导入之后你又遇到了这个问题 这里唯一的方法是
删除该文件夹 。gradle。
可以使用文件资源管理器在项目文件夹中找到这个。 它有包含旧项目名称的工件文件。 在 Android Studio 中重新打开项目后,将自动重新创建文件夹。