Java 仅在我的电脑上的Android项目中ClassNotFoundException
最近,当我准备在家里用Windows8.1在我的电脑上完成我的工作时,我发现这个项目不能正常工作——它编译,在模拟器上运行,并在某个特定点崩溃(它在我的电脑上是100%可复制的) 然而,同样的存储库版本在Mac电脑和我的同事的Windows 10机器上都可以使用 提到的每个环境都使用Android Studio 2.3.1、gradle 3.3和Kotlin 1.1.1,并在API 25 x86_64映像上运行应用程序 该项目正在使用multidex 1.0.1库 发生崩溃是由于以下异常:Java 仅在我的电脑上的Android项目中ClassNotFoundException,java,android,kotlin,noclassdeffounderror,classnotfoundexception,Java,Android,Kotlin,Noclassdeffounderror,Classnotfoundexception,最近,当我准备在家里用Windows8.1在我的电脑上完成我的工作时,我发现这个项目不能正常工作——它编译,在模拟器上运行,并在某个特定点崩溃(它在我的电脑上是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/
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
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"))
}
}
ActivityErrorHandlingExtensions.kt
几周前我遇到了类似的问题。下面是我为避免出现
ClassNotFoundException
而做的基本操作,在我的例子中,这是由于在更新androidstudio、gradle等之后的Multidex“配置”
compile'com.android.support:multidex:1.0.1'
添加到应用程序gradle文件中的依赖项列表中Multidex.install(此)使用应用程序类的onCreate()
方法编写>并在应用程序类中添加以下内容:
@Override
protected void attachBaseContext(Context context) {
super.attachBaseContext(context);
MultiDex.install(this);
}
希望有帮助。我没有在
onCreate()
中调用Multidex.install(this)
,因为我的App
类继承了MultiDexApplication
类的这种行为(attachBaseContext
已经在那里实现)。所以我只添加了覆盖(这可能是多余的)。不幸的是,这根本没有帮助。它仍然在SomeActivity
中崩溃(这不是我的应用程序中启动的第一个,顺便说一句)。你能为问题活动发布“工具->Kotlin->显示Kotlin字节码”的输出吗?@VyacheslavGerasimov请查看更新。我已经发布了getDataFor
字节码。如果您需要更多,请告诉我,因为我不想花一整天的时间混淆所有2.5k行字节码:)字节码中是否有名为com/project/package/SomeActivityKt$sam$Action1$22181393
的类?我想应该为传递给subscribe方法的lambda生成它。根据我的理论,它可能是用错误的名称生成的。如果它的名称正确,请尝试重新安装android SDK,如果您还没有安装的话。也许构建工具有问题。@VyacheslavGerasimov没有这样的类。我在寻找任何包含22181393
,SomeActivityKt
或sam
的内容,我在这里发布的片段中只有两个位置。这真的很奇怪,因为我可以在AnotherActivity.kt
getData
中看到为代码生成的类似类:最终类com/project/package/AnotherActivityKt$sam$Action1$1c16c27d实现了rx/functions/Action1
。所以我想它根本不是为SomeActivity
生成的。有了这些信息,您认为重新安装SDK会有帮助吗?
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"))
}
}
}
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)
}
}
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())
}
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
}
}
}
}
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
@Override
protected void attachBaseContext(Context context) {
super.attachBaseContext(context);
MultiDex.install(this);
}