2015년 7월 8일 수요일

jCenter에 안드로이드 라이브러리 배포하기

Android Library GearSlider를 만든 후 jcenter에 배포한 경험을 공유하기 위해 글을 작성합니다. 구글에 검색하여 나온 블로그 글을 참조했는데 중간에 막히는 부분이 있어서 다른 배포도구를 활용했습니다.

이 문서의 최종 목표는

1:  dependencies {  
2:    compile '나만의.안드로이드.라이브러리'  
3:  }  

위와 같이 build.gradle 파일에 작성함으로써 자신의 라이브러리를 다른 사람들과 쉽게 공유할 수 있게 만드는 것에 있습니다. 이 글을 읽기 전에 Android 공식 홈페이지의 글을 먼저 읽어 보시길 바랍니다.

단 한줄만으로 라이브러리를 가져올수 있다는 것은 굉장히 유용합니다. 그렇다면 우리는 어디에 라이브러리를 올려두어야 다른 안드로이드 개발자들이 쉽게 가져올 수 있을까요.

Android Studio는 어디에서 라이브러리를 가져오는 걸까?


Android Studio는 build.gradle 에 작성해둔 Maven Repository Server에서 라이브러리를 가져옵니다. 일반적으로 안드로이드는 jcenterMaven Central에서 라이브러리를 가져옵니다.

jcenter
jcenter는 bintray.com이 운영하는 Maven Repository입니다. jcenter의 라이브러리를 사용하기 위해서는 build.gradle 파일에 아래와 같이 정의해야 합니다.

1:  allprojects {  
2:    repositories {  
3:      jcenter()  
4:    }  
5:  }  


Maven Central
Maven Central은 sonatype.org이 운영하는 Maven Repository입니다.  Maven Central의 라이브러리를 사용하기 위해서는 build.gradle 파일에 아래와 같이 정의해야 합니다.

1:  allprojects {  
2:    repositories {  
3:      mavenCentral()  
4:    }  
5:  }  

jcenter와 Maven Central은 둘다 표준 안드로이드 라이브러리 저장소들이지만 완전히 다른 장소에서 운영됩니다. 서로 아무런 연관이 없습니다. (jcenter는 Maven Central 저장소에 배포하는 기능을 제공하긴합니다.)

그 외의 곳에서는?
그 외의 다른 저장소로부터 라이브러리를 가져오기 위해선 아래와 같이 저장소의 위치를 명시해주어야 합니다.

1:  repositories {  
2:    maven { url '다른저장소의주소' }  
3:  }  

그렇게 하면 그 저장소에 배포되어있는 다른 라이브러리를 가져올수 있습니다.
1:  dependencies {  
2:    compile '다른저장소에있는.라이브러리'  
3:  }  


그렇다면, 표준서버와 개인서버에 배포하는것 중 무엇이 좋을까요? 개인적으로 사용해야하는 라이브러리는 개인서버에 배포하는것이 낫고, 다른 개발자들과 함께 나누고 싶다면 표준서버에 배포하는것이 좋을겁니다. 그냥 개인의 판단에 따라 마음에 드는곳에 하시면됩니다. 이 글에서는 jCenter에 배포하는법에 대해서 다룹니다.

jcenter와 Maven Central에 대한 이해


jcenter와 Maven Central은 Java/Android 라이브러리들을 배포한다는 공통점을 가지고 있습니다.

초반에 Android Studio에서는 Maven Central을 기본 저장소로 선택했습니다. 과거버전 Android Studio 프로젝트의 build.gradle에서는 mavenCentral()이 정의 되어있을 것입니다.

하지만 Maven Central은 개발자 친화적이지 않았습니다. 라이브러리를 업로드하는것이 정말정말정말로 어렵고 geeky의 레벨에 도달한 개발자들이나 가능했습니다. 그리고 기타등등 문제들 때문에 Android Studio 팀은 jcenter를 기본 저장소로 변경하기로 결정했습니다.

Maven Central에서 jcenter로 변경한것에는 다양한 이유가 있습니다

  1. jcenter는 CDN을 통해 라이브러리를 배포합니다. 따라서 개발자들은 빠른 로딩속도를 즐길수 있습니다.
  2. jcenter는 지구상에서 가장큰 Java Repository입니다. 
  3. 저장소에 라이브러리를 업로드하는것이 정말정말정말 쉽습니다.
  4. 친근한 UI !
  5. 만약 Maven Central에 라이브러리를 배포하고싶다면 bintray site에서 한번의 클릭을 통해 배포할 수 있습니다. ( 한번 설정을 해주어야하긴 합니다)
