java - Android 项目中的 ClassNotFoundException 仅在我的 PC 上

标签 java android kotlin noclassdeffounderror classnotfoundexception

最近,当我打算在家中使用装有 Windows 8.1 的 PC 完成我的工作时,我发现该项目无法正常运行 - 它编译,在模拟器上运行并在某个特定点崩溃(它是在我的 PC 上 100% 可重现)。

但是,相同的存储库修订版适用于工作中的 Mac 和我同事的 Windows 10 计算机。

每个提到的环境都使用 Android Studio 2.3.1、gradle 3.3 和 Kotlin 1.1.1,并在 API 25 x86_64 图像上运行应用程序。

该项目正在使用 multidex 1.0.1 库。

崩溃是由于以下异常导致的:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.project.app, PID: 2533
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/project/package/SomeActivityKt$sam$Action1$22181393;
        at com.project.package.SomeActivity.getDataFor(SomeActivity.kt:164)
        at com.project.package.SomeActivity.getData(SomeActivity.kt:147)
        at com.project.package.SomeActivity.onResume(SomeActivity.kt:142)
        at android.app.Instrumentatcomn.callActivityOnResume(Instrumentatcomn.java:1269)
        at android.app.Activity.performResume(Activity.java:6783)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3406)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3469)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2732)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.project.package.SomeActivityKt$sam$Action1$22181393" on path: DexPathList[[zip file "/data/app/com.project.app-1/base.apk", zip file "/data/app/com.project.app-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.project.app-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.project.app-1/lib/x86_64, /data/app/com.project.app-1/base.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_dependencies_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_0_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_1_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_2_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_3_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_4_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_5_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_6_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_7_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_8_apk.apk!/lib/x86_64, /data/app/com.project.app-1/split_lib_slice_9_apk.apk!/lib/x86_64, /system/lib64, /vendor/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.project.package.SomeActivity.getDataFor(SomeActivity.kt:164) 
        at com.project.package.SomeActivity.getData(SomeActivity.kt:147) 
        at com.project.package.SomeActivity.onResume(SomeActivity.kt:142) 
        at android.app.Instrumentatcomn.callActivityOnResume(Instrumentatcomn.java:1269) 
        at android.app.Activity.performResume(Activity.java:6783) 
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3406) 
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3469) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2732) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 

BaseActivity.kt

abstract class BaseActivity : RxAppCompatActivity(), HasErrorHandler (...)

SomeActivity.kt - 崩溃

class SomeActivity : BaseActivity(), HasFullWindowProgress (...) {

    (...)

    private fun getDataFor(id: String) {

        apiClient.somethingList(id)
                .map { response -> response.toSomethingList() }
                .lifecycle(this)
                .showProgress(this)
                .observeOnMainThread() // <== line 164
                .subscribe({
                    LOG.info("Something list fetched ${it.size}")
                    adapter.setItems(it)

                }, defaultOnError("Fetching something list failed"))
    }
}

AnotherActivity.kt - 使用与 SomeActivity 相同的功能并且不会崩溃

class AnotherActivity : BaseActivity(), HasFullWindowProgress (...) {

    (...)

    private fun getData() {
        somethingElse.user?.id?.let { id ->

            apiClient.somethingElseList()
                    .map { response -> response.toAnotherList(id) }
                    .lifecycle(this)
                    .showProgress(this)
                    .observeOnMainThread()
                    .subscribe({
                        onNewSomethingElseList(id, it)
                    }, defaultOnError("Fetching somethingElseList for somethingElse failed"))
        }

    }
}

ActivityErrorHandlingExtensions.kt

fun <T> T.defaultOnError(message: String, vararg args: Any?): (Throwable) -> Unit where T : HasErrorHandler, T : Activity {
    val targetClass = javaClass
    val activity = this
    return { err ->
        val messageFormats = (args.toList() + err).toTypedArray()
        LoggerFactory.getLogger(targetClass).error(message, *messageFormats)
        errorHandler.default(err, activity)
    }
}

ObservableExtensions.kt

fun <T> Observable<T>.lifecycle(activity: RxAppCompatActivity) : Observable<T> {
    return compose(activity.bindToLifecycle<T>())
}

fun <T> Observable<T>.observeOnMainThread() : Observable<T> {
    return observeOn(AndroidSchedulers.mainThread())
}

Progress.kt

fun <T> Observable<T>.showProgress(hasProgress: HasFullWindowProgress): Observable<T> {
    return compose {
        it.doOnSubscribe {
            MAIN_THREAD_WORKER.schedule {
                hasProgress.fullWindowProgress.visibility = View.VISIBLE
            }
        }.doAfterTerminate {
            MAIN_THREAD_WORKER.schedule {
                hasProgress.fullWindowProgress.visibility = View.GONE
            }
        }
    }
}

所有这些代码都在项目中存在了一两个多月,两周前它在我的电脑上运行。

我已经尝试过的:

  • ./gradlew cleanBuildCache

  • 删除$HOME/.gradle/caches

  • 删除$HOME/.android/build-cache

  • 删除$HOME/.AndroidStudio2.3/system/caches

  • 删除了 buildapp/build 目录

  • 删除项目根目录下的.gradle目录

  • Android Studio 使缓存失效并重启

  • 从模拟器中手动卸载应用程序并重新安装

  • 重新安装 Android Studio 2.3.1

  • 将 Android Studio 降级到 2.3(这是我 2 周前使用的版本,我知道它当时可以用)

