mejores - La clase de actividad no se puede encontrar en el archivo AAR java.lang.NoClassDefFoundError
librerias android studio (7)
La causa del problema es que se llama a la clase ScannerViewActivity
dentro de uno de sus AAR como una dependencia como:
apply plugin: ''com.android.library''
android{...}
dependencies {
compile ''com.me.scanner:otherscanner@aar'' //library which contains ScannerViewActivity
}
pero cuando usa un aar (transitive no agregará estas dependencias aar!), tiene que agregar la otra dependencia como:
dependencies {
...
compile (''com.me.app:scanner@aar'')// remove{ transitive = true; }
compile (''com.me.scanner:otherscanner@aar'')
...
}
He creado una biblioteca de Android, contiene una clase de actividad que utiliza para abrir la intención de la cámara, la biblioteca funciona a excepción de la parte que invoca la actividad para aparecer en la pantalla y la aplicación se bloquea lanzando los siguientes errores
Suppressed: java.lang.ClassNotFoundException: com.me.scanner.ScannerViewActivity
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 14 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
A continuación está mi archivo build.gradle
de otro proyecto que usará esta biblioteca
repositories {
flatDir {
dirs ''libs''
}
}
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
androidTestCompile(''com.android.support.test.espresso:espresso-core:2.2.2'', {
exclude group: ''com.android.support'', module: ''support-annotations''
})
compile ''com.android.support:appcompat-v7:25.3.0''
compile ''com.android.support.constraint:constraint-layout:1.0.2''
compile ''com.me.app:gpio_lib@aar''
compile (''com.me.app:scanner@aar''){ transitive = true; }
testCompile ''junit:junit:4.12''
}
Tenga en cuenta:
Esta biblioteca funciona perfectamente como proyecto de módulo,
compile project('':scannercontrol'')
pero no al usarlo como
aar
en el proyectoLo he intentado con y sin
{ transitive = true; }
{ transitive = true; }
, sin cambios- He cambiado el nombre de mi archivo aar a
scanner.aar
- He tomado el archivo
/[library-project]/build/outputs/aar/scanner-release.aar
Actualización1 - 2017-09-14
La actividad ScannerViewActivity
es parte de mi biblioteca, así es como se llama desde una de las clases de la biblioteca
Intent scannerView = new Intent();
scannerView.putExtra(MESSAGE_RECEIVER, new MessageReceiver());
scannerView.setClass(context, ScannerViewActivity.class);
scannerView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(scannerView);
este context
es la instancia de android.app.Application
y no de ninguna Activity
Actualización2 - 2017-09-14
Afortunadamente después de roaming 2 días en todo google me encontré con la respuesta de la pregunta Class no encontrada en aar . He agregado las dependencias de la biblioteca al proyecto y puedo ejecutarlo con aar
pero esta no es la solución de mi problema,
A continuación está el flujo y el problema que estoy enfrentando actualmente
Estoy desarrollando una versión de sandbox de una biblioteca que se comunica con un hardware de escáner de código de barras específico, ya que el desarrollador no necesariamente tiene el hardware, usará la versión de sandbox de la biblioteca que permitirá al desarrollador usar la cámara de su dispositivo como un código de barras escáner,
Queremos que el desarrollador extraiga los archivos
AAR
scanner.aar
yscanner-sandbox.aar
delSDK
proporcionado y utilice cualquiera de ellosNo queremos que el desarrollador agregue una dependencia adicional a su archivo
.gradle
si quiere ejecutar la versión de sandbox de la biblioteca,A continuación se muestra la dependencia que se utiliza para simular la cámara del dispositivo como un escáner de código de barras
compile ''me.dm7.barcodescanner:zxing:1.9.8''
La pregunta actualizada es
¿Cuál es la forma posible de distribuir un archivo aar sin publicarlo en ningún repositorio como el repositorio maven y todas las dependencias de la biblioteca instalada cuando el desarrollador sincroniza el archivo .gradle
Aunque no conozco la causa raíz, puedes probar esta solución: en tu proyecto de aplicación, define una actividad que se extiende desde ScannerViewActivity, y declara en AndroidManifest.xml.
class MyScannerViewActivity extends ScannerViewActivity {
// do nothing or something you want
}
Entonces debería iniciar MyScannerViewActivity en lugar de ScannerViewActivity por intención.
zeeshan
Me he enfrentado al mismo problema que hice mucha investigación y lo arreglé con suerte, eso te ayuda
Creando un archivo .aar para un proyecto:
- Para un módulo de biblioteca, Android Studio crea automáticamente el archivo .aar. Para un proyecto con cualquier archivo de recursos o con las bibliotecas, el archivo .aar se puede generar como se menciona en los próximos pasos.
- Verifica el complemento. Debería estar de la siguiente manera, cambiar a la biblioteca si está en la aplicación, aplicar el complemento: ''com.android.library''
- Abra la barra de gradle de borde derecha abierta y vaya a "su proyecto" -> Tareas-> construir y luego haga doble clic en assembleRelease. Al crear el proyecto, encontrará los dos archivos .aar (app-debug.aar y app-release.aar) dentro del directorio app / build / outputs / aar /. Usando el archivo .aar en su proyecto:
Obtenga el archivo "app-release.aar" y péguelo en la carpeta libs de su proyecto. Si la carpeta libs no está presente, cree un directorio llamado "libs" dentro del directorio de la aplicación.
Agregue lo siguiente al archivo gradle de la aplicación, repositorios {flatDir {dirs ''libs''}} dependencias {compile (name: ''app-release'', ext: ''aar'')}
- En sincronización, su proyecto está listo para usar los archivos de la biblioteca. Nota: las dependencias .aar gradle deben agregarse manualmente en la gradle de su aplicación de proyecto. Ejemplo: a continuación
Suposición de errores: System.err: java.lang.NoClassDefFoundError:
Solución:
Las dependencias .aar gradle deben agregarse manualmente en la gradle de su aplicación de proyecto
¿Puedes intentar lo de abajo?
- Deshabilite la ejecución instantánea y limpie la construcción de su AAR.
- Implemente de nuevo, donde sea que esté alojando su AAR.
- Pruebe la aplicación nuevamente con AAR como dependencia.
Las ejecuciones instantáneas a veces causan problemas debido al almacenamiento en caché.
Editar: para agregar AAR local. Puedes seguir la respuesta como se menciona aquí
Hay 3 formas de distribuir tu biblioteca:
Creando una biblioteca maven local luego distribuye el aar generado.
Puede crear un aar local utilizando el complemento Maven de Gradle para Android . Como hacerlo:a. Agregue la ruta de clases del complemento a root
build.gradle
:buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath ''com.android.tools.build:gradle:2.2.3'' classpath ''com.github.dcendents:android-maven-gradle-plugin:1.5'' } } allprojects { repositories { jcenter() } }
segundo. Establezca el complemento maven y agregue el nombre de grupo y versión a la biblioteca build.gradle:
apply plugin: ''com.android.library'' apply plugin: ''com.github.dcendents.android-maven'' group = ''com.your.packagename'' version = ''1.0.0'' ext.versionCode = 1000 android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 9 targetSdkVersion 25 versionCode versionCode versionName version } buildTypes { ... } } dependencies { ... }
do. Establecer el artifactId se establece en settings.gradle:
rootProject.name = ''yourlibraryname''
re. Crea e instala la biblioteca a tu experto local.
Puede ejecutar./gradlew
install en la carpeta del proyecto o usarGradle -> YourLibrary -> Other -> Instalar desde Android Studio (en el lado derecho de Android Studio)
mi. Use la biblioteca instalada directamente en su proyecto.
Puede usar la biblioteca agregandomavenLocal()
a su raíz build.gradleallprojects { repositories { jcenter() mavenLocal() // for local maven. } }
A continuación, agregue la dependencia al proyecto:
compile ''com.your.packagename:modulename:1.0.0''
O puede copiar el .aar generado del camino maven local. En Linux, puede obtenerlo desde
/your/userpath/.m2/repository/
o~/.m2/repository/
Utilice la misma técnica en el número 1, pero haga que la ruta del experto local para cada computadora reveladora apunte al
~/.m2/repository/
central.Use un repositorio maven privado. Puede usar JFrog Artifactory oss o Nexus Repository OSS
La respuesta para su "Update2 - 2017-09-14" - simplemente puede construir un archivo aar fat. que contendrá todas las dependencias, una cosa que puede tener que manejar es el conflicto en las dependencias que en algún momento puede crear un problema. también el tamaño de la grasa aar puede ser enorme. así que intentalo.
Prueba esto,
Deshabilitar la ejecución instantánea
Archivo -> Configuración -> Compilación, Ejecución, Despliegue -> Ejecución instantánea
si esto no funciona, házmelo saber.