gradlew 실행 시 SSLHandshakeException

안드로이드 스투디오는 gradle을 이용해 프로젝트를 빌드할 수 있다. 명령창에서도 프로젝트 빌드를 할 수 있도록 gradlew.bat 파일(gradle의 wrapper)도 제공한다. 프로젝트의 루트(‘/’)에서 gradlew.bat를 실행하면 첫 실행 시 Gradle 사이트에서 gradle 바이너리를 받아 적당한 위치에 저장하고 설치한 후 안드로이드 프로젝트를 빌드할 수 있도록 해준다.

그런데, 아래와 같은 에러와 함께 설치부터 안되는 경우가 있다.

>gradlew
Downloading https://services.gradle.org/distributions/gradle-3.3-all.zip

Exception in thread "main" java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        ...
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        ...
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        ...
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        ...

물론 근본적인 문제 해결도 좋지만, 난 그저 명령창에서 gradle 실행하고 싶을 뿐인데..

원인은 https 프로토콜을 이용해 gradle 바이너리를 받기 때문인데 gradle 바이너리를 받은 url을 수정할 수 있다. 업무 환경 상 수정이 쉽지 않다면, SSLHandshake가 필요없는 htttp를 통해 받으면 된다. gradle-wrapper.properties 파일을 열어 distributionUrl을 https에서 http로 수정하자.

distributionUrl=http\://services.gradle.org/distributions/gradle-3.3-all.zip

안드로이드 프로젝트의 필수 파일

안드로이드 스투디오에서 프로젝트를 생성(File > New > New Project…)하면 모듈을 포함해 아래와 같이 많은 파일이 만들어진다.

androidstudio_default_folder

다른 사람에게 프로젝트를 배포해야한다면, 어떤을 보내야 할까? 생성된 모든 파일을 다 보낼까? 물론, 다 보내도 프로젝트는 전달할 수 있다. 그렇지만 최소화를 원한다면 아래 파일들만 보내도 된다.

androidstudio_default_folder2

배포자는 파란색의 폴더나 파일들을 삭제하고, 배포할 수 있다. 모듈에서 사용하는 라이브러리가 없거나 프로가드를 적용하지 않은 프로젝트라면 /libs 폴더나 proguard-rules.pro 파일도 지울 수 있다.

배포 받은 사람은 안드로이드 스투디오에서 프로젝트 열기(File > Open…)를 통해 /GradleProject 폴더를 프로젝트로서 열거나, 모듈을 추가(File > New > Import Module…) 메뉴를 통해 기존의 프로젝트에 /app 폴더를 모듈러서 추가 할 수 있다. 그 과정에서 빌드 환경 조성을 위해 안드로이드 스투디오가 팝업을 띄울 수 있다.

명령창에서 빌드를 해볼 수도 있다. 그래들이 이미 설치되어 있고, path도 잡혀있다면

>gradle build

명령어 만으로 빌드가 되는 것을 확인할 수 있다.

그 밖에

일부 설정값(proxy 서버 주소라던가)을 함께 배포해야 한다면 gradle.properties 파일도 포함하자.

systemProp.http.proxyHost=1.2.3.4
systemProp.http.proxyPort=80

SDK 경로를 함께 배포해야한다면, local.properties 파일을 함께 배포하자.

sdk.dir=C\:\\Android\\sdk

 

그래들 빌드시 Lint(린트)로 인한 빌드 에러 피하기

이클립스나 인텔리제이에서는 Android Lint의 결과가 빌드에 영향을 미치지 않는다. 하지만, 안드로이드 스투디오에서 그레들 기반의 안드로이드 프로젝트를 사용하면, release 버전을 만들 때 Lint의 결과가 빌드를 중단할 수 있다.

예를 들면, res\values\strings.xml의 언어 문자열이 다국어 번역에서 일부 누락되었을 때 아래와 같은 메시지와 함께 빌드가 중단된다.

...
Error 69) Error: "server_url" is not translated in "ko" (Korean) [MissingTranslation]
Error 75) Error: "countries" is not translated in "ko" (Korean) [MissingTranslation]
...

