¿Por qué la aplicación no funciona con Android 4.x en Kotlin?

Hay una aplicación muy simple hecha por Kotlin, puede funcionar bien en Android 8.0, Android 6.0 y Android 5.1 en Android Studio 3.0

pero obtengo el post de error "java.lang.RuntimeException: no se puede crear una instancia de la actividad ComponentInfo {info.dodata.mirror / ui.UIMain}: java.lang.ClassNotFoundException: ui.UIMain" cuando ejecuto la aplicación en Android 4.1. 2 (Este es un teléfono mobile real) y Android 4.2.2

Puede probarlo descargando la aplicación en https://www.dropbox.com/s/9f0yxp5pqqxtcxq/Mirror.zip?dl=0

enter image description here

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) } } 

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> 

build.gradle (Módulo: aplicación)

 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" } 

build.gradle (arriba)

 // 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 } 

En Android 5.0 y versiones posteriores, ART combina automáticamente varios files .dex. Sin embargo, en las versiones anteriores de Android, Dalvik inicia la aplicación solo con las classs principales.dex, y la aplicación debe cargar los files secundarios .dex antes de que se haga cualquier otra cosa.

Esto es manejado por la biblioteca de soporte multidex, pero no siguió las instrucciones . Esto significa que algunas de sus classs no están presentes cuando el sistema intenta comenzar su actividad, lo que provoca un queuepso.

Dependiendo de si anula la class de la Application , realice una de las siguientes acciones:

  • Si no anula la class de la Application , edite su file de manifiesto para configurar android: name en la label <application> siguiente manera:

     <?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> 
  • Si reemplaza la class de la Application , cámbiela para extender la MultiDexApplication (si es posible) de la siguiente manera:

     public class MyApplication extends MultiDexApplication { ... } 
  • O si anula la class de la Application , pero no es posible cambiar la class base, puede replace el método attachBaseContext() y llamar a MultiDex.install(this) para habilitar multidex:

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

Actualmente no está anulando la Application , por lo que debe seguir el primer caso.

  • ¿Cómo corregir la ambigüedad de resolución de sobrecarga en Kotlin (sin lambda)?
  • Operador nuevo en Kotlin (syntax)
  • ¿Puedo actualizar un object inmutable profundamente nested sin tomar conciencia de su context?
  • Funciones de extensión LocalDateTime y Smart Casting
  • OpenGL Texture Glitch con caras
  • Onclick no responde usando kotlin en android studio
  • Lista de objects que implementa la interfaz
  • Problema de tipo genérico Kotlin
  • ¿Hay alguna manera de implementar la pagination en spring webflux y spring datos reactivos
  • Cambiar / Cuando sin descanso en Kotlin
  • no se puede descartar el dialog de progreso utilizando el método de descartar en Android