将 MainActivity 转换为 Kotlin 后的后续构建中出现 ClassNotFoundException

Dam*_*ehl 6 android classnotfoundexception kotlin

我想尝试一下 Kotlin,因此我决定尝试将项目的单个类转换为 Kotlin,并在尝试转换整个项目之前看看它如何与我的工作流程集成。我能够构建并且我的应用程序可以正常工作,但是在第一次构建之后的每个后续构建中,我都会从 ClassLoader 中得到以下异常。该应用程序仅在清洁后才能正常工作,并且在我转换任何内容之前都可以正常工作。我能够在同一台计算机上多次运行 HelloWorld 项目,而不会出现错误。这个问题中的回答没有帮助:ClassNotFoundException in custom Flavor using kotlin

\n\n
07-31 14:35:41.563    1878-1878/com.ddiehl.android.htn.debug\nE/AndroidRuntime\xef\xb9\x95 FATAL EXCEPTION: main\nProcess: com.ddiehl.android.htn.debug, PID: 1878\n    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.ddiehl.android.htn.debug/com.ddiehl.android.htn.view.activities.MainActivity}: java.lang.ClassNotFoundException: Didn\'t find class "com.ddiehl.android.htn.view.activities.MainActivity" on path: DexPathList[[zip file "/data/app/com.ddiehl.android.htn.debug-1/base.apk"],nativeLibraryDirectories=[/data/app/com.ddiehl.android.htn.debug-1/lib/arm, /vendor/lib, /system/lib]]\n            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)\n            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)\n            at android.app.ActivityThread.access$800(ActivityThread.java:144)\n            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)\n            at android.os.Handler.dispatchMessage(Handler.java:102)\n            at android.os.Looper.loop(Looper.java:135)\n            at android.app.ActivityThread.main(ActivityThread.java:5221)\n            at java.lang.reflect.Method.invoke(Native Method)\n            at java.lang.reflect.Method.invoke(Method.java:372)\n            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)\n            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)\n     Caused by: java.lang.ClassNotFoundException: Didn\'t find class "com.ddiehl.android.htn.view.activities.MainActivity" on path: DexPathList[[zip file "/data/app/com.ddiehl.android.htn.debug-1/base.apk"],nativeLibraryDirectories=[/data/app/com.ddiehl.android.htn.debug-1/lib/arm, /vendor/lib, /system/lib]]\n            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)\n            at java.lang.ClassLoader.loadClass(ClassLoader.java:511)\n            at java.lang.ClassLoader.loadClass(ClassLoader.java:469)\n            at android.app.Instrumentation.newActivity(Instrumentation.java:1065)\n            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at android.app.ActivityThread.access$800(ActivityThread.java:144)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at android.os.Handler.dispatchMessage(Handler.java:102)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at android.os.Looper.loop(Looper.java:135)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at android.app.ActivityThread.main(ActivityThread.java:5221)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at java.lang.reflect.Method.invoke(Native Method)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at java.lang.reflect.Method.invoke(Method.java:372)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)\n    Suppressed: java.lang.ClassNotFoundException: com.ddiehl.android.htn.view.activities.MainActivity\n            at java.lang.Class.classForName(Native Method)\n            at java.lang.BootClassLoader.findClass(ClassLoader.java:781)\n            at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)\n            at java.lang.ClassLoader.loadClass(ClassLoader.java:504)\n            ... 13 more\n     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available\n
Run Code Online (Sandbox Code Playgroud)\n\n

任何人都知道为什么我的应用程序可能在第一个构建中工作,但在后续构建中不起作用?这是我的build.gradle、manifest和activity,供参考。

\n\n

build.gradle(应用程序模块)

