안드로이드 외부 라이브러리 추가 - andeuloideu oebu laibeuleoli chuga

- 들어가기 앞서.

 안드로이드 앱을 개발하다보면, 다양한 외부라이브러리를 참조해야할 경우가 발생합니다. 이를 프로젝트에서의 dependency(의존성) 이라고 합니다. 과거 이클립스의 경우에는 라이브러리 파일을 다운로드하여 프로젝트의 libs 폴더에 복사하고 다시지정하는 과정이 매우 번거로웠습니다. 하지만 gradle 에서는 이런 문제점을 해결하였습니다. 그만큼 gradle은 이전에 문제가 되었던 많은 부분들을 보완한것을 알 수 있습니다.



- 가장 기본적 Gradle 외부라이브러리 참조 방법

 app module의 dependencies 블록에 ㅂ외부 라이브러리를 지정합니다. 외부 라이브러리를 지정할때 compile 명령을 사용합니다. 

http://fsd-jinss.tistory.com/36 앞서 생성했던 안드로이드 그래들 프로젝트에서의 app module gradle dependencies 부분을 살펴 보시겠습니다.

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) //1
testCompile 'junit:junit:4.12'                                     //2
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'            //3
}


1. libs폴더의 JAR파일을 추가하는 방법입니다.

2. 테스트 빌드시 참조하는 라이브러리 입니다.

3. 로컬에 없는, 외부라이브러리를 참조합니다. Gradle 에서 외부 라이브러리를 참조하기 위해서는 다음 세가지 정보가 필요합니다.


- group Id : 라이브러리 패키지 이름이 필요합니다. (com.android.support)

- arifact id : 라이브러리 이름이 필요합니다. (appcompat)

- version   : 참조하는 버전명이 필요합니다. (v7:26.0.0-alpha1)




다른 모듈 소스코드 참조하기


아래는 라이브러리 모듈(library module, app module 말고요)의 소스코드 참조하는 방법입니다.

dependencies {

  compile project(':mylibrary')

}


다음은 하위폴더에 위치한 라이브러리 모듈의 소스코드를 참조하는 방법입니다.

lib_modules 폴더 하위에 mylibrary가 위치한다면 다음과 같이 기술합니다.

dependencies {

  compile project(':lib_modules:mylibrary')

}


디버그 모드와 릴리즈 모드 참조하기

 dependencies {

 debugCompile 'com.abcd.test:myTest-android:1.3'

 releaseCompile 'com.abcd.test:myTest_release-android:1.3'

}

디버그 컴파일과 릴리즈 컴파일로 구분합니다.



안드로이드 유닛 테스트 참조하기

dependencies {
androidTestCompile 'junit:junit:4.12'
}

참고로 androidTestCompile은 안드로이드 UI 테스팅할때 사용하는 명령어로, testCompile과 구별됩니다.



공개라이브러리 참조하기 - JAR 파일

HTTP 클라이언트와 웹소켓 클라이언트를 지원하는 AndroidSync 참조 예입니다. github에 Gradle에서 간편하게 추가하는 방식을 소개하고있습니다.

 dependencies{

 compile 'com.koushikdutta.async:androidasync:2.+'

}



공개라이브러리 참조하기 - AAR 파일

AAR파일을 참조해야하는 경우가 있습니다.  @aar을 끝에 붙여주면 됩니다.


dependencies{

  complie 'com.abcd:andrid-xxx:1.0.1@aar'

}



로컬에 있는 AAR파일 참조하기

로컬에 AAR을 복사하여 참조하는 경우도 있을 수 있습니다. 이럴때는 libs 폴더에 복사후 gradle을 통해 참조할 수 있습니다. 

이때 module build.gradle 파일의 dependencies 블록만 변경해서는 안되고, repositories 블록도 함께 변경해야 합니다.

repositories{
flatDirs{
dirs 'libs'
}
}


다음 예는 mylibrary 모듈의 패지 이름과 aar파일 예시이름 버전 1.0으로 로컬에 있는 경우 예입니다. 

dependencies{

  compile 'com.example.mylibray:myTest:1.0@aar'

}

.



.so(JNI)파일 참조하기

so 파일을 참조해야하는 경우도 있습니다. libs폴더 하위에 x86, armeabi-v7a 등 폴더를 만들고 그에맞는 .so파일을 복사하면 됩니다. (JNI 참고하세요)

아래와 같이 작성하시면 되겠습니다.

sourceSets는 안드로이드 앱을 gradle로 빌드하기 위해 사전에 약속된 폴더 구조입니다. 메인소스의 jniLibs.srcDirs 항목을 libs로 지정합니다.


android {

 sourceSets{

    main{

     jniLibs.srcDirs = ['libs']

    }

  }


}


그 외의 경우.

Gradle은 외부라이브러리르 가져올때, 그라이브러리가 내부적으로 참조하는 다른라이브러리도 함께 땡겨옵니다. 이럴 때exclude group 으로 특정 참조그룹을 제외시킬 수 도 있습니다. 현재 프로젝트와 의도지않게 가져오는 라이브러리의 버전 충돌문제로 사용하는 편입니다.

예제는 앨범 이미지 피커라이브러리인데 거기서 설명하는 내용이다. 다만 첫 번째 repositories는 Gradle중 프로젝트 단위의 그래들안에 allprojects밑 repositories를 의미하고.. 두 번째 dependencies는 모듈 단위의 그래들 안에 dependencies를 의미하는 것이므로.. 그 안에 작성해서 사용하면 된다.

그런데 여기서!

내가 저 라이브러리를 사용하는데 중간 수정하고 싶은 곳이 생겼다면? 해당 라이브러리의 string.xml을 열어 수정해야 겠다면 위의 방법으로는 해당 라이브러리 소스코드를 접근할 수 없다. Ctrl키를 눌러 해당 클래스로 들어가도 수정은 불가능하다. 이 때가 두 번째 방법이다.

[외부 라이브러리를 패키지 안에 넣기]

1. 깃허브에서 해당 폴더를 다운받는다. (Download ZIP으로)

안드로이드 외부 라이브러리 추가 - andeuloideu oebu laibeuleoli chuga

2. 다운받은 압축파일을 해제하고.. 필요없는 경우 sample 폴더를 삭제한다. (샘플은 말 그대로 예제기때문에.. 해당 프로젝트는 사용할 일이 없다)

3. 안드로이드 스튜디오에서 File -> New -> Import Module.. 클릭하고, 다운받은 압축 푼 폴더의 경로를 입력한다. (바탕화면 경로일 경우, 윈도우 사용자 계정이 한글이면 안된다)

안드로이드 외부 라이브러리 추가 - andeuloideu oebu laibeuleoli chuga

이 작업을 마치면 그래들이 알아서 동기화작업을 수행하는데, 경고 메시지나 업데이트 관련 메시지가 뜨면 그대로 해주면 된다.

안드로이드 외부 라이브러리 추가 - andeuloideu oebu laibeuleoli chuga

그럼 이렇게 내가 원래 생성한 프로젝트(app)과 import한 multipleimageselect가 보인다.

4. 이제 사용할 수 있는 것이 아니라.. 첫 번째 방법에서 그래들 밑의 dependencies에 해당 코드를 넣은 것처럼 비슷한 결과물(?)을 내기 위해 File -> Project Structure을 킨다.