이클립스(Eclipse) 안드로이드 프로젝트를 그레이들(Gradle) 안드로이드 프로젝트로 바꾸는 이야기

| 2015. 3. 11. 02:18

0. 왜 나는 이 이야기를 시작하게 되었나?

현재 맡고 있는 안드로이드 프로젝트는 젊고 재기발랄한 안드로이드 개발자에 의해 시작되었다. 그가 안드로이드 개발을 시작했을 때는 아마 안드로이드 스튜디오라는 IDE가 대중적이지도 않았고 그레이들이라는 빌드 자동화 툴도 그다지 인지도가 없었을 것이다. 그래서 그는 그 당시의 안드로이드 개발자라면 누구나 그렇듯 이클립스로 개발을 했다. 정교하게 잘 짜여진 멋진 애플리케이션이다.

하지만 2015년에서야 안드로이드 개발을 시작한 나는 이제 안드로이드 공식 IDE로 채택된 안드로이드 스튜디오와 그 안드로이드 스튜디오에서 기본으로 지원하는 그레이들이라는 도구를 사용할 필요가 있었다. 향후의 지원 및 튜토리얼 등을 고려하면 안드로이드 스튜디오를 사용하는 것이 유리할 것이고 그레이들을 사용하면 외부 라이브러리의 임포트가 간편하고, 코드 몇 줄로 다양한 빌드 옵션을 지원할 수 있기 때문이다. 무엇보다 크래시리틱스(Crashlytics)를 효율적으로 사용하기 위해는 그레이들의 사용이 거의 필수적이었다. 따라서 오래 미뤄오던 그레이들 프로젝트로의 임포트를 감행하기로 마음 먹었다.

1. 이 당시의 나는 무엇을 알고 있었나?

사실상 아는 것이 전무하다. 나는 안드로이드도 입문자고 자바도 입문자며 그레이들이 뭔가 빌드를 편하게 해주는 것이라는 것 정도만 알고 있지 나머지는 잘 모른다. 이클립스에 능한 것도, 안드로이드 스튜디오에 능한 것도 아니었다. 아마 그래서 이 작업이 조금 더 길어졌을 것이다.

2. 그래서 무엇을 했나?

우선 안드로이드 스튜디오와 구글에서 공식적으로 지원하는 마이그레이션 가이드를 참고했다. 가이드는 매우 간단했다. 현재 이클립스에서 사용하고 있는 프로젝트를 이클립스 최신 버전에서 연 뒤 그레이들 프로젝트로 익스포트하면 끝이라는 것이다. 그래서 그 옵션을 시도했다.

2-1. 무엇이 문제였나?

원래 이클립스 프로젝트였던 나의 현재 안드로이드 프로젝트는 내가 다소 간의 씨름 끝에 안드로이드 스튜디오에서 원활하게 돌아가게끔 어딘가가 조금 수정된 상태였다. 그 프로젝트를 다시 이클립스로 열려고 하니 뭔가 잘 되지를 않았다. 아주 시작부터가 문제였다.

2-2. 어떻게 해결했나?

나의 실수는 해당 프로젝트를 계속해서 안드로이드 프로젝트로서 임포트하려고 시도했던 것이었다. 그냥 일반적인 자바 프로젝트로 임포트를 하는 것이 해결책이었다. 따라서 자신의 프로젝트가 뭔가 이상하다 싶으면 안드로이드 프로젝트로도 임포트해보고 그냥 자바 프로젝트로 임포트하라. 그리고 웬만하면 원본 소스의 오염(?)을 막기 위해 프로젝트 파일을 워크스페이스로 복사하는 방식을 택하라.

3. 그 다음엔 무엇을 했나?

임포트를 마쳤으니 가이드대로라면 다시 그레이들 프로젝트로 익스포트해야 했다. 그래서 익스포트를 시도했다.

3-1. 무엇이 문제였나?

일단 프로젝트에 에러가 한가득이었다. 외부 라이브러리들이 뭔가 엉켜서 임포트된 결과물이 아닌가 추정했다. 그레이들 익스포트는 그런 에러들이 선결되어야 가능한 모양이었다.

3-2. 어떻게 해결했나?

