清除数据/缓存后抛出ClassNotFoundException-第二次运行正常

时间:2018-11-26 17:32:49

标签: android

我正在处理的应用程序显示出一种奇怪的症状-如果清理应用程序的数据和缓存,则该应用程序将在第一次下一次运行时崩溃,但是在第二次运行时它将正常运行。是否有人知道会发生什么情况以及如何解决它。

我已经做了:

  1. 删除所有构建目录并重新构建
  2. 禁用即时运行
  3. 检查该类是否在apk中
  4. 在多部电话上将其疲劳-行为均相同

可悲的是没有帮助...

我正在使用最新的Android Studio 3.2.1。编译和目标SDK为28,最小为21。该应用程序用Kotlin编写。支持库为28.0.0,构建工具为28.0.3。

第一次运行时抛出的异常(更改应用程序名称以保护无辜者):

2018-11-26 18:18:38.780 17135-17135/com.myapp.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.myapp.app, PID: 17135
    java.lang.RuntimeException: Unable to instantiate service service.ServerNotificationService: java.lang.ClassNotFoundException: Didn't find class "service.ServerNotificationService" on path: DexPathList[[zip file "/data/app/com.myapp.app-YIEEjJIdfXs58PSDfpg4Ew==/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.app-YIEEjJIdfXs58PSDfpg4Ew==/lib/arm64, /data/app/com.myapp.app-YIEEjJIdfXs58PSDfpg4Ew==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:3459)
        at android.app.ActivityThread.-wrap4(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "service.ServerNotificationService" on path: DexPathList[[zip file "/data/app/com.myapp.app-YIEEjJIdfXs58PSDfpg4Ew==/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.app-YIEEjJIdfXs58PSDfpg4Ew==/lib/arm64, /data/app/com.myapp.app-YIEEjJIdfXs58PSDfpg4Ew==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:3456)
        at android.app.ActivityThread.-wrap4(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6710) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770) 

1 个答案:

答案 0 :(得分:0)

所以我设法修复了它。这与Android工具如何合并 AndroidManifest.xml 文件有关。

让我解释一下(后代):

我正在构建的应用程序由一个核心组成-它是一个android库和实际的应用程序。类 service.ServerNotificationService 是该库的一部分,并在该库的 AndroidManifest.xml 中声明为:

<service android:name="service.ServerNotificationService" />

这是正确的,并且该应用程序将运行-只是不使用干净的缓存(我仍然不了解这部分,但是我认为它与黑魔法有关,即Android ART)。为了解决该问题,我将行更改为:

<service android:name="com.myapp.app.core.service.ServerNotificationService" />

该类的全名。此处吸取的教训是始终在库中使用完整的类名...