위와 같은 이유 때문에 jcenter를 기본저장소로 지정한것이 굉장히 좋은판단이였다고 생각됩니다. 라고 하네요. (왜 처음에는 Maven Central를 지정했는지 의문입니다) 


gradle은 어떻게 저장소로부터 라이브러리를 가져올까?


어떻게 jcenter로 라이브러리를 업로드하는지 말하기전에. gradle이 어떻게 저장소로부터 라이브러리를 가지고 오는지 알아봅시다. 예를들어 build.gradle에 아래와 같이 적혀있다면, 그 프로젝트에 해당 라이브러리 파일이 다운로드 됩니다.

1:  compile 'org.nhnnext.sunghwanjo:gearslider:0.1.1'  

기본적으로 라이브러리를 가져오기 위한 문자열은 3개의 부분으로 구성되어 있습니다.

1:  GROUP_ID:ARTIFACT_ID:VERSION  

위에서 GROUP_ID는 org.nhnnext.sunghwanjo 입니다. ARTIFACT_ID는 gearslider이고 VERSION은 0.1.1이죠.

GROUP_ID는 라이브러리의 그룹이름을 의미합니다. 같은 문맥상 여러가지일을 하는 하나이상의 라이브러리가 있을 가능성이 있습니다. 이럴때 GROUP_ID를 공유하면 됩니다. 보통 개발자의 패키지명으로 합니다.
ARTIFACT_ID는 라이브러리의 이름입니다. VERSION은 버전정보인데 어떤 텍스트가 들어가도 상관없습니다. 다만, x.y.z의 형태로 작성하는 것을 추천합니다. 만약 본인이 원한다면 뒤에 -beta를 붙여도 괜찮습니다.

1:  dependencies {  
2:    compile 'com.squareup:otto:1.3.7'  
3:    compile 'com.squareup.picasso:picasso:2.5.2'  
4:    compile 'com.squareup.okhttp:okhttp:2.4.0'  
5:    compile 'com.squareup.retrofit:retrofit:1.9.0'  
6:  }  

위와 같이 의존성을 추가한다면 무슨일이 벌어질까요? Gradle은 Maven Repository Server에 원하는 라이브러리가 존재하는지 물어볼 것입니다. 존재한다면 주로 GROUP_ID:ARTIFACT_ID:VERSION_ID의 형태로 요청된 라이브러리의 경로를 얻을 것입니다.

그리고 Android Studio는 우리의 장비에 파일들을 다운로드하고 컴파일합니다. 그렇다면 라이브러리를 가져오는것은 끝!

이제 저장소로부터 library를 가져오는 방법에 대해서는 알지만 jar 와 aar 파일이 저장소 서버에 올려졌다는 것은 잘 모를것입니다. 또는 aar에 대해서 잘 모른다거나.

aar 파일 포맷을 알아보자


