|
1 2 3 |
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 |
repositories { maven { url 'https://maven.fabric.io/public' } } |
|
1 2 3 |
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 |
compile 'com.codictados.utils:memoryutil:0.0.1' |
|
1 |
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-betasi quieres.
|
1 2 3 4 5 6 |
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:
Y como hay muchos detalles, voy a dividir el proceso en siete pasos para poder describirlos de forma clara y minuciosa.
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.
[N. del t.: la mayoría de las librerías están subidas a la página de GitHub, ya que su sistema de versionado es muy popular, por lo que en los campos Website, Issue Tracker y Version control especificamos las páginas correspondientes de GitHub, pero si subes tu proyecto a otro repositorio, cambia esta información según tus necesidades.]
Aunque no hay ninguna regla para ponerle nombre a tu paquete (PackageName), podemos seguir cierta convención: utiliza solamente minúsculas y sustituye los espacios por guiones, como por ejemplo «memory-util».
Cuando hayas rellenado todos los campos obligatorios, pulsa Create Package para terminar.
-
- 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.
¡Y listo! Ahora ya tienes propio repositorio Maven en Bintray, esperando a que subas tu librería.
Ya hemos terminado con el proceso de registro en Bintray. Lo siguiente es Sonatype, el proveedor de Maven Central.
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.
-
Luego pulsa Update y habrás terminado.
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 |
gpg --gen-key |
|
1 |
gpg --list-keys |
|
1 2 3 |
pub 2048R/01ABCDEF 2016-08-17 uid Tu Nombre sub 2048R/98765432 2016-08-17 |
|
1 |
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys PUBLIC_KEY_ID |
|
1 2 |
gpg -a --export tu@email.com > public_key_sender.asc gpg -a --export-secret-key tu@email.com > private_key_sender.asc |
Pulsa Update para guardar las claves.
Y el paso final es habilitar el firmado automático. Ve a la página principal de Bintray y haz clic en maven.
Pulsa Edit
Marca la casilla GPG Sign uploaded files automatically.
Pulsa Update y ya está. Ahora cualquier librería que subas a tu repositorio Maven se firmará automáticamente y estará lista para enviarla a Maven Central con un solo clic.
Fíjate en que esto solo tienes que hacerlo una vez y servirá para todas las librerías que crees.
Ya hemos dejado Bintray y Maven Central preparados. Ahora vamos a la parte de Android Studio.
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.
Doy por sentado que sabes crear un módulo librería, así que no voy a hablar de esa parte. Es tan fácil como seleccionar File > New > New Module… > Android Library.
Lo siguiente es añadir el plug-in de Bintray al proyecto. Para eso, tenemos que modificar el archivo build.gradle del proyecto y añadirle las dos últimas líneas:
|
1 2 3 4 5 |
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 |
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 |
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,licenseUrlyallLicenses: hacen referencia a la licencia que escogiste cuando creaste el repositorio.
-
|
1 |
compile 'com.codictados.utils:memory-util:0.0.1' |
|
1 2 |
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.
Lo primero es comprobar que el código sea correcto y compilar los archivos de la librería (aar, pom, etc). Para ello, ejecuta el siguiente comando:
|
1 |
gradlew install |
|
1 |
BUILD SUCCESSFUL |
|
1 |
gradlew bintrayUpload |
|
1 |
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.
Si haces clic en Files podrás ver los archivos de la librería que has subido. ¡Así que estupendo! Ya has subido tu librería y está lista para que cualquiera pueda usarla.
Pero no tan rápido… La librería solo se encuentra en tu repositorio Maven, pero todavía no está en JCenter. Si alguien quisiera utilizar la librería tal y como está, tendría que añadir tu repositorio al archivo build.gradle del módulo como vemos a continuación:
|
1 2 3 4 5 6 7 8 9 10 11 |
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.
Y lo único que hay que hacer es pulsar Send.
Ahora solo tenemos que esperar unas 2 o 3 horas hasta que el equipo de Bintray acepte nuestra petición. Una vez hayan aprovado la sincronización, recibiremos un e-mail en nuestra cuenta de Bintray y en nuestra cuenta de correo informándonos del cambio. [N. del t.: también pueden enviarnos un mensaje informándonos de por qué no aceptan la librería.] Si ahora vamos a la pantalla de nuestro paquete, veremos que, donde estaba el botón Link to JCenter, ahora en la sección Linked to habrá habido cambios:
Ahora, cualquier desarrollador que use el repositorio 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.
Observa que solo tienes que sincronizar tu librería con JCenter una vez. Después, cada vez que modifiques tu paquete, por ejemplo, subiendo una nueva versión, borrando una versión antigua, etc., el cambio también afectará a JCenter. Pero dado que tu repositorio y el repositorio de JCenter son distintos, los cambios tardarán entre 2 o 3 minutos en sincronizarse.
Y ten cuidado. Si decides eliminar todo el paquete, los archivos de librerías que haya en el repositorio de JCenter no se borrarán. Permanecerán como una librería zombie y nadie podrá borrarla nunca. Así que cuando quieras borrar todo el paquete, borra primero todas las versiones que hayas subido a Bintray primero y luego borra el paquete.
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
-
Introduce tu nombre de usuario y tu contraseña de Sonatype y pulsa Sync.
Cuando lo hagas, verás que el valor del campo Last Sync Status cambia a Successfully synced and closed repo. Si algo falla, el motivo aparecerá en Last Sync Errors. Tendrás que solucionar todos los problemas uno a uno, ya que son muy estrictos con los requisitos para subir una librería a Maven Central. Por ejemplo, no se puede utilizar el carácter ‘+’ en la parte VERSION de la cadena que referencia la librería.
Después de esto podrás encontrar tu librería en el repositorio de Maven Central buscando 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.
¡Y, por fin, eso es todo! Aunque son muchos pasos, son pasos muy directos y la mayoría de ellos solo hay que realizarlos una vez. Después prácticamente no tienes que hacer nada más.
Espero que te resulte útil y ver algún día tu librería en un repositorio. ¡Suerte!








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?