知道这里出了什么问题吗?


getDataFor 方法的 Kotlin 字节码:

  private final getDataFor(Ljava/lang/String;)V
   L0
    LINENUMBER 160 L0
   L1
    LINENUMBER 165 L1
   L2
    LINENUMBER 160 L2
   L3
    LINENUMBER 164 L3
   L4
    LINENUMBER 160 L4
   L5
    LINENUMBER 163 L5
   L6
    LINENUMBER 160 L6
   L7
    LINENUMBER 162 L7
   L8
    LINENUMBER 160 L8
   L9
    LINENUMBER 161 L9
   L10
    LINENUMBER 160 L10
    ALOAD 0
    GETFIELD com/project/package/SomeActivity.apiClient : Lcom/project/network/ApiClient;
    DUP
    IFNONNULL L11
    LDC "apiClient"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.throwUninitializedPropertyAccessException (Ljava/lang/String;)V
   L11
    ALOAD 1
    INVOKEVIRTUAL com/project/network/ApiClient.somethingList (Ljava/lang/String;)Lrx/Observable;
    GETSTATIC com/project/package/SomeActivity$getDataFor$1.INSTANCE : Lcom/project/package/SomeActivity$getDataFor$1;
    CHECKCAST rx/functions/Func1
   L12
    LINENUMBER 161 L12
    INVOKEVIRTUAL rx/Observable.map (Lrx/functions/Func1;)Lrx/Observable;
    ALOAD 0
    CHECKCAST com/trello/rxlifecycle/components/support/RxAppCompatActivity
   L13
    LINENUMBER 162 L13
    INVOKESTATIC com/project/extensions/ObservableExtensionsKt.lifecycle (Lrx/Observable;Lcom/trello/rxlifecycle/components/support/RxAppCompatActivity;)Lrx/Observable;
    ALOAD 0
    CHECKCAST com/project/widgets/HasFullWindowProgress
   L14
    LINENUMBER 163 L14
    INVOKESTATIC com/project/widgets/ProgressKt.showProgress (Lrx/Observable;Lcom/project/widgets/HasFullWindowProgress;)Lrx/Observable;
   L15
    LINENUMBER 164 L15
    INVOKESTATIC com/project/extensions/ObservableExtensionsKt.observeOnMainThread (Lrx/Observable;)Lrx/Observable;
    NEW com/project/package/SomeActivity$getDataFor$2
    DUP
    ALOAD 0
    INVOKESPECIAL com/project/package/SomeActivity$getDataFor$2.<init> (Lcom/project/package/SomeActivity;)V
    CHECKCAST rx/functions/Action1
    NEW com/project/package/SomeActivityKt$sam$Action1$22181393
    DUP
    ALOAD 0
    LDC "Fetching something list failed"
    ICONST_0
    ANEWARRAY java/lang/Object
    INVOKESTATIC com/project/extensions/ActivityErrorHandlingExtensionsKt.defaultOnError (Landroid/app/Activity;Ljava/lang/String;[Ljava/lang/Object;)Lkotlin/jvm/functions/Function1;
    DUP
    IFNONNULL L16
    POP
    POP2
    ACONST_NULL
    GOTO L17
   L16
    INVOKESPECIAL com/project/package/SomeActivityKt$sam$Action1$22181393.<init> (Lkotlin/jvm/functions/Function1;)V
   L17
    CHECKCAST rx/functions/Action1
   L18
    LINENUMBER 165 L18
    INVOKEVIRTUAL rx/Observable.subscribe (Lrx/functions/Action1;Lrx/functions/Action1;)Lrx/Subscription;
    POP
   L19
    LINENUMBER 170 L19
    RETURN
   L20
    LOCALVARIABLE this Lcom/project/package/SomeActivity; L0 L20 0
    LOCALVARIABLE id Ljava/lang/String; L0 L20 1
    MAXSTACK = 7
    MAXLOCALS = 2

最佳答案

几周前我遇到了类似的问题。这基本上是我为避免 ClassNotFoundException 所做的,在我的例子中是由于更新 Android Studio、gradle 等后的 Multidex“配置”。

  1. compile 'com.android.support:multidex:1.0.1' 添加到应用程序 gradle 文件中的依赖项列表中。
  2. 从 Application 类的 onCreate() 方法中删除 Multidex.install(this); 并在您的 Application 类中添加以下内容:

    @Override
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        MultiDex.install(this);
    }
    

我在更新 gradle 版本等后收到错误,因此请确保您也已更新所有内容。

希望对您有所帮助。

关于java - Android 项目中的 ClassNotFoundException 仅在我的 PC 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43264981/

相关文章:

java - Wildfly:org.jboss.as.controller.registry.FastCopyHashMap

Java - 内联代码会有好处吗?

android - 在 React Native 中实现通话录音

android - Box2D(LibGDX) - 球的奇怪行为

Android 数据绑定(bind) : how to get field value of kotlin enum class?

android - 将对象发送到另一个 fragment 后进行更改

java - 线程 "main"java.lang.UnsupportedClassVersionError : Bad version number in . 类文件中的 Tinyos 异常

console - 如何将控制台与 Java 应用程序关联起来?

java - java中的泛型,扩展接口(interface)

Kotlin 编译器 : `nop` s in bytecode