Cuando se ejecuta mi aplicación me sale el siguiente error:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.name.app/com.name.app.MainActivity}:
java.lang.ClassNotFoundException: Didn't find class "com.name.app.MainActivity" on path:
DexPathList[[zip file "/data/app/com.name.app-2/base.apk"],
nativeLibraryDirectories=[/vendor/lib, /system/lib]]
He utilizado el analizador apk Android Studio (Build> Analizar APK) para analizar mi apk (app / build / salidas / APK / debug / app-debug.apk) y la estructura de la classes.dex
es
java/
lang/*
util/*
io/*
com/google/devtools/build/...
Me di cuenta de que mis propias clases, y por lo tanto la MainActivity, se echa en falta. Para la medida de lo entiendo archivos DEX (a partir de esta pregunta SO) mis propias clases deberían estar allí, también. Ya que no hay, no veo razón por la que sale el error de que no se encuentra mi clase.
Me sale este error en mi propio dispositivo: Samsung, Piruleta 5.0.2, API 21, y en un dispositivo virtual: Google píxeles, Oreo 8.0.0, API 26.
Lo que he tratado
He buscado en Google y encontró múltiples sugerencias, pero ninguno de ellos trabajó para mí. Estas sugerencias fueron:
Desactivar ejecución instantánea. Archivo> Configuración> Generar, ejecución, implantación> instantáneo Ejecutar> Ejecutar instantánea desmarque.
Limpiar el proyecto. Construir> Limpio. Luego reconstruir el proyecto, construcción> Reconstruir.
Invalidar Caches / Reiniciar.
Desinstalar la aplicación desde el dispositivo y vuelve a intentarlo.
Utilizar diferentes nombres de ruta en el
Manifest
. Cambiarandroid:name=".MainActivity"
enandroid:name="com.name.app.MainActivity"
laactivity
etiqueta.Desactivar pre-Dexing, como en esta respuesta.
Añadido a la siguiente build.gradle
dexOptions {
preDexLibraries false
}
- Habilitar multidex, seguido este enlace. En primer lugar habilitado en multidex
build.gradle
, y después se añadió elMultiDexApplication
de mi manifiesto. MiMainActivity
extiendeAppCompatActivity
(y por lo tanto no se extiendeApplication
).
Habilitación multidex da un error similar:
java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication:
java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path:
DexPathList[...]
A continuación se presentan las adiciones que permitan multidex.
build.gradle
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 26
multiDexEnabled true
}
...
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
manifiesta (sólo la parte pertinente)
<application
android:name="android.support.multidex.MultiDexApplication" >
...
</application>
Observen Hubo otra sugerencia relacionada con las bibliotecas, ver esta respuesta. Sin embargo, esto fue dirigido a Eclipse y no estoy seguro de si podría ser una solución a mi problema. Gradle debe hacer frente a todas las dependencias, ¿verdad? Por si acaso, aquí es cómo hice una lista de todas las dependencias en mis Gradle (Kotlin versión 1.2.51):
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-simplexml:2.3.0'
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
testImplementation 'org.junit.platform:junit-platform-engine:1.2.0'
testImplementation 'org.jetbrains.spek:spek-api:1.1.5'
testImplementation 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'
}
Actualizar
Estoy usando Android Studio 3.1.3. He tratado de ejecutar mi aplicación con otro ordenador portátil (mediante el control de versiones, el uso de Android Studio 3.1.3) y no parece el error. Como los archivos son exactamente los mismos, sospecho que hay algo malo en mi configuración de Android Studio.
Extracción de Android Studio y todas sus configuraciones, y luego descargar e instalar Android Studio desde aquí no resolvió el problema.
La estructura de carpetas de mi era
.gradle/
.idea/
app/
build/
src/main
gen/
java/
res/
build/
gradle/
La gen
carpeta no debería estar aquí. Esta carpeta contenía archivos generados, al igual que R.java
. Estos archivos fueron también (sin embargo correctamente) en app/build/generated/source/*
. Con solo borrar la gen
carpeta y la limpieza del proyecto resolvió el problema.
No tengo ni idea de lo que gen
puso fin a la carpeta allá arriba, como se me quita el proyecto de mi disco y se clona el repositorio git (que no tiene esta carpeta) varias veces. Tan pronto como me entero de cómo llegó hasta allí, voy a actualizar esta respuesta.