1 2 3 4 5 |
dependencies { compile 'com.codictados.utils:memoryutil:'0.0.1' } |
¿De dónde saca Android Studio las librerías?
Comenzaremos con esta pregunta tan simple, ya que creo que no todo el mundo sabe de dónde las saca. ¿Acaso las busca automáticamente en Google y las añade a tu proyecto? En realidad, no es nada complicado. Android Studio descarga las librerías desde el servidor de repositorios Maven que definimos en nuestro archivo build.gradle. (Apache Maven es una herramienta desarrollada por Apache que proporciona un servidor de archivos que permite su distribución). Básicamente, existen dos servidores estándares que alojan las librerías de Android: JCenter y Maven Central.
JCenterJCenter es un repositorio Maven que se aloja en bintray.com. Puedes explorar el repositorio completo aquí. Para utilizar el repositorio JCenter en tu proyecto, solo tienes que definir el repositorio en el archivo build.gradle de tu proyecto de la siguiente manera:
|
Maven CentralMaven Central es un repositorio Maven que se aloja en sonatype.org. Puedes explorar el repositorio completo aquí. Para utilizar Maven Central en tu proyecto, solo tienes que definir el repositorio en el archivo build.gradle de tu proyecto de la siguiente manera:
|
1 2 3 4 5 |
repositories { maven { url 'https://maven.fabric.io/public' } } |
1 2 3 4 5 |
dependencies { compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar' } |
Funcionamiento de JCenter y Maven Central
¿Sabes por qué hay dos tipos de repositorios estándares en lugar de uno solo? En realidad ambos repositorios tienen la misma función: alojar librerías de Java/Android. Subir la librería a uno o a otro es algo que depende del desarrollador. Originalmente, Andorid Studio escogió Maven Central como repositorio por defecto. Cuando se crea un proyecto en una versión antigua de Android Studio, se añademavenCentral()
automáticamente al build.gradle.
Pero el gran problema que tiene Maven Central es que no es fácil de usar para el desarrollador. Es increíblemente difícil subir una librería. Para hacerlo, el desarrollador debe tener cierto nivel de conocimientos. Y habiendo ya otras razones, como por ejemplo la preocupación por la seguridad, el equipo de Android Studio decidió cambiar de repositorio a JCenter. De hecho, puedes observar que cuando se crea un proyecto con versiones recientes de Android Studio, automáticamente se añade jcenter()
al build.gradle en lugar de mavenCentral()
.
Aparte, había muchas otras buenas razones por las que decidieron cambiar de Maven Cetral a JCenter. Estas son algunas de las más importantes:
- JCenter utiliza CDN para distribuir sus librerías, lo que para el desarrollador significa una mayor rapidez de carga.
- JCenter es el mayor repositorio Java que hay sobre la Tierra. Así, el hecho de que algo esté disponible en Maven Central prácticamente implica que esté disponible también en JCenter. Es decir, que JCenter es un superconjunto de Maven Central.
- Resulta increíblemente fácil subir una librería a este repositorio. No es necesario firmar ni hacer nada complejo como teníamos que hacer en Maven Central.
- Interfaz de usuario fácil de usar.
- Si quieres subir tu librería a Maven Central, puedes hacerlo fácilmente con un solo clic desde Bintray (y con algún que otro paso más que solo tendrás que seguir la primera vez).
¿Cómo obtiene Gradle las librerías de un repositorio?
Antes de comenzar a hablar sobre cómo subir una librería a JCenter, conviene explicar cómo descarga Gradle las librerías de un repositorio. Es decir, ¿cómo se bajan las librerías mágicamente cuando escribimos en el archivo build.gradle lo siguiente?
1 2 3 |
compile 'com.codictados.utils:memoryutil:0.0.1' |
1 2 3 |
GROUP_ID:ARTIFACT_ID:VERSION |
- GROUP_ID: es com.codictados.utils.
- ARTIFACT_ID: es memory-util.
- VERSION: es 0.9.3.
- El GROUP_ID define el nombre del grupo de la librería. Puede que tengas varias librerías que sirvan para funciones distintas pero dentro de un mismo contexto. Si las librerías están en el mismo grupo, compartirán el mismo GROUP_ID. Por norma general, el GROUP_ID suele ser el nombre del desarrollador del paquete seguido del nombre del grupo de la librería. En nuestro ejemplo, “com.codictados” es el desarrollador, y “utils” es el grupo al que pertenece la librería. [N. del t.: para que la librería sera aceptada en JCenter, el GROUP_ID debe estar compuesto por tres palabras separadas por puntos, como en nuestro ejemplo.]
- Después, el nombre real de la librería se define en el ARTIFACT_ID. Nuestra librería se llama “memoryutil”.
- Y la VERSION no es más que el número de versión. Aunque puede ser cualquier palabra, te recomiendo que tenga un formato
x.y.z
. También puede ir seguido de-beta
si quieres.
1 2 3 4 5 6 7 8 |
dependencies { compile 'com.squareup:otto:1.3.7' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.retrofit:retrofit:1.9.0' } |
com.squareup:otto:1.3.7
en http://jcenter.bintray.com/com/squareup/otto/1.3.7 y https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/.
Y entonces Android Studio descargaría esos archivos a nuestro ordenador y compilaría el proyecto. Y nada más. ¡Algo muy sencillo!
Tienes que entender que una librería que se obtiene de un repositorio no es más que un archivo jar o aar. Funciona de la misma forma que si descargas los archivos y los añades a tu proyecto a mano. Pero la gran ventaja que nos ofrece el sistema de dependencias de Gradle es que no tenemos que hacerlo a mano, sino que basta con añadir unas líneas de código. La librería se añadirá a nuestro proyecto con su propia versión.
¿Qué es el formato aar?
Un momento… He comentado que existen dos tipos de archivo de librería que se pueden subir a un repositorio: jar y aar. Un archivo jar no es algo que no conozcas ya. Pero ¿qué es exactamente un archivo aar? Un archivo aar envuelve a un archivo jar. Se inventó porque una librería de Android necesita incluir archivos específicos de Android, como el AndroidManifest.xml, los recursos, los assets o los archivos JNI, y estos no van dento de un archivo jar estándar. Así que el aar se inventó para poder incluir todas estas cosas. Basicamente, es un archivo zip, igual que un jar pero con una estructura de archivos diferente. El archivo jar se incluye dentro con el nombre de classes.jar. Esta es la lista de archivos que contiene un aar:/AndroidManfest.xml
(obligatorio)/classes.jar
(obligatorio)/res/
(obligatorio)/R.txt
(obligatorio)/assets/
(opcional)/libs/*.jar
(opcional)/proguard.txt
(opcional)/lint.jar
(opcional)
Cómo subir una librería a JCenter
Ya sabes todo lo necesario sobre cómo funciona el sistema de repositorios. Ahora empezaremos con la parte más importante: la subida, o lo que es lo mismo, cómo subir tu archivo de librería a http://jcenter.bintray.com. Cuando lo hagamos, la librería será publicada. Ahora deben preocuparnos dos cosas: ¿cómo crear el archivo aar y cómo subuirlos archivos compilados al repositorio? Aunque esto requiere un montón de pasos, debo decir que no es muy difícil, ya que Bintray lo ha preparado todo muy bien. Aquí tienes el diagrama de todo el proceso:
Paso 1: Crear un paquete en Bintray
Lo primero es crear un paquete en Bintray. Para hacerlo, tendrás que disponer de una cuenta de Bintray y crear un paquete.-
- Créate una cuenta en bintray.com (darse de alta es muy fácil, así que no lo voy a explicar).
- Después de registrarte, accede a tu cuenta y haz clic en maven. (Si no ves esta opción, pulsa en View all y selecciónala ahí).

-
- Pulsa sobre Add New Package para comenzar a crear un paquete para nuestra librería.

-
- Introduce toda la información solicitada.

-
- Serás redireccionado a la página de edición de tu paquete. Haz clic en el nombre de tu paquete, debajo de Edit Package para ver los datos del paquete.


Paso 2: Crear una cuenta de Sonatype para Maven Central
Atención: puedes saltarte los pasos 2 y 3 si no piensas subir tu librería a Maven Central. De cualquier manera, te recomiendo seguirlos, ya que muchos desarrolladores aún utilizan este repositorio. Al igual que en JCenter, si quieres publicar tu librería en Maven Central, tienes que crearte una cuenta en la página web de su proveedor, Sonatype. Tu objetivo es crear una cuenta JIRA Issue Tracker. Para ello, ve al menú principal de Sonatype (System Dashboard) y regístrate para abrir una cuenta. Cuando lo hagas, tienes que pedir permiso para publicar tu librería en Maven Central. Este proceso no tiene ningún sentido (o por lo menos eso me parece a mí), ya que lo único que tienes que hacer es publicar un issue en JIRA para que te dejen subir tu librería con el mismo GROUP_ID que el que se le va a proporcionar a Maven Central. Para crear este issue tienes que ir al menú principal de Sonatype y pulsar Create, en la barra superior. Luego introduce los siguientes datos:-
-
- Project: Community Support – Open Source Project Repository Hosting
- Issue Type: New Project
- Summary: el nombre de tu librería. Por ejemplo “Memory Utils”.
- Group Id: la raíz del GROUP_ID, por ejemplo, com.codictados. Cuando recibas la aprobación, podrás subir cualquier librería que comience por com.codictados, como por ejemplo com.codictados.estalibreria.
- Project URL: el url de cualquier librería que desees subir. Por ejemplo, https://github.com/codictoados/codictados-rep.
- SCM URL: el url del control de versiones. Por ejemplo, https://github.com/codictoados/codictados-rep.git.
-

Paso 3: Habilitar el firmado automático en Bintray
Como hemos dicho antes, podemos subir una librería a Maven Central desde JCenter, pero tenemos que firmar la librería primero. Bintray nos permite activar el firmado automático en su página web para que las librerás se firmen solas al subirlas. Lo primero es generar la clave mediante una consola de comandos utilizando el siguiente comando (si tienes Windows, hazlo con cygwin):
1 2 3 |
gpg --gen-key |
1 2 3 |
gpg --list-keys |
1 2 3 4 5 |
pub 2048R/01ABCDEF 2016-08-17 uid Tu Nombre sub 2048R/98765432 2016-08-17 |
1 2 3 |
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys PUBLIC_KEY_ID |
1 2 3 4 |
gpg -a --export tu@email.com > public_key_sender.asc gpg -a --export-secret-key tu@email.com > private_key_sender.asc |




Paso 4: Preparar el proyecto de Android Studio
En la mayoría de los casos puede que tengas que subir a tu repositorio más de una librería del mismo proyecto y al mismo tiempo puede que no tengas que subir nada. [N. del t.: no he entendido lo que quiere decir esto.] Por ello lo mejor que puedes hacer es dividir el proyecto en diferentes módulos. Mi recomendación es que tengas al menos dos módulos, el módulo aplicación, donde se hace hace un ejemplo de uso de la librería, y el módulo librería, que contendría solamente el código de la librería que quieres subir al repositorio. Fíjate en que puedes tener más de un módulo librería en cada proyecto, así que siéntete libre de crear otro módulo: lo ideal es tener un módulo por librería.

1 2 3 4 5 6 7 |
dependencies { classpath 'com.android.tools.build:gradle:2.1.2' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' } |
1 2 3 4 5 |
bintray.user=TU_USUARIO_DE_BINTRAY bintray.apikey=TU_API_KEY_DE_BINTRAY bintray.gpg.password=TU_CONTRASEÑA_GPG |
apply plugin: 'com.android.library'
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
apply plugin: 'com.android.library' ext { bintrayRepo = 'maven' bintrayName = 'memory-util' publishedGroupId = 'com.codictados.utils' libraryName = 'Memory Util' artifact = 'memoryutil' libraryDescription = 'Librería para facilitar las operaciones con archivos en un dispositivo Android.' siteUrl = 'https://github.com/codictados/codictados-rep' gitUrl = 'https://github.com/codictados/codictados-rep.git' libraryVersion = '0.0.1' developerId = 'Codictados' developerName = 'Grupo Codictados' developerEmail = 'codictados@gmail.com' licenseName = 'The Apache Software License, Version 2.0' licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt' allLicenses = ["Apache-2.0"] } |
-
-
bintrayRepo
: este es el tipo de repositorio que hemos escogido, así que deja maven.bintrayName
: es el nombre del paquete que has creado en Bintray.publishedGroupId
: es el GROUP_ID que formará parte de la forma de escribir la dependencia en el gradle. Recuerda que por convención está formado por el nombre del desarrollador y el nombre del grupo de la librería.artifact
: el ARTIFACT que formará parte de la cadena para declarar la dependencia en el gradle. Obligatoriamente debe ser el nombre de la carpeta raíz del modulo librería (es decir, “memoryutil” [mira la captura de pantalla de la estructura del proyecto más arriba]). De lo contrario, fallará la compilación.libraryDescription
: una descripción de la librería.siteUrl
: la página donde se encuentran los archivos de la librería.gitUrl
: la página del control de versiones.libraryVersion
: la versión de la librería.developerId
: el alias del desarrollador, o sea, el tuyo.developerName
: el nombre del desarrollador, o sea, el tuyo.developerEmail
: el correo electrónico del desarrollador, al que llegará el mensaje de Bintray cuando la librería sea publicada.licenseName
,licenseUrl
yallLicenses
: hacen referencia a la licencia que escogiste cuando creaste el repositorio.
-
1 2 3 |
compile 'com.codictados.utils:memory-util:0.0.1' |
1 2 3 4 |
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle' apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle' |
Paso 5: Subir la librería a tu repositorio de Bintray
Ahora tenemos que subir la librería a nuestro repositorio de Bintray. Para ello, ve a la pestaña Terminal de Android Studio.
1 2 3 |
gradlew install |
1 2 3 |
BUILD SUCCESSFUL |
1 2 3 |
gradlew bintrayUpload |
1 2 3 |
SUCESSFULL |
artifact
no has puesto el nombre del módulo librería. También es posible que devuelva el error “No service of type Factory available in ProjectScropeServices”. En ese caso, cambia, en el build.gradle del proyecto, la versión de la dependencia 'com.github.dcendents:android-maven-gradle-plugin:1.3'
por la 1.4.1.
]
Ve ahora a Bintray y comprueba tu paquete. Verás que hay un cambio en el apartado Versions.

1 2 3 4 5 6 7 8 9 10 11 12 13 |
repositories { maven { url 'https://dl.bintray.com/codictados/maven/' } } ... dependencies { compile 'com.codictados.utils:memoryutil:0.0.1' } |
Paso 6: Sincronizar el repositorio de Bintray con JCenter
Sincronizar tu librería con JCenter es muy fácil. Solo tienes que abrir la página de tu paquete en Bintray y pulsar Add to JCenter.


jcenter()
podrá utilizar tu librería añadiéndo una sola línea al gradle:
compile 'com.codictados.utils:memoryutil:0.0.1'
Si quieres comprobar que tu librería se encuentra verdaderamente en JCenter, puedes ir a http://jcenter.bintray.com y buscar el directorio que coincida con el GROUP_ID y el ARTIFACT de tu librería. En nuestro caso tendríamos que abrir las carpetas com/codictados/utils/memoryutil/0.0.1.

Paso 7: Redireccionar la librería a Maven Central
No todos los desarrolladores utilizan JCenter. Muchos todavía siguen usandomavenCentral()
, así que vamos a subir nuestra librería a Maven Central también.
Para redireccionar la librería desde jCener a Maven Central, hay que hacer previamente dos cosas:
-
-
- Tu paquete de Bintray tiene que estar vinculado con JCenter
- Deben haber aprobado tu petición de abrir un repositorio de Maven Central
-


Buenisima tu informacion amigo, tengo una pequeña duda, cada vez que modifique mi libreria debo usar los comandos :
gradlew install
y
gradlew bintrayUpload
correcto?