android - library - ¿Cómo administrar diferentes versiones de bibliotecas de soporte para terceros con gradle?
com.android.support:design 26 (4)
Tengo un montón de librerías de terceros que incluyo en mi aplicación base. No puedo controlar la biblioteca de soporte que incluyen esos módulos de terceros. Esto hace que sea difícil tener la misma versión de la biblioteca de soporte de Android en mi aplicación.
Sé que estoy usando Gradle cuando puedo excluir ciertas bibliotecas de cada dependencia:
compile(''com.test:lib1:1.0.0'') {
exclude group: ''com.android.support''
}
Sin embargo, hay un montón de bibliotecas de asistencia y excluirlas todas para cada una de mis bibliotecas de terceros parece una exageración.
¿Hay alguna manera mejor?
Leyendo esta publicación del blog: https://www.devsbedevin.com/android-understanding-gradle-dependencies-and-resolving-conflicts/
Sugiere:
configurations.all {
resolutionStrategy {
preferProjectModules()
}
}
Sin embargo, cuando lo uso, todavía recibo una advertencia en Android Studio en mi archivo de gradle de que se detectaron varias versiones de la biblioteca de soporte.
¿Qué hago si mis dependencias dependen de diferentes versiones de la biblioteca de soporte? En cualquiera de los casos anteriores, estaría obligando a las bibliotecas de terceros a utilizar una versión específica de la biblioteca de soporte con la que no se compilaron. ¿Qué versión se supone que debo usar? Última biblioteca de soporte? ¿Min biblioteca de soporte de todas las dependencias de terceros?
Aquí hay un ejemplo de archivo de gradle mínimo que muestra cómo sacar dependencias de terceros que dependen de su propia versión de la biblioteca de soporte.
android {
compileSdkVersion 26
buildToolsVersion ''26.0.2''
defaultConfig {
applicationId "com.example.app"
minSdkVersion 17
targetSdkVersion 25
}
}
configurations.all {
resolutionStrategy {
preferProjectModules()
}
}
dependencies {
compile ''com.android.support:support-v13:26.0.0''
compile ''com.test:lib1:1.0'' // depends on support-v13:25.0.0
compile ''com.test:lib2:1.0'' // depends on support-v13:25.2.0
compile ''com.test:lib3:1.0'' // depends on support-v13:25.4.0
compile ''com.test:lib4:1.0'' // depends on support-v13:26.0.0
}
Android studio da la siguiente advertencia:
Debe especificar la dependencia, con su versión deseada, que está causando el conflicto antes de las librerías que lo necesitan. Si haces eso, estas libretas usarán tu versión de dependencia especificada.
Ejemplo con libs (del mensaje de advertencia) de su captura de pantalla
dependencies {
compile ''com.android.support:support-v13:26.0.0''
compile ''com.android.support:support-compat:26.0.0''
compile ''com.android.support:animated-vector-drawable:26.0.0''
compile ''com.test:lib1:1.0'' // depends on support-v13:25.0.0
compile ''com.test:lib2:1.0'' // depends on support-v13:25.2.0
compile ''com.test:lib3:1.0'' // depends on support-v13:25.4.0
compile ''com.test:lib4:1.0'' // depends on support-v13:26.0.0
}
Continúe agregando dependencias (que aparecen en la advertencia de su captura de pantalla) hasta que ya no haya ningún mensaje de advertencia sobre diferentes versiones de la biblioteca.
Esto es ciertamente posible. En el archivo build.gradle de sus proyectos (el archivo build.gradle de nivel superior) agregue el siguiente bloque de código:
ext {
supportlib_version = ''26.1.0''
gps_version = ''11.2.0''
}
//Ensure that all dependencies use the same version of the Android Support library
subprojects {
project.configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == ''com.android.support''
&& !details.requested.name.contains(''multidex'')) {
details.useVersion "$supportlib_version"
}
if (details.requested.group == ''com.google.android.gms''
&& !details.requested.name.contains(''multidex'')) {
details.useVersion "$gps_version"
}
}
}
}
El siguiente código garantiza que la versión de dependencia ''com.android.support'' será igual a $ supportlib_version para todas las dependencias. Lo mismo para el marco ''com.google.android.gms''.
Asegúrese de que en el archivo build.gradle de su módulo también use estas versiones para sus dependencias. P.ej:
compile "com.android.support:support-v4:$supportlib_version"
Lea más sobre cómo forzar una determinada versión de dependencia en la documentación oficial de Gradle .
Actualización de Google ha desacoplado las versiones de la biblioteca . Por lo tanto, forzar una versión específica por encima de 15.0.0 puede no funcionar. En su lugar, puede permitir un rango limitado de versiones. El siguiente ejemplo permite cualquier versión superior a 15.0.0 pero inferior a 16.
gps_version = ''[15.0.0, 16.0.0)''
Haga el targetsdkversion
26
y también en su gradle realice cambios a 26 o puede cambiar su versión de compilesdk a 25
y sus dependencias relevantes a 25
Primer caso: tiene bibliotecas compatibles que ya han actualizado sus propias bibliotecas internas, no hay problema aquí.
Segundo caso: tiene libs en su proyecto que tienen una versión más alta que otras libs internas contenidas en otras libs , y estas libs se pueden actualizar a una nueva versión sin ese problema, también No hay problema aquí.
El peor de los casos: tiene libs en su proyecto que tienen una versión más alta que otras librerías internas contenidas en otras libs , y estas libs no tienen una nueva versión que ya se haya actualizado.
- Descargue esa biblioteca e inclúyala a su aplicación como proyecto de
implementation project('':library'')
y actualice susimplementation project('':library'')
internas. - O use otra biblioteca en su lugar.
No olvide utilizar la ./gradlew app:dependencies
para verificar sus dependencias.
También creo que debería estar allí de alguna manera para hacer eso automáticamente.