\n\n
apply plugin: \'com.android.application\'\napply plugin: \'kotlin-android\'\napply plugin: \'com.jakewharton.hugo\'\napply plugin: \'com.getkeepsafe.dexcount\'\napply plugin: \'me.tatarka.retrolambda\'\n\nandroid {\n    compileSdkVersion 22\n    buildToolsVersion "23 rc3"\n    defaultConfig {\n        applicationId "com.ddiehl.android.htn"\n        minSdkVersion 15\n        targetSdkVersion 22\n        versionCode 4\n        versionName "0.3.0-dev"\n        ndk {\n            moduleName "app"\n        }\n    }\n    signingConfigs {\n        release {\n            storeFile file(ANDROID_KEYSTORE_PATH)\n            storePassword ANDROID_KEYSTORE_PWD\n            keyAlias HTN_KEYSTORE_ALIAS\n            keyPassword HTN_KEYSTORE_PWD\n        }\n    }\n    buildTypes {\n        debug {\n            applicationIdSuffix ".debug"\n            minifyEnabled false\n        }\n\n        release {\n            debuggable false\n            minifyEnabled true\n            proguardFiles getDefaultProguardFile(\'proguard-android-optimize.txt\'), \'proguard-rules.pro\'\n            signingConfig signingConfigs.release\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    sourceSets {\n        main.java.srcDirs += \'src/main/kotlin\'\n        debug.java.srcDirs += \'src/debug/kotlin\'\n    }\n}\n\ndef getLocalProperty(s) {\n    Properties properties = new Properties()\n    properties.load(project.rootProject.file(\'local.properties\').newDataInputStream())\n    return properties.getProperty(s)\n}\n\nretrolambda {\n    jdk getLocalProperty("jdk8.dir")\n}\n\ndependencies {\n    compile project(\':reddit\')\n    compile project(\':mopub\')\n    compile project(\':flurry\')\n    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"\n    compile \'com.android.support:appcompat-v7:22.2.1\'\n    compile \'com.android.support:support-v4:22.2.1\'\n    compile \'com.android.support:design:22.2.0\'\n    compile \'com.android.support:recyclerview-v7:22.2.1\'\n    compile \'com.android.support:cardview-v7:22.2.1\'\n    compile \'com.google.android.gms:play-services-ads:7.5.0\'\n    compile \'com.squareup.okhttp:okhttp:2.4.0\'\n    compile \'com.squareup.okhttp:okhttp-urlconnection:2.4.0\'\n    compile \'com.squareup.retrofit:retrofit:1.9.0\'\n    compile \'com.squareup:otto:1.3.5\'\n    compile \'com.squareup.picasso:picasso:2.5.2\'\n    compile \'com.jakewharton:butterknife:7.0.0\'\n    compile \'com.jakewharton:kotterknife:0.1.0-SNAPSHOT\'\n    compile \'io.reactivex:rxandroid:0.25.0\'\n    compile \'com.facebook.stetho:stetho:1.1.1\'\n    compile \'com.facebook.stetho:stetho-okhttp:1.1.1\'\n    debugCompile \'com.squareup.leakcanary:leakcanary-android:1.3.1\'\n    releaseCompile \'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1\'\n}\n\nbuildscript {\n    ext.kotlin_version = \'0.12.1230\'\n    repositories {\n        mavenCentral()\n        maven {\n            url \'http://oss.sonatype.org/content/repositories/snapshots\'\n        }\n    }\n    dependencies {\n        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"\n    }\n}\n\nrepositories {\n    mavenCentral()\n    maven {\n        url \'http://oss.sonatype.org/content/repositories/snapshots\'\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

AndroidManifest.xml

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<manifest xmlns:android="http://schemas.android.com/apk/res/android"\n    package="com.ddiehl.android.htn" >\n\n    <uses-permission android:name="android.permission.INTERNET" />\n    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>\n    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>\n\n    <application\n        android:name="com.ddiehl.android.htn.HoldTheNarwhal"\n        android:allowBackup="true"\n        android:icon="@mipmap/ic_launcher"\n        android:label="@string/app_name"\n        android:theme="@style/AppTheme"\n        android:supportsRtl="true">\n\n        <meta-data android:name="com.google.android.gms.version"\n            android:value="@integer/google_play_services_version" />\n\n        <activity\n            android:name="com.ddiehl.android.htn.view.activities.MainActivity"\n            android:label="@string/app_name"\n            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">\n            <intent-filter>\n                <action android:name="android.intent.action.MAIN" />\n\n                <category android:name="android.intent.category.LAUNCHER" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name="android.intent.action.VIEW" />\n\n                <category android:name="android.intent.category.DEFAULT" />\n                <category android:name="android.intent.category.BROWSABLE" />\n\n                <data\n                    android:host="www.damiendiehl.net"\n                    android:scheme="http" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n
Run Code Online (Sandbox Code Playgroud)\n\n

MainActivity.kt(我编辑了大部分与视图相关的逻辑,有 400 行,目前这是一个闭源项目。不过,如果有必要,我可以粘贴完整的文件)。

