biblioteca de Android: archivo de clase no encontrado cuando se utiliza "proyecto de implementación" para la dependencia del módulo de una biblioteca

votos
4

Estoy trabajando en un proyecto que cuenta con 3 módulos como se muestra a continuación:

Project
|
|-- Common 
|
|-- SDK
|
|-- App

Commones un módulo de biblioteca de Android que todos los demás módulos dependerá pero no tienen que publicar en cualquier lugar, ya que contiene sólo el código común para los demás módulos. Por otro lado SDKes otro proyecto de biblioteca de Android que tiene que ser publicado en nuestro Artifactory interna.

Appes un proyecto de ejemplo del SDK. Soy capaz de publicar el SDKartefacto sin problemas, pero cuando la importación en una aplicación de cliente de la compilación falla debido a que ninguna de las clases del Commonmódulo se encuentran.

Para el tercer partido dependencias que el módulo SDK depende de uso implementation(por ejemplo, implementation 'com.squareup.okhttp3:okhttp:3.11.0'y todas esas dependencias se añaden correctamente al SDKarchivo POM) y por la dependencia en el Commonmódulo de uso implementation project(path: ':Common').

En la aplicación cliente que importa la SDKbiblioteca del compilador muestra el siguiente error

Error: cannot access Foo
class file for com.acme.Foo not found

(Foo es una clase en el módulo común)

¿Por qué cuando importar los SDKninguna de las clases de la Commonse encuentran módulo? Lo que espero es el compilador de fusionar los dos módulos en una sola. ¿Alguien una idea de cómo puedo solucionar este problema?

(Sé que una solución es publicar Commonen el Artifactory pero no quiero hacer eso ya que esto es sólo el código común interno).

Publicado el 20/10/2018 a las 10:35
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
2

Repleace implementation project(path: ':Common')por api project(path: ':Common') Sobre diferencia entre el API y la aplicación puede comprobar este artículo .

Respondida el 20/10/2018 a las 11:08
fuente por usuario

votos
1

Este es el comportamiento esperado para los módulos Gradle; como se habrá deducido, la publicación de cada uno como un artefacto separado (y la lista de las dependencias en el archivo POM) es el uso sólo está soportado.

Hay un plugin que puede hacer lo que necesita en https://github.com/adwiv/android-fat-aar , pero ya no está mantenida por lo que su experiencia puede variar. Alternativamente, es posible lograr resultados similares mediante la actualización de sus sourceSets SDK para apuntar directamente a las fuentes de módulos comunes, y eliminar la dependencia Gradle por completo. No se puede encontrar un buen enlace para esto, pero debería ser posible. Esto eliminar todo el manejo integrado de módulos, pero puede adaptarse mejor a la forma en que está utilizando el módulo.

Respondida el 08/11/2018 a las 15:13
fuente por usuario

votos
0

Tenía un problema similar a mí mismo.

Una ayuda visual es utilizar Android Studiosu propia vista de la estructura del proyecto:introducir descripción de la imagen aquí

Archivo -> Estructura del proyecto

A continuación, para su :apppuede comprobar lo que modules dependenciestiene:

introducir descripción de la imagen aquí

Si es necesario, puede eliminar las dependencias de módulos actuales y añadirlos de nuevo sólo para comprobarlo. Después de que al hacer clic en "Aceptar" Gradle intentará sincronizar sus archivos.

De esta manera usted está dejando Android Studio haga el trabajo de integración de todos los módulos, y es de esperar, se solucionará el problema.


PS: Creo que va a importar su proyecto en el camino equivocado. Debe utilizar apien lugar de implementation. A partir de la documentación:

API: Cuando un módulo incluye una dependencia de la API, que está dejando Gradle sabe que el módulo quiere exportar transitiva que la dependencia a otros módulos, por lo que está disponible para ellos, tanto en tiempo de ejecución y tiempo de compilación. Esta configuración se comporta igual que la compilación (que ahora está en desuso), y se debe utilizar normalmente presente sólo en módulos de biblioteca. Eso es porque, si una dependencia API cambia su API externa, Gradle vuelve a compilar todos los módulos que tienen acceso a esa dependencia en tiempo de compilación. Por lo tanto, teniendo un gran número de dependencias API puede aumentar significativamente los tiempos de construcción. A menos que usted desea exponer API de una dependencia a un módulo de prueba independiente, módulos de aplicaciones deben utilizar en su lugar las dependencias de implementación.

Comprobar los documentos oficiales: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations

Respondida el 09/11/2018 a las 15:07
fuente por usuario

votos
-1

Apoyando a @Aolphn sustituir implementation project(path: ':SDK')por api project(path: ':SDK')causa SDK es una biblioteca de cliente, que reside.

Respondida el 13/11/2018 a las 10:46
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more