最近,当我打算在家中使用装有 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
删除了
build
和app/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“配置”。
- 将
compile 'com.android.support:multidex:1.0.1'
添加到应用程序 gradle 文件中的依赖项列表中。 从 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/