Android studio의 Gradle 빌드가 너무나도 느려졌을 경우

asprofile

현재 한창 개발 작업중인 안드로이드 프로젝트에서 여러 라이브러리 모듈들을 사용하게 되면서 모듈에 대한 의존성이 조금 복잡해졌다. 나름 정리를 한다고 했지만 시간이 부족하여 많은 시간을 투자하진 못하여 여전한 상태로 계속 개발을 진행 하고 있었다.

그러던 와중에 언제부턴가 gradle build하는데 시간이 점점 느려지기 시작했다.
보통 2분~3분 정도 이상이 소요 되었고 11월 18일에는 급기야 10~20분을 소모하더니 중간에 out of memory를 내뱉기 시작했다. 참고로 당시 gradle 버전은 2.4에 Android studio는 1.4.1 이었다.

처음에는 빌드가 늦어지는 게 퍼포먼스 낮은 느린 회사의 컴퓨터 혹은 복잡한 의존성을 지닌 라이브러리 모듈 때문이라고 생각 했었다.  나름 새로 앱 프로젝트를 만들고 라이브러리 모듈을 붙였다가 떼었다가 하면서 라이브러리에 의한 빌드 시간을 측정하였었지만 의심되는 라이브러리 모듈 조차 보이지 않았었다.

회사 컴이 성능이 낮아서 집에 프로젝트를 import하여 빌드 해 봤지만 여전했었다. 정확한 이유가 판단이 되질 않는 상황에서 결국 gradle 에 –profile 패러미터를 붙여서 빌드 시간의 프로파일링을 시작 했다.

 

asprofile
(File -> Settings -> Buid, Execution, Deployment -> Compiler 에 가서 ‘Command-line Options’에 ‘–profile’을 입력 하면 된다.)

 

프로파일링을 패러미터를 추가하여 build를 하게 되면 프로젝트의 ‘app’폴더 내의 ‘build’폴더에 ‘reports’ 라는 폴더가 생성 되고 그 폴더 내부에 빌드 결과들과 시간 측저 등의 정보들이 저장된 profile파일들이 생성되고 그 내용은 웹페이지와 동일 하다

gradle_profiling
gradle build profiling 예제.

 

우여 곡절 끝에 profiling build를 시작한 결과는 다음과 같았다.

 

위 내용은 4분 26초 가량이 걸린 빌드의 profile내용인데 “app:transformClassesWithDexForDebug” 하는데 4분 19초를 사용하는 모습을 볼 수있다. 아마도 자바 컴파일러에서 앱, 라이브러리 모듈등의 클래스 파일들을 dex 파일로 패키징하는 과정인것 같은데 생각보다도 너무 느렸었다. (참고)

 

위에 profiling 한 결과에서도 알 수 있듯이 전체 빌드 시간 중에서 “app:transformClassesWithDexForDebug”혼자 다 시간을 먹는것을 알 수 있다. 혹여나 컴파일 해야 될 라이브러리가 많아서 그런게 아닌가 생각 할 정도 였다.

이것은 다른 프로필 내용인데 2분 50초 가량이 걸린것을 확인 할 수 있다.

 

그러다가 이전에 65k 메소드 이상을 사용하기 위해서 ‘multiDexEnable’속성을 ‘true’로 설정한게 생각 났었다. (참고) 문제가 생겨서 라기 보다는 앞으로 사용하는 라이브러리 모듈의 수가 늘어나면서 이슈를 방지 하기 위해서 설정 한 것이다.

이유는 잘 모르겠지만 저 옵션과 같이 붙은 옵션들을 찾아볼 수 있었다. 약간 오래된 옵션이긴 하지만, 프로젝트의 ‘build.gradle’파일에 dex 파일 변환에 대한 옵션들을 추가로 설정 할 수 있었다. 그 내용은 아래와 같다.

dexOptions에 2gb정도의 힙 사이즈를 설정 했다. 회사 컴퓨터가 성능이 낮고 메모리가 8GB밖에 안되서 다른 설정들을 추가로 안하고 vmoptions만 설정 했었는데 거기에서 문제가 발생한 거 같기도 하다. 아마도 저 dex변환 하기 위한 힙 메모리 설정에 기본 메모리 할당이 꽤 적은거 같고 그래서 oom이 발생 하는게 아닌 가 하는 생각이 들었다. (이는 나중에 더 찾아봐야 겠 다는 생각이 들 정도였다)

http://kevinpelgrims.com/blog/2015/06/11/speeding-up-your-gradle-builds/

옵션 적용 후 다시 빌드 하고 프로필 내용을 확인하니,

확연히 빨라진 모습을 볼 수 있었다.

 

 

 

You may also like

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.