\n\n
package com.ddiehl.android.htn.view.activities\n\nimport android.app.Dialog\nimport android.app.ProgressDialog\nimport android.os.AsyncTask\nimport android.os.Build\nimport android.os.Bundle\nimport android.support.design.widget.NavigationView\nimport android.support.design.widget.Snackbar\nimport android.support.v4.content.ContextCompat\nimport android.support.v4.view.GravityCompat\nimport android.support.v4.widget.DrawerLayout\nimport android.support.v7.app.AppCompatActivity\nimport android.support.v7.widget.Toolbar\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.Window\nimport android.widget.EditText\nimport android.widget.ImageView\nimport android.widget.TextView\nimport butterknife.Bind\nimport butterknife.ButterKnife\nimport butterknife.OnClick\nimport butterknife.bindView\nimport com.flurry.android.FlurryAgent\nimport com.flurry.android.FlurryAgentListener\nimport com.mopub.common.MoPub\nimport com.mopub.mobileads.MoPubConversionTracker\nimport hugo.weaving.DebugLog\nimport java.util.HashMap\nimport kotlin.properties.Delegates\n\npublic class MainActivity : AppCompatActivity(), MainView, ConfirmSignOutDialog.Callbacks, NavigationView.OnNavigationItemSelectedListener {\n\n    private val mBus = BusProvider.getInstance()\n    private var mMainPresenter: MainPresenter? = null\n    private var mLastAuthCode: String? = null\n\n    private var mProgressBar: ProgressDialog? = null\n    private var mSubredditNavigationDialog: Dialog? = null\n\n    val mDrawerLayout: DrawerLayout by bindView(R.id.drawer_layout)\n\n    private var mAccessTokenManager: AccessTokenManager? = null\n\n    DebugLog\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super<AppCompatActivity>.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        ButterKnife.bind(this@MainActivity)\n\n        Init().execute()\n    }\n\n    private inner class Init : AsyncTask<Void, Void, Void>() {\n        override fun onPreExecute() {\n            super.onPreExecute()\n\n            mNavigationView.setNavigationItemSelectedListener(this@MainActivity)\n\n            val toolbar = ButterKnife.findById<Toolbar>(this@MainActivity, R.id.toolbar)\n            setSupportActionBar(toolbar)\n            val actionBar = getSupportActionBar()\n            if (actionBar != null) {\n                actionBar.setHomeAsUpIndicator(R.drawable.ic_navigation_menu)\n                actionBar.setDisplayHomeAsUpEnabled(true)\n            }\n        }\n\n        override fun doInBackground(vararg params: Void): Void? {\n            mAccessTokenManager = AccessTokenManager.getInstance(this@MainActivity)\n            return null\n        }\n\n        override fun onPostExecute(aVoid: Void?) {\n            super.onPostExecute(aVoid)\n            onAppInitialized()\n        }\n    }\n\n    override fun onStart() {\n        super<AppCompatActivity>.onStart()\n\n        if (mAccessTokenManager == null) {\n            showSpinner(R.string.application_loading)\n        } else {\n            onAppInitialized()\n        }\n    }\n\n    private fun onAppInitialized() {\n        mBus.register(mAccessTokenManager)\n\n        FlurryAgent.onStartSession(this)\n        dismissSpinner()\n        updateUserIdentity()\n        showSubredditIfEmpty(null)\n    }\n\n    override fun onStop() {\n        super<AppCompatActivity>.onStop()\n        FlurryAgent.onEndSession(this)\n        mBus.unregister(mAccessTokenManager)\n    }\n\n    companion object {\n        public val TAG: String = javaClass<MainActivity>().getSimpleName()\n\n        private val DIALOG_CONFIRM_SIGN_OUT = "dialog_confirm_sign_out"\n        private val FLURRY_SESSION_TIMEOUT_SECONDS = 30\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Lor*_*one 1

一个可能的原因可能是注释处理库。

  • 如果我将以下行添加到应用程序 `build.gradle` 文件中,我就可以启动 MainActivityKotlin.kt:`apply plugin: "kotlin-android"` 。如果没有这一行,我会得到同样的错误。请注意,Android Studio 中的“为项目配置 Kotlin”操作会在顶级 `build.gradle` 文件中添加一个 kotlin 插件,其中包含以下行:`apply plugin: 'kotlin'`。截至撰写本文时,Kotlin 版本级别为 1.1.1。 (4认同)