volley studio library for create android gradle android-library

android - studio - Biblioteca con dependencias de paquetes(Aar grasa)



download volley library for android studio (3)

Construimos una biblioteca que distribuimos a nuestros clientes. Distribuimos los archivos en bruto para que los usen. También utilizamos la API de acceso sin formato de GitHub para proporcionar un repositorio de Maven.

Ahora, para mantener las cosas ordenadas, dividimos la biblioteca en varios módulos:

include '':library'' include '':geohash'' include '':networkstate'' include '':okvolley'' include '':volley''

library es una biblioteca de Android, al igual que volley y okvolley y networkstate .

Ahora cuando publico la library , el árbol de dependencias se ve así:

/--- com.sensorberg.sdk:sensorberg-sdk:0.10.0-SNAPSHOT +--- com.squareup.okhttp:okhttp-urlconnection:2.2.0 | /--- com.squareup.okhttp:okhttp:2.2.0 | /--- com.squareup.okio:okio:1.2.0 +--- com.google.code.gson:gson:2.3.1 +--- android-sdk:okvolley:unspecified | +--- com.squareup.okhttp:okhttp-urlconnection:2.2.0 (*) | +--- com.google.code.gson:gson:2.3.1 | +--- android-near-gradle:volley:unspecified | /--- com.squareup.okhttp:okhttp:2.2.0 (*) +--- android-sdk:networkstate:unspecified +--- com.squareup.okhttp:okhttp:2.2.0 (*) +--- android-sdk:volley:unspecified /--- com.loopj.android:android-async-http:1.4.5

Como puede ver, android-sdk:networkstate:unspecified android-sdk:okvolley:unspecified y android-sdk:okvolley:unspecified aparecen en la lista de dependencias externas.

Me gustaría crear mi library aar con los módulos locales agrupados. Debe hacer una fusión de manifiesto local y un tarro lejano ... y combinar las dependencias de todos los módulos. Solo deben mostrarse los módulos externos.

Intenté hacer referencia al archivo aar local desde la carpeta build/output/aar de los módulos respectivos, pero eso tampoco parece funcionar. Todavía parece hacer referencia a los módulos locales por sus nombres y no fusionar los manifiestos del frasco ...

¿Alguien ha hecho algo como esto? Fuera de Android, esto se llamaría fatjar y hay complementos como musketyr/gradle-fatjar-plugin que producen un fatjar con Gradle.

Probé esto en mis módulos locales

if (project.ext.libraryBuild == true) { def moduleName = getName() File artifactFile = file("/build/outputs/aar/${moduleName}-release.aar") if (!artifactFile.exists()) { throw new GradleException("Dependency ${moduleName} is not build") } configurations.create("default") artifacts.add("default", artifactFile) return; } apply plugin: ''com.android.library'' android { compileSdkVersion 19 buildToolsVersion = ''21.1.2'' }

para referenciar el aar directamente ...


Aar incluido no es compatible oficialmente. Aquí hay una answer de un líder tecnológico en google.

Hago un plugin de gradle que hackea el plugin de android: fat-aar-plugin .

Básicamente es igual que el de Adwiv.

Espero eso ayude.


Simplemente desaliento la creación de la biblioteca de Android dependiendo de otra biblioteca de Android. No hay soporte oficial para agrupar la biblioteca de Android dentro de la salida aar (consulte: https://.com/a/20715155/2707179 ) y no veo que venga en un futuro previsible.

Por lo tanto, actualmente es más fácil mantener todas las cosas relacionadas con Android en un módulo y mantener otros módulos sin formato Java.

Agrupar el módulo Java simple es bastante fácil (solo copie las clases de salida o el archivo de salida a su biblioteca de Android en gradle) pero los módulos de Android son mucho más difíciles. En algún momento hubo un buen script gradle github.com/adwiv/android-fat-aar . Desafortunadamente, ya no se mantiene y no funciona con el último complemento de Android Gradle. Y los cambios en el complemento de Android no están bien documentados, por lo que crear (y mantener) su propio complemento / script personalizado sería realmente doloroso.

Realmente no entiendo las razones del equipo de Android detrás de no permitir incrustar una biblioteca de Android en otra (aparte de "es complicado"), pero con la situación actual es mucho más fácil mantener todas las cosas de Android en un módulo.

Por supuesto modularizar tu proyecto es una buena idea. Realmente intenté mantener módulos separados, pero en algún momento tuve que renunciar, todas estas soluciones no valían la pena.


Tenía un requisito similar, así que después de buscar mucho, terminé por abrirme camino a través del complemento de Android. No sé mucho de groovy, pero me las arreglé para preparar un archivo de Gradle que sí construye un archivo Aar gordo que es aceptado por la aplicación.

El código resultante está disponible en github.com/adwiv/android-fat-aar . Las instrucciones detalladas están en el sitio de GitHub. El build.gradle resultante se vería así:

apply from: ''fat-aar.gradle'' dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) embedded project('':libraryone'') embedded project(''com.example.internal:lib-three:1.2.3'') compile ''com.android.support:appcompat-v7:22.2.0'' }

El código actual no intenta fusionar archivos AIDL, ya que no los uso. Las siguientes funciones están presentes y funcionan para mí (aunque mis bibliotecas no son demasiado complejas)

  1. Fusión de clases (así progenard trabaja en las clases combinadas)
  2. Fusión de activos y bibliotecas JNI.
  3. Fusión de lo manifiesto
  4. Fusión de Recursos
  5. Incrustación de bibliotecas del mismo proyecto.
  6. Incrustación de bibliotecas desde repositorios Maven

Solo las bibliotecas de Android (aar) se pueden incrustar, no los archivos jar, aunque los archivos jar dentro de las carpetas libs de las bibliotecas integradas se descomprimen y se combinan.

Pruébalo y hazme saber cualquier problema. Puede pasar por el código y modificarlo a sus necesidades.