[태그:] Gradle

  • Gradle 개요

    Gradle OverView

    Gradle은 Gradle 사에서 만든 범용 빌드 도구중에 하나입니다. 안드로이드에서 빌드 뿐만 아니라, java, c/c++ 등의 모든 범용 언어를 지원합니다. 그러므로 엄청 강력한 툴이지요. 그래서 Gradle을 한번 배워두면 다른언어로 개발하더라도 빌드 스크립트를 처음부터 다시 작성할 필요없이 재사용하실 수 있습니다. 누차 강조하지만 꼭 gradle을 배워보도록 합시다.

    다음은 gradle의 주요 특징 4가지 입니다.

    1. Polyglot Build

    Gradle은 각 언어를 플러그인으로 구별합니다. java는 java, java 웹 프로젝트는 war, 안드로이드 앱은 com.android.application 플로그인을 사용하면 됩니다.

    2. 도구통합

    gradle은 이클립스, 안드로이드 스튜디오 와 같은 IDE에서 정말 편리하게 사용할 수 있도록 창을 제공하고있습니다. 또한 젠킨스와 함께 활용할 수 도있습니다. 소스코드가 git에 업로드되면 서버에서 CheckStyle, FindBugs 등의 플러그인을 활용하여 소스코드가 잠재적으로 가진 문제를 검출하여 개발자에게 통보하거나 위험한 코 드를 merge할 수 없도록 강제적으로 할 수 있습니다.

    3. 외부 라이브러리 관리 자동화

    Gradle의 또다른 장점중 하나는 개발자가 더는 외부라이브러리를 관리하지 않아도 된다는 점입니다. 개인적으로 이점이 가장 마음에 듭니다. 이클립스에서 개발했던 과거의 경우에는 libs 폴더에 원하는 외부라이브러리 파일을 직접 복사하였지만, Gradle 에서는 단순히 외부 저장소 위치와 라이브러리의 그룹, 이름, 버전 등을 지정해주면 알아서 다운로드하고 빌드에 포함시키게 됩니다. 이얼마나 편하고 좋습니까.

    4. 고성능 빌드

    Gradle은 점진적 빌드, 빌드캐싱, 병렬 빌드 기능을 지원하는 고성능 빌드를 지향합니다. 하지만 실제로 우니도우 환경에서 안드로이드 앱을 빌드해보면 gradle 메모리 사용량이 많고 빌드시 CPU 점유율이 엄청 높게 잡힙니다. 실무에서 권장하는 사양은 메모리 8GB와 SSD 장착입니다. 메모리 4GB에서 모듈의 수가 늘어나면 Out of memery 현상이 발생합니다. 또한 heap이 부족하다고 난리치기도 한답니다.(진짜 경험)

    안드로이드 스튜디오에서 Gradle의 특징을 살펴보겠습니다.

    1. 멀티 프로젝트 구조

    안드로이드 스튜디오에서 프로젝트를 생성하면 멀티 프로젝트로 생성됩니다. app이라는 폴더가 있는데 이를 Gradle에서는 모듈이라고 부릅니다. gradle에서는 app 모듈뿐만 아니라 새로운 모듈을 추가하여 모듈별로 src 폴더를 포함하게 됩니다.

    2. src폴더 구조가 다름

    androidTest, main, test 폴더를 확인하실 수 있습니다. Test 폴더는 Local Unit Test 를 지원합니다.

    3. libs 폴더

    이클립스 libs 폴더에는 빌드하는데 필요한 외부라이브러리를 직접 포함시켜야 했습니다. 하지만 gradle에서는 의존성 관리를 gradle이 담당하므로 libs 폴더를 사용하지 않아도됩니다. 필요한 스크립트 파일에서 외부라이브러리의 저장소와 버전등을 지정하면 빌드할 때 알아서 해당 버전을 다운로드하여 포함합니다. 또한, +옵션등을 적용하면 최신버전을 자동으로 다운로드 할 수 있습니다.

    4. bin 폴더

    gradle에서 빌드를하면 build/output/apk 폴더에 apk 파일이 위치하게됩니다. 혹은 AAR파일도 있게 됩니다.

  • Unity Gradle 빌드에 관하여

    Unity 로 앱 및 게임을 구현하는데 있어

    안드로이드 Native 기능을 사용하고자 하는 경우,

    Plugin 형태(jar, aar)로 만든후 프로젝트에 import 하여 빌드해서 사용하게 된다.

    그리고 최근 안드로이드 Native 기능들의 경우 대다수 모듈들이

    Gradle 등의 빌드 툴을 통해 그때 그때 필요한 내용을 다운받아 사용하게 되어있다.

    이러한 점 때문에 빌드시 문제가 생길 소지가 있다.

    Unity가 빌드하는 동안 Native 모듈에서 사용하는 라이브러리를 다운받지 못해 

    필요한 Class를 찾지 못하는 등의 문제를 발생시키기 때문입니다.

    이를 해결하기 위해 Untiy에는 Gradle 빌드를 지원하고 있다.

    이 Gradle 빌드를 사용하는 경우 개발자는 보통 다음의 수순을 따르게 된다.

    1. Build System을 Gradle로 설정 및 Export Project 체크 하여 빌드 진행

    2. Export 된 프로젝트를 안드로이드 스튜디오로 열고 빌드 관련된 사항들 체크

        (build.gradle 내용 확인 및 컴파일 이슈 확인)

    3. 최종 빌드 확인 후 유니티 상에서 build.gradle 파일 수정

    4. Export Project 체크 해제 후 빌드 진행.
       (이 시점부터 안드로이듯 스튜디오로 프로젝트를 열어서 빌드할 필요 없음)

    하나씩 자세히 살펴보면 다음과 같다.

    1. Build System을 Gradle로 설정 및 Export Project 체크 하여 빌드 진행

    우선 유니티에서 빌드를 진행하며 에러나는 상황을 확인하는 것은 스트레스가 크고 시간이 오래걸린다.

    그래서 우선 Build System을 Gradle로 설정하고 Export Project 를 체크하여 안드로이드용 프로젝트를 추출하는것을 우선으로 한다.

    2. Export 된 프로젝트를 안드로이드 스튜디오로 열고 빌드 관련된 사항들 체크

        (build.gradle 내용 확인 및 컴파일 이슈 확인)

    추출된 프로젝트를 안드로이드 스튜디오로 열고 빌드를 진행하여,

    에러 상황을 체크하고 

    build.gradle 파일의 repositories 및 dependencies의 내용을 추가 및 수정한다.

    이 단계에서는 발생되는 에러가 있어서 (에러가 기억이 안나요…ㅠㅠ) 

    보통은 아래 그림과 같이 google(), jcenter() 순서로 기입을 하고 시작하는 것이 좋다.

    그 외에 빌드 후 테스트 하는 경우 

    유니티가 뽑아주는 build.gradle은 Debug 빌드시에는 Key Signing 하는 부분이 생략되어 있기 때문에, apk 설치시 에러(INSTALL_FAILED_NO_MATCHING_ABIS)가 발생할 수 있다. 

    이를 미연에 방지하기 위해 다음의 코드를 추가하는 것이 좋다.

    여기까지 빌드 하고 확인이 되었다면 유니티로 돌아가자.

    3. 최종 빌드 확인 후 유니티 상에서 build.gradle 파일 수정

    이제 유니티 상에서 빌드를 할 수 있도록 build.gradle을 설정해야 한다.

    PlayerSerttings -> Publishing Settings로 가면 Custom Gradle Template이라는 항목이 존재한다.

    이것을 체크해야 유니티에서 빌드시 사용하는 build.gradle 파일을 수정할 수 있다.

    체크하면 Assets/Plugins/Android/mainTemplate.gradle 파일이 생기며 이 파일의 내용을 수정하면

    Gradle 빌드시 이 파일을 기반으로 빌드를 진행하게 된다.

    mainTemplate의 내용에 추가할 것들은  

    앞서 [2. Export 된 프로젝트를 안드로이드 스튜디오로 열고 빌드 관련된 사항들 체크] 과정에서 진행했던 안드로이드 스튜디오 프로젝트의 build.gradle에 추가한 것들을 옮겨주면 된다.

    [ 샘플 파일을 올려두었으니 참고 할 것 ]

    4. Export Project 체크 해제 후 빌드 진행. 
       (이 시점부터 안드로이듯 스튜디오로 프로젝트를 열어서 빌드할 필요 없음)

    이제 Export Project 체크를 해제하고 빌드를 진행하면 안드로이드 스튜디오 프로젝트 빌드 없이도 정상적으로 빌드되는 것을 확인할 수 있다.

    하지만 사용하는 라이브러리 버전에 따라서 

    빌드중에 다음과 같이 Gradle 버전 에러가 나는 경우가 있다.

     CommandInvokationFailure: Gradle build failed. C:\Program Files\Java\jdk1.8.0_181\bin\java.exe -classpath “C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-4.2.1.jar” org.gradle.launcher.GradleMain “-Dorg.gradle.jvmargs=-Xmx2048m” “assembleDebug”

    이 경우에는 유니티 내의 Gradle 버전을 올리면 해결할 수 있다.

    유니티 기본 설치폴더 및 안드로이드 스튜디오 기본 설치 폴더를 기준으로 

    C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle 내의 lib 폴더(유니티 내에서 사용중인 Gradle 버전)를 

    안드로이드 스튜디오

    C:\Program Files\Android\Android Studio\gradle\gradle-4.6 폴더 내의 lib 폴더(안드로이드 스튜디오에서 사용한 최신 버전)로 교체하면 된다.

    이 작업시에는 유니티를 종료하고 작업해야 한다.