실수로 번역이 누락된 것이라면, 번역을 하면 되지만 번역이 불필요한 경우에는  불편하다. 그 외의 Lint를 통한 검증 내용도 무시하고 일단 빌드를 하고 싶다면 아래와 같이 build.gradle에 추가해주면 된다.

lintOptions {
    checkReleaseBuilds false
}

release 빌드 시 필수인 Lint를 끄고 빌드할 수 있다. 하지만, 임시 방편일 뿐 Lint를 통해 분석한 결과를 꼭 수정하여, 더 안전한 앱을 만들자.

참조

Gradle 프로젝트로 변환하기

Gradle 빌드는 안드로이드 빌드에 있어서 모두가 알고있던 여러가지 불편한 점을 해결해준다. 예를 들면,

  • 안드로이드에서 제공하는 라이브러리들을 최신상태로 유지
  • 안드로이드 빌드를 위한 다양한 옵션 제공
  • .aar 포멧의 안드로이드 라이브러리 제작 가능
  • 안드로이드 스투디오와의 호환

단, 안드로이드 스투디오로 옮기면서 Gradle을 이용한 프로젝트 관리 및 빌드를 강제한 것이 문제다. 기존에 Eclipse나 Intelli J를 사용하던 사람은 Gradle을 이용하지 않고 빌드하려고 최대한 버텨보겠지만, 결국은 Gradle로 빌드하지 않고는 프로젝트를 운영할 수가 없다.

나는 개인적으로 Eclipse 사용자와의 호환성을 유지하기 위해서 Gradle로 이동하지 않았는데, 이제 이동해야할 때가 된 것 같다. 여기서는 Intelli J의 기존 프로젝트에서 Gradle로 빌드되는 프로젝트로 변경하는 법을 안내한다.

기본적인 순서는 이미 안드로이드 사이트에서 안내하고 있다. 간략하게 요약하자면, 아래와 같다.

  1. Gradle을 다운로드 받아 로컬에 압축을 푼다.
    필요하다면, .\bin 폴더를 path에 포함한다.
  2. 아래 페이지에서 소개하듯이 프로젝트를 빌드할 build.gradle 파일을 만든다.
    이부분이 제일 어려울 수 있다. Gradle으로 빌드파일을 바꾸는 사람 중의 대부분은 Gradle이 어떻게 생겼는지도 모를테니 말이다. 조금 전에 언급한 가이드 사이트 나 안드로이드 개발자 사이트 내에서 예제를 소개하고 있으니 참고하면 된다. 다만, 가이드 사이트의 경우 예제가 거의 업데이트 안된 것같다. apply plugin에 넣는 파라미터도 android에서 com.android.application으로 바뀌었고, buildToolsVersion도 지금 최신이 22이다.
    안드로이드 개발자 사이트 내의 build.gradle파일을 참조하자. 다만, build.gradle 파일 내용은 각 프로젝트마다 천차만별이라 각자가 잘 해보는 수밖에 없다.
  3. “gradle assembleDebug” 명령어를 통해 build.gradle로 프로젝트를 빌드한다.
    꽤 자세히 로그메시지를 보여주기 때문에, 차분히 따라가다보면 아래와 같이 빌드를 성공할 수 있다.
  4. ...
    :compileDebugJava
    Note: Some input files use or override a deprecated API.
    Note: Recompile with -Xlint:deprecation for details.
    :preDexDebug
    :dexDebug
    :processDebugJavaRes
    :validateDebugSigning
    :packageDebug
    :zipalignDebug
    :assembleDebug
    
    BUILD SUCCESSFUL
    
    Total time: 1 mins 45.653 secs
  5. 그 다음은 안드로이드 스투디오에서 File > Import Project나 File > Import Module을 통해 프로젝트를 열면된다.

 주의사항

  • build.gradle 파일 내에 buildToolsVersion 로 표시한 build tools의 버전이 …\sdk\build-tools 경로 설치되어 있어야한다.
  • Android SDK의 위치를 Gradle이 찾을 수 있어야한다. 방법은, 시스템 속성에 선언하거나, 프로젝트 안에 local.properties 파일을 만들어 참조할 수 있도록 해줄 수 있다.
  • sdk.dir=G:/Android/sdk
  • Gradle에 대한 전반적인 이해에는 안드로이드 사이트의 Gradle 소개도 유용하다.

참조