重构包名时,由于找不到Application类,即使Application类在那里,也会出现ClassNotFoundException异常,从而破坏App。

问题描述 投票:3回答:5

I 这个包的格式。

com
  example
    name
      oldAppName

现在我重构并通过Shift+F6重命名为 这个。

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在Manifest中,它被正确地定义。我尝试和做的是。

  • 清洁和重建
  • 改变 applicationId 在build.gradle中
  • manifest中的包名是正确的,App和Activities的名字也都是正确的。

事实上,这是我的应用程序清单标签。

<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.access$1500(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.access$1500(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.access$1500(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.access$1500(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.access$1500(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) 
android android-studio refactoring packages classnotfoundexception
5个回答
5
投票

有时候。禁用即时运行 会解决这个问题。

或者,如果禁用即时运行没有工作问题可能是Android Studio还没有识别到这些变化。先备份你的项目 并注意在这之后你将不得不重新配置你的VCS(但不会丢失提交或分支,只是丢失你的VCS注册)。

删除你的应用程序的.idea和[yourProjectName].iml。


对于未来的用户来说。


在Android Studio中重命名包的正确方法

  1. 在您的项目窗格中,选择齿轮图标。
  2. 取消勾选"紧凑的空中间包装"如果检查。

Gear icon example

  1. 现在继续 重构->重命名 对于每一个被分解的包名(基本上是com,example,name,oldAppName)
  2. 重命名可能会打开一个警告对话框,你可能需要选择 重命名包

Warning dialog example

  1. 重命名包后,替换 applicationId 替换成正确的

  2. 同步gradle

  3. 清修

你可以找到一个更好的版本来说明如何正确重构你的包。此处

P.S:你必须在没有得到 "ClassNotFound "异常的地方恢复到原来的包名,然后尝试上面的解决方案。


3
投票

对于来到这里的人来说,至少在Android Gradle插件2.2.3版本中,有一个bug会积极缓存一个由即时运行用来检索你的应用id和应用类的工件。你可以通过以下方法来解决这个问题 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

这将修复这个问题,直到下一次应用idpackage重命名。

详情请看这里 code.google.compandroidissuesdetail?id=229128#c8。


0
投票

我在重构一个java类后遇到了类似的问题,我通过清理项目结构解决了这个问题。

  1. 进入Build
  2. 单击 "清理项目 "选项

在这之后,一切都得到了解决。


0
投票

在做一个干净的构建之前,请检查以下内容,以确保以下所有内容都已更新为新的类名。

  1. 目录上的类名。MainActivity
  2. class: public class MainActivity extends ......。
  3. Manifest.MainActivity
  4. XML: tools:context=".MainActivity"

之后,你做一个干净的buildrebuild。


0
投票

重构一个基于Qt的Android应用的名称。

对于那些来到这里的人,当他们在试图重命名一个基于Qt的Android应用程序时,看到了完全相同的错误信息:要重命名它,只需在你的应用程序中调整以下XML属性即可。AndroidManifest.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" …>

<!-- no idea where this will show up -->
<activity … android:label="appname" …>

不要碰下面的属性,因为那会导致这里描述的症状。

<application … android:name="org.qtproject.qt5.android.bindings.QtApplication" …>

<activity … android:name="org.qtproject.qt5.android.bindings.QtActivity" …>

原因是在安卓的Qt应用程序中,你没有定义安卓活动来启动你的。main.cpp 或什么的。相反,该程序 anroiddeployqt 生成bootstrap Java代码,最终从 main.cpp. 该bootstrap代码需要应用程序和活动名称,如上图所示。但你可以改变它们的标签(显示名称)--见上文。

© www.soinside.com 2019 - 2024. All rights reserved.