为什么这个应用程序不能在Kotlin的Android 4.x下运行?

Hel*_*oCW 4 android kotlin

Kotlin有一个非常简单的应用程序,它可以在Android Studio 3.0中的Android 8.0,Android 6.0和Android 5.1下运行良好

但我收到错误消息"java.lang.RuntimeException:无法实例化活动ComponentInfo {info.dodata.mirror/ui.UIMain}:java.lang.ClassNotFoundException:ui.UIMain"当我在Android 4.1下运行应用程序时.2(这是一款真正的手机)和Android 4.2.2

您可以通过下载应用程序来测试它:https://www.dropbox.com/s/9f0yxp5pqqxtcxq/Mirror.zip?dl = 0

在此输入图像描述

UIMain.kt

package ui
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import info.dodata.mirror.R
class UIMain : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.layout_main)
    }

}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="info.dodata.mirror">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name="ui.UIMain">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

build.gradle(模块:app)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 26
    flavorDimensions "default"

    defaultConfig {

        // Enabling multidex support.
        multiDexEnabled true

        applicationId "info.dodata.mirror"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.01"
        archivesBaseName = "BackupSettings-V" + versionName
    }

    productFlavors {
        free {
            applicationId "info.dodata.mirror"
        }

        pro {
            applicationId "info.dodata.mirror.pro"
        }
    }


    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "boolean", "IsDebugMode", "false"
        }

        debug {
            buildConfigField "boolean", "IsDebugMode", "true"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:multidex:1.0.2'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation "org.jetbrains.anko:anko-commons:$anko_version"
    implementation "org.jetbrains.anko:anko-sqlite:$anko_version"
}
Run Code Online (Sandbox Code Playgroud)

build.gradle(顶部)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.1.51'
    ext.anko_version = '0.10.2'

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)

eph*_*ent 8

在Android 5.0及更高版本中,ART会自动加载多个.dex文件.但是,在早期的Android版本中,Dalvik仅使用主要的classes.dex启动应用程序,并且应用程序必须在完成任何其他操作之前加载辅助.dex文件.

这由multidex支持库处理,但您没有按照说明进行操作.这意味着当系统尝试启动您的活动时,您的某些类不存在,从而导致崩溃.

根据您是否覆盖Application该类,请执行以下操作之一:

  • 如果您不覆盖Application该类,请编辑清单文件以在<application>标记中设置android:name,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="android.support.multidex.MultiDexApplication" >
            ...
        </application>
    </manifest>
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您覆盖了Application类,请将其更改为extend MultiDexApplication(如果可能),如下所示:

    public class MyApplication extends MultiDexApplication { ... }
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者,如果您覆盖了Application类,但无法更改基类,则可以改为覆盖attachBaseContext()方法并调用MultiDex.install(this)以启用multidex:

    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

你目前没有超越Application,所以你应该遵循第一种情况.