나의 프로젝트는 다소 복잡한 라이브러리 구조를 가지고 있었다. 최대한 외부 라이브러리 수를 줄이자는 명목하에 UX를 대거 수정해서 두 가지 큰 외부 라이브러리를 제거했다. 남은 외부 라이브러리(여기서 외부 라이브러리라는 것은 원래 앱과 수평적 디렉토리 구조에 위치해 있는 라이브러리를 말한다. 이미 디렉토리 내부로 포함되어 있는 라이브러리들은 임포트를 해도 에러를 뿜어내지 않았다.)는 구글 플레이 서비스 라이브러리로 당시에는 어떤 식으로 제거할 수 있을지 알 수가 없었고 왠지 구글 라이브러리니까 에러가 없지 않을까 하는 기대감에서 내버려두었다.

무슨 관련이 있는지는 모르겠으나 원래 몸체가 되는 프로젝트를 먼저 임포트한 뒤 그레이들 익스포트를 시도하고, 이클립스가 구글 플레이 서비스 라이브러리가 없다고 에러 메시지를 띄우고 나서 추가적으로 구글 플레이 서비스 라이브러리를 임포트하는 순서로 진행해야만 궁극적으로 성공적인 결과를 이끌어낼 수 있었다. 다시 말하지만 이유는 모른다. 여기까지 이클립스 프로젝트는 에러를 띄우지 않아야 하는 것 같다. 경고 정도는 문제 없다.

4. 그 다음엔 무엇을 했나?

그레이들 프로젝트로 성공적으로 익스포트를 했다. 이제 안드로이드 스튜디오에서 이 프로젝트를 열어서 안드로이드 스튜디오에서 성공적으로 빌드를 마치기만 하면 된다. 안드로이드 스튜디오로 임포트했다. 몇 가지 경고가 뜨는 것을 안드로이드 스튜디오의 친절한 지시에 맞춰 수정을 했다. 여기까지 진행이 성공적이었다면 안드로이드 스튜디오는 프로젝트 구조를 정상적으로 만들어낼 것이다. 에러도 없다. 빌드를 시도했다.

4-1. 무엇이 문제였나?

9.png로 확장자가 끝나는 나인 패치 이미지들에서 에러가 발생했다. 메시지를 읽어보면 나인 패치 이미지가 제대로 설정되지 않았다는 이야기를 한다.

4-2. 어떻게 해결했나?

왜 이전에는 잘만 빌드되던 녀석들이 이제와서 파일이 이상하다고 에러를 뱉는지는 전혀 알 수 없는 일이지만 에러 메시지가 지적하는 대로 나인 패치 이미지들을 수정하면 문제없다.

5. 그 다음엔 무엇을 했나?

다시 빌드를 돌렸다.

5-1. 무엇이 문제였나?

덱스 파일이 여러 번 정의한다, 뭐 이런 종류의 에러가 떴다.

5-2. 어떻게 해결했나?

구글링을 해보니 그레이들의 빌드 옵션과 이미 프로젝트 내에 존재하고 있는 라이브러리 파일이 중복되거나 충돌할 때 발생하는 오류였다. 그레이들을 사용하는 이유 중에 하나가 외부 라이브러리 파일을 개발 환경에 캐싱하여 실제 애플리케이션 소스 파일에는 따로 추가할 필요가 없다는 것이기 때문에 그레이들 설정을 변경하는 것보다 중복되거나 충돌하는 라이브러리 파일을 찾아 삭제하는 편이 더 옳은 해결 방법일 것이다.

6. 결론

여기까지 트라이얼 앤 에러 방식으로 오는데 상당한 시간이 소요되었으나 결국 성공했다. 프로젝트 내에 존재하는 모든 외부 라이브러리를 그레이들 설정을 통해 빼내고 싶은 마음이 굴뚝 같았지만 잠은 오고 시간은 늦었으니 일단 구글 플레이 서비스 라이브러리를 제외하고 1프로젝트 1앱의 깔끔한 구조로 만드는 것에 만족할 수밖에 없었다. 앞으로 더 해야 할 일은 우선 남은 라이브러리 파일을 그레이들 설정으로 해결해 소스 파일의 용량을 줄이고 버전 관리를 용이하게 하는 것, 그레이들 빌드 설정 공부를 해서 개발 버전과 배포 버전에서 바보 같은 주석 처리 수정 과정을 없애는 것, 그리고 크래시리틱스를 통한 배포 자동화 등일 것이다.

수고했어 오늘도.