jar파일이 그냥 커피라면 aar 파일이 top 입니다.
aar 파일은 Android 라이브러리 프로젝트의 컴파일된 묶음파일입니다. 압축파일? Android 라이브러리는 AndroidManifest.xml, Resources, Assets, JNI처럼 jar 파일의 표준에는 벗어나는 안드로이드 종속적인 파일들을 포함할 필요가 있기 때문에 생겼습니다. 그래서 aar은 앞서 말한것들을 모두 포함합니다. jar 파일은 aar 파일안에 classes.jar 라는 이름으로 포함되어 있습니다. 아래는 파일 리스트 입니다.
  • /AndroidManifest.xml (mandatory)
  • /classes.jar (mandatory)
  • /res/ (mandatory)
  • /R.txt (mandatory)
  • /assets/ (optional)
  • /libs/*.jar (optional)
  • /jni/<abi>/*.so (optional)
  • /proguard.txt (optional)
  • /lint.jar (optional)
보시다시피 aar 파일은 안드로이드를 위해 특별히 설계되었습니다. 이 문서에서도 aar 형태의 라이브러리를 어떻게 만들고 배포하는지 작성할 것입니다.

jcenter에 나만의 라이브러리를 업로드하는 방법


이제 저장소에 라이브러리를 올리기 위한 기본적인 지식들은 갖고 있으니, 정말로 배포를 시작해봅시다. 우리의 목표는 간단합니다. "http://jcenter.bintray.com"에 우리의 라이브러리를 업로드 하는 방법. 입니다. 

해야할 단계가 좀 있긴한데 전체적으로 그렇게 어렵지는 않습니다. bintray가 정말 잘 만들어 놨거든요. 전체적인 시스템은 이렇습니다.

이미지출처 : http://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en

Android Studio에서 arr, pom 파일들을 빌드한후 Bintray로 업로드 합니다. 그리고 jcenter와 동기화. 그러면 끝입니다. Maven Central과 연동할 수도 있는데 그건 다루지 않습니다. 자료가 많고 되게 쉽거든요.

앞으로 할 작업들을 단계별로 나누어서 설명하도록 하겠습니다.

Part 1: Bintray에 패키지 만들기


첫째로. bintray에 패키지를 만들 필요가 있습니다. bintray 계정이 필요하고 웹사이트에 패키지를 만들겁니다.

단계 1: bintray.com 에 계정을 등록합니다. 

단계 2: 등록이 끝났으면, maven을 클릭합니다. (현재 저는 1개의 패키지가 등록되어있어서 (1)이 있습니다. )


단계 3: 우리의 라이브러리를 위한 패키지를 새롭게 생성합니다. Add New Package 클릭.

단계 4: 요구하는 정보를 모두 입력합니다.


패키지 이름을 정하는데 규칙은 없지만 일반적인 convention이 존재합니다. 모든 문자는 소문자여야 하고 단어 사이에는 하이픈(-)을 붙이도록 합니다. gear-slider 이렇게요.

필요한 정보를 모두 입력한후에 Create Package 를 누르면 됩니다.

단계 5: 정상적으로 완료되었다면 Edit Package로 이동될 것입니다. Edit Package 글자 아래 패키지명을 클릭하여 상세페이지로 이동합니다.


끝났습니다! 이제 우리는 라이브러리를 위한 Bintray Maven Repository를 가진것입니다. 이 공간에 업로드 되었다면 jcenter와 Maven Central에 업로드 하지 않아도 배포를 할 수 있긴합니다. (위에서 언급한 그 외의 장소에서 배포하는 경우를 활용하시면 됩니다.)


짜잔~. 하지만 현재 Versions 탭에는 아무런 정보가 없을것입니다. 위의 스크린샷의 경우 이미 배포를 한 상황이기 때문에 Versions탭에 정보가 있는것입니다.

Part 2: Android Studio Project 준비하기


이 문서를 읽는 분들은 라이브러리 프로젝트를 만드는 방법은 알것이라고 가정합니다. 하지만 GearSlider 프로젝트의 구조를 말씀드리자면 


GearSliderDemo라는 Project가 있습니다. 그 안에 Application Module인 app과 Library Module인 gearslider가 있습니다.

Application Module은 build.gradle에 아래와 같이 명시되어있고

1:  apply plugin: 'com.android.application'  

Library Module은 build.gradle에 아래와 같이 명시되어있습니다.

1:  apply plugin: 'com.android.library'  

Library Module은 보통 File-New-New Module을 통해 생성합니다. 



Application Module은 저장소에 배포하지 않을것이고 Library Module을 저장소에 업로드 할 것입니다. 즉, Library Module에 Gradle Task를 추가할 것입니다. 우리는 novoda:bintray-release 를 활용해서 좀 더 쉽게 배포할겁니다.

단계 1: 프로젝트의 build.gradle에 아래와 같은 문장을 추가합니다.

1:  dependencies {  
2:    ....  
3:    classpath 'com.novoda:bintray-release:0.3.0'     
4:  }  

단계 2: 라이브러리 모듈의 build.gradle에 아래와 같은 문장을 추가합니다. 
1:  apply plugin: 'com.android.library'  
2:  apply plugin: 'com.novoda.bintray-release'  
3:  publish {  
4:    userOrg = 'sunghwanjo'  
5:    groupId = 'org.nhnnext.sunghwanjo'  
6:    artifactId = 'gearslider'  
7:    publishVersion = '0.1.1'  
8:    desc = 'GearSlider UI for Android - It was inspired by the Adjust UI of Instagram.'  
9:    website = 'https://github.com/sunghwanJo/GearSlider'  
10:    issueTracker = "${website}/issues"  
11:    repository = "${website}.git"  
12:  }  

1번줄은 기본적으로 작성이 되어있을 것입니다. 2번줄은 bintray-release를 사용하기 위함이니 작성해줍니다. 4~11번 줄은 자신의 설정에 맞추어서 작성합니다.

설정이 완료되면 bintray.com으로 배포할 준비는 완료되었습니다. 이제 남은 작업은 2가지밖에 없습니다. bintray.com으로 배포하는 것과 jcenter와 연결하는 것.

Part 3: bintray에 라이브러리를 배포하자


단계 1: bintray.com에 배포하자.
novoda:bintray-release에서는 bintrayUpload라는 태스크를 실행시킴으로써 배포를 할 수 있게 도와줍니다. 

 $ ./gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false  

위와같이 터미널에서 실행을 시키시면 bintray에 배포하는것은 완료된 것입니다.

BINTRAY_KEY는 bintray Profile Edit 페이지에 API KEY 메뉴를 클릭해서 확인하실 수 있습니다.

 이제 Bintray로 돌아가보면 Versions 영역에 새로운 버전이 추가되었을 것입니다. 



그리고 Files 탭에 들어가보면

라이브러리 파일이 성공적으로 들어가있는것을 확인하실 수 있습니다. (짝짝짝)

하지만, 아직 남은것이 있습니다. bintray에 배포되었다는 의미는 누군가 당신이 올린 라이브러리에 접근하기 위해선 build.gradle파일에 아래와 같이 저장소의 url을 지정해 주어야만합니다.
(저장소의 url은 위의 이미지를 보시면 How it works 아래에 있는 주소입니다. ex: https://dl.bintray.com/sunghwnjo/maven/)

 repositories {  
   maven {  
     url 'https://dl.bintray.com/sunghwanjo/maven/'  
   }  
 }  

https://dl.bintray.com/당신의이름/maven/ 이 bintray에서 당신의 라이브러리를 저장하는 장소입니다.

우리가 jcenter 에 라이브러리를 배포하게 된다면 굳이 위와같은 문장없이도 라이브러리를 가져올 수 있습니다. jcenter 는 안드로이드의 기본 라이브러리 저장소 이니깐요.

단계 2: jcenter와 연동하자(혹은 배포하자).

이미지를 따로 저장해 두지않아 위에서 언급한 블로그에서 이미지를 사용하도록하겠습니다.

아래와 같이 Add to JCenter를 클릭하게 되면 jcenter에 연결하는 팝업이 생성됩니다.





그리고 그냥 아무것도 안적어도 되고 적어도 되고 Send 버튼을 눌러줍니다.

이제 아침, 점심, 저녁 혹은 야식을 먹고 오시면 bintray 팀의 결과를 알 수 있습니다. 만약 연결이 되었다면
아래와 같은 jecenter 뱃지가 생길것입니다.


이제 jcenter에 업로드 되었기 떄문에 jcenter()가 명시되어있는 프로젝트에선 어떤 개발자든 아래의 한문장으로 라이브러리를 사용할 수 있습니다.

 compile 'org.nhnnext.sunghwanjo:gearslider:0.1.1'  

만약 jcenter안의 라이브러리 파일들을 확인하고 싶다면? http://jcenter.bintray.com 에서 확인해 볼 수 있습니다. 예를들어 org -> nhnnext -> sunghwanjo -> gearslider 이런식으로 말이죠.

jcenter와 연동했다면 패키지를 수정했을 경우에 자동으로 연동이 되어집니다. 한번만 연동하면 된다는 것이죠. 하지만, bintray 웹인터페이스에서 패키지 전체를 삭제하는 경우에는 jcenter의 library 파일들이 삭제되지 않습니다. 그러면 좀비파일이 되어 jcenter 서버에 둥둥 떠다니는 것이지요. 그러니 꼭 각 버전파일들을 전부 삭제한 후에 패키지를 삭제하는것을 추천드립니다.


이로써 jCenter에 안드로이드 라이브러리 배포하기 는 끝입니다. 자신만의 라이브러리를 만들어서 배포하고 싶은 개발자분들에게 도움이 되었으면 좋겠습니다. :D


댓글 12개:

  1. 답글
    1. 오래된 글인데 문제는 없으셨는지요ㅋㅋ... 저야말로 봐주셔서 감사합니다

      삭제
    2. 오래된 글인데 문제는 없으셨는지요ㅋㅋ... 저야말로 봐주셔서 감사합니다

      삭제
  2. 너무나도 쉽게 잘 정리된 글 감사합니다!!

    답글삭제
  3. 좋은 내용 정리해 주셔서 감사합니다.

    답글삭제
    답글
    1. 아이고 지금도 유효할지는 모르겠으나 도움이 되셨으면 좋겠네요

      삭제
  4. 도움되는 좋은 글 잘 보았습니다.

    답글삭제
    답글
    1. 현재도 잘 워킹할지는 모르겠지만 감사합니다 :D

      삭제
  5. 대문도 멋있고 글내용도 좋고~~ 잘 보았습니다.
    build.gradle파일안에 jcenter()가 뭔지 궁금해서 검색해보던차에 궁금증이 싹 해결됬습니다. 감사합니다.

    답글삭제
    답글
    1. 도움이 되었다니 저도 감사합니다 (_ _ )

      삭제
  6. 1xbet korean online sports betting review & bonus codes
    1xbet korean betting review & bonus codes. If you want to septcasino place your first bets, you can febcasino check them out 1xbet here.

    답글삭제