由于找不到应用程序 class,重构包名称会导致应用程序出现 ClassNotFoundException,即使它存在
Refactoring package name breaks app with ClassNotFoundException due to not finding the Application class even though it is there
我有这个包格式:
com
example
name
oldAppName
现在,我通过Shift+F6重构重命名为this:
com
myCompanyName
name
newAppName
但是,现在当我 运行 我的应用程序时,我遇到了这个崩溃:
java.lang.ClassNotFoundException: Didn't find class "com.example.name.oldAppName.Application" on path: DexPathList[[zip file "/data/app/com.myCompanyName.name.newAppName1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
我的 Application.java
在 newAppName
下,它在清单中正确定义
我尝试和做的是:
- 清理和重建
- 在 build.gradle
中更改 applicationId
- 清单中的包名称正确,所有应用程序和活动的名称也正确。
事实上,这是我的应用程序清单标签:
<application
android:name=".Application"
...
>
即使将 .Application
更改为完整的包名称 (com.blah.blah.Application
) 也行不通。
我错过了什么吗?是否缺少步骤?
完整日志如下:
java.lang.RuntimeException: Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication: java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
at android.app.LoadedApk.makeApplication(LoadedApk.java:516)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:220)
at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
at android.app.Application.attach(Application.java:181)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:992)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209)
at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
at android.app.Application.attach(Application.java:181)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:992)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: com.example.name.oldAppName/Application
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209)
at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
at android.app.Application.attach(Application.java:181)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:992)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.name.oldAppName.Application" on path: DexPathList[[zip file "/data/app/com.newCompanyName.name.newAppName-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.myCompanyName.name.newAppName-1, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209)
at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
at android.app.Application.attach(Application.java:181)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:992)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
有时,禁用 Instant 运行 可以解决问题。
或者,如果禁用 Instant 运行 不起作用,问题可能出在 Android Studio 尚未识别更改。 首先备份您的项目并注意在此之后您必须重新配置您的 VCS(但不会丢失任何提交或分支,只会丢失您的 VCS 的注册。)
删除您应用的 .idea 和 [yourProjectName].iml。
对于未来的用户:
在 Android Studio 中重命名包的正确方法
- 在您的“项目”窗格中,选择齿轮图标
- 取消选中“压缩空中间包”(如果已选中)。
- 现在继续 refactor->rename 为每个分解的包名称(本质上是 com、example、name、oldAppName)
- 重命名可能会打开一个警告对话框,您可能必须在其中选择 重命名包
包重命名完成后,将 gradle 中的 applicationId
替换为正确的
同步gradle
清理并重建
您可以找到有关如何正确重构包的更好版本here
P.S: 你必须在你没有得到“ClassNotFound”异常的地方恢复到原来的包名并尝试上面的解决方案。
对于那些来到这里的人,至少在 Android Gradle 插件版本 2.2.3 中,存在一个 bug 积极缓存即时 运行 检索您的应用程序 ID 和申请 class。您可以通过执行 rm -rf ~/.android/build-cache
解决此问题,然后进行干净重建,然后启动您的应用程序。
有一种方法可以通过 find ~/.android/build-cache -type f | xargs grep -l AppInfo
并只删除匹配的缓存文件夹来限制删除:
$ find ~/.android/build-cache -type f | xargs grep -l AppInfo
/Users/joe/.android/build-cache/dde3e201178401491cae141d479a0b4113bf3a0e/output/classes.dex
/Users/joe/.android/build-cache/f7d636c8af71d68edfb468297d20157f3eb6659c/output/classes.dex
$ rm -rf /Users/joe/.android/build-cache/dde3e201178401491cae141d479a0b4113bf3a0e
$ rm -rf /Users/joe/.android/build-cache/f7d636c8af71d68edfb468297d20157f3eb6659c
这将解决问题,直到下一个应用程序 id/package 重命名。
在此处查看详细信息code.google.com/p/android/issues/detail?id=229128#c8
我在重构我的 java class 之一后遇到了类似的问题,我通过清理项目结构解决了它。
- 转到构建
- 点击清理项目选项
之后,一切都解决了。
在进行全新构建之前,请检查以下内容以确保以下所有内容都已更新为新的 class 名称。
- class 目录中的名称:MainActivity
- class:public class MainActivity 扩展....
- 清单:
- XML: tools:context=".MainActivity"
之后,你做一个干净的build/rebuild。
重构基于 Qt 的 Android 应用的名称
对于那些在尝试重命名基于 Qt 的 Android 应用程序时看到完全相同的错误消息后来到这里的人:要重命名它,只需在 AndroidManifest.xml
中调整以下 XML 属性:
<!-- application package name as seen in Google Play URLs,
in the output of `adb shell pm list packages` etc. -->
<manifest package="com.example.appname" …>
<!-- application name as shown below the app icon -->
<application … android:label="App Name" …>
<!-- application name "sometimes" shown below the app icon -->
<activity … android:label="appname" …>
请勿触摸以下属性,因为这会导致此处描述的症状:
<application … android:name="org.qtproject.qt5.android.bindings.QtApplication" …>
<activity … android:name="org.qtproject.qt5.android.bindings.QtActivity" …>
原因是在 Android 的 Qt 应用程序中,您没有定义要在 main.cpp
中启动的 Android activity 或其他内容。相反,程序 anroiddeployqt
生成 bootstrap Java 代码,最终从 main.cpp
调用您的 C++ 代码。 bootstrap 代码需要应用程序和 activity 名称,如上所示。但是您可以更改他们的标签(显示名称)——见上文。
我有这个包格式:
com
example
name
oldAppName
现在,我通过Shift+F6重构重命名为this:
com
myCompanyName
name
newAppName
但是,现在当我 运行 我的应用程序时,我遇到了这个崩溃:
java.lang.ClassNotFoundException: Didn't find class "com.example.name.oldAppName.Application" on path: DexPathList[[zip file "/data/app/com.myCompanyName.name.newAppName1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
我的 Application.java
在 newAppName
下,它在清单中正确定义
我尝试和做的是:
- 清理和重建
- 在 build.gradle 中更改
- 清单中的包名称正确,所有应用程序和活动的名称也正确。
applicationId
事实上,这是我的应用程序清单标签:
<application
android:name=".Application"
...
>
即使将 .Application
更改为完整的包名称 (com.blah.blah.Application
) 也行不通。
我错过了什么吗?是否缺少步骤?
完整日志如下:
java.lang.RuntimeException: Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication: java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
at android.app.LoadedApk.makeApplication(LoadedApk.java:516)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:220)
at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
at android.app.Application.attach(Application.java:181)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:992)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209)
at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
at android.app.Application.attach(Application.java:181)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:992)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: com.example.name.oldAppName/Application
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209)
at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
at android.app.Application.attach(Application.java:181)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:992)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.name.oldAppName.Application" on path: DexPathList[[zip file "/data/app/com.newCompanyName.name.newAppName-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.myCompanyName.name.newAppName-1, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209)
at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
at android.app.Application.attach(Application.java:181)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:992)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
at android.app.ActivityThread.access00(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
有时,禁用 Instant 运行 可以解决问题。
或者,如果禁用 Instant 运行 不起作用,问题可能出在 Android Studio 尚未识别更改。 首先备份您的项目并注意在此之后您必须重新配置您的 VCS(但不会丢失任何提交或分支,只会丢失您的 VCS 的注册。)
删除您应用的 .idea 和 [yourProjectName].iml。
对于未来的用户:
在 Android Studio 中重命名包的正确方法
- 在您的“项目”窗格中,选择齿轮图标
- 取消选中“压缩空中间包”(如果已选中)。
- 现在继续 refactor->rename 为每个分解的包名称(本质上是 com、example、name、oldAppName)
- 重命名可能会打开一个警告对话框,您可能必须在其中选择 重命名包
包重命名完成后,将 gradle 中的
applicationId
替换为正确的同步gradle
清理并重建
您可以找到有关如何正确重构包的更好版本here
P.S: 你必须在你没有得到“ClassNotFound”异常的地方恢复到原来的包名并尝试上面的解决方案。
对于那些来到这里的人,至少在 Android Gradle 插件版本 2.2.3 中,存在一个 bug 积极缓存即时 运行 检索您的应用程序 ID 和申请 class。您可以通过执行 rm -rf ~/.android/build-cache
解决此问题,然后进行干净重建,然后启动您的应用程序。
有一种方法可以通过 find ~/.android/build-cache -type f | xargs grep -l AppInfo
并只删除匹配的缓存文件夹来限制删除:
$ find ~/.android/build-cache -type f | xargs grep -l AppInfo
/Users/joe/.android/build-cache/dde3e201178401491cae141d479a0b4113bf3a0e/output/classes.dex
/Users/joe/.android/build-cache/f7d636c8af71d68edfb468297d20157f3eb6659c/output/classes.dex
$ rm -rf /Users/joe/.android/build-cache/dde3e201178401491cae141d479a0b4113bf3a0e
$ rm -rf /Users/joe/.android/build-cache/f7d636c8af71d68edfb468297d20157f3eb6659c
这将解决问题,直到下一个应用程序 id/package 重命名。
在此处查看详细信息code.google.com/p/android/issues/detail?id=229128#c8
我在重构我的 java class 之一后遇到了类似的问题,我通过清理项目结构解决了它。
- 转到构建
- 点击清理项目选项
之后,一切都解决了。
在进行全新构建之前,请检查以下内容以确保以下所有内容都已更新为新的 class 名称。
- class 目录中的名称:MainActivity
- class:public class MainActivity 扩展....
- 清单:
- XML: tools:context=".MainActivity"
之后,你做一个干净的build/rebuild。
重构基于 Qt 的 Android 应用的名称
对于那些在尝试重命名基于 Qt 的 Android 应用程序时看到完全相同的错误消息后来到这里的人:要重命名它,只需在 AndroidManifest.xml
中调整以下 XML 属性:
<!-- application package name as seen in Google Play URLs,
in the output of `adb shell pm list packages` etc. -->
<manifest package="com.example.appname" …>
<!-- application name as shown below the app icon -->
<application … android:label="App Name" …>
<!-- application name "sometimes" shown below the app icon -->
<activity … android:label="appname" …>
请勿触摸以下属性,因为这会导致此处描述的症状:
<application … android:name="org.qtproject.qt5.android.bindings.QtApplication" …>
<activity … android:name="org.qtproject.qt5.android.bindings.QtActivity" …>
原因是在 Android 的 Qt 应用程序中,您没有定义要在 main.cpp
中启动的 Android activity 或其他内容。相反,程序 anroiddeployqt
生成 bootstrap Java 代码,最终从 main.cpp
调用您的 C++ 代码。 bootstrap 代码需要应用程序和 activity 名称,如上所示。但是您可以更改他们的标签(显示名称)——见上文。