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

안드로이드 스투디오의 코드 스타일 공유하기

안드로이드 스투디오의 코드 스타일을 공유하는 방법이 없는 줄 알았는데, 찾아보니 이미 제공되고 있다. 코드 스타일을 정하는 곳에서 export할 수 있었다면 더 좋았겠지만, 기존의 방법도 깔끔하다. (다시 한 번, 검색 엔진 뒤지지 말고 공식 메뉴얼을 봐야 한다는 걸 느낀다..)

File > Export Settings …로 현재 안드로이드 스투디오의 설정 값들을 모두 export할 수 있는데, 여기서 “Code Style”만 지정하면 된다.

androidstudio_export_code_convention

저장할 곳을 지정하면 settings.jar 파일이 떨어진다. 이를 공유하면 된다.

import는 File > Import Settings.. 메뉴를 통해 가능하며, import하고 싶은 항목을 골라서 import할 수도 있다. 그 후, File > Settings… > Editor > Code Style에 가면 Scheme 중에 방금 import한 항목이 있을 것이다.

참고

안드로이드 스투디오 속도 개선

이 글은 안드로이드 스투디오 1.0 때 작성된 것으로 2016.4월 현재 2.1까지 나온 지금은 처음만큼 느리지 않다. 그러므로, 속도 개선에 큰 효과가 없을지 모른다.


안드로이드 공식 IDE인 인텔리제이 기반의 안드로이드 스투디오. 그런데, 느리다! 특히, 에디터에서 코드를 수정 중에 뭘 하는지 커서를 움직일 때마다 버벅거린다.

에디터

이를 해결하기 위해 몇 가지 사용자들 사이에 거론되는 팁들이 몇개 있는데 inspection 옵션을 끄라던가,

androidstudio-inspection2

다음의 그림처럼 ‘Power Save Mode’를 체크한 후 코드를 작성하다가 필요할 때 다시 체크 해제하라는 팁이다.

androidstudio-inspection

그런데, 최근에 스택오버플로우에서 vmoptions을 수정해보라는 가이드를 보았다. 원래 이클립스에서도 최대 힙 메모리를 수정하는 것은 잘 알려진 팁이지만, 안드로이드 스투디오에서는 별로 효과를 보지 못했다. 속는 셈치고 이번에 1.2.2에서 다시 한 번 해보았는데 효과가 있는 것 같다. (1.3부터는 64bit의 경우, 기본값이 1280m로 수정이 필요 없다.)

일단 vmoptions 파일은 안드로이드 스투디오 설치 폴더 내의 /bin 폴더 안에 있다. 파일 ‘studio.exe.vmoptions’이거나 비슷한 이름일 것이다.

아래는 수정 전문이다. 이중에 -Xmx에 숫자를 입력하면 된다. 내 경우에는 1.5G를 할당했다.

-Xms128m
-Xmx1536m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Djna.nosys=true
-Djna.boot.library.path=

-Djna.debug_load=true
-Djna.debug_load.jna=true
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Didea.paths.selector=AndroidStudio1.2
-Didea.platform.prefix=AndroidStudio

-업데이트(2018.10.19)-

안드로이드 스투디오 업데이트 시, 변경된 파일을 체크하고 이 중 일부 파일은 업데이트 중단의 이유가 된다.  studio.exe.vmoptions 파일도 그중 하나다. 이런 이유로 안드로이드 스투디오에서 커스텀 vmoptions를 넣는 메뉴를 ‘Help – Edit custom VM options…’ 추가했다.

위 가이드에서도 메모리 할당 크기만 수정했으므로, 아래와 같이 메모리 크기관련 속성만 선언하면 된다.

# custom Android Studio VM options, see https://developer.android.com/studio/intro/studio-config.html
-Xms2048m
-Xmx4096m

그래들(빌드)

그래들 빌드는 이미 잘 정리된 글들이 있다. 그 것을 여기에 그대로 옮기는 것 보다는 원문의 링크(영문)를 걸어두겠다.

간략하게 요약하면,

  • 그래들 빌드 시 할당되는 힙 메모리 크기 증가
  • 프로젝트에서 사용하는 그래들 빌드의 버전을 2.4로 올리기
  • 참고하는 메이븐 서버의 주소를 mavenCentral()에서 jcenter()로 바꾸기

등이 있다.

그 밖에

에뮬레이터 속도 개선하는 글도 읽어보자.

참고

안드로이드 스투디오의 sign-off-by

Gerrit에서는 누가 무엇을 커밋했는지 추적하기 위해, 명시적으로 sign-off라는 부분에 사람의 이름을 표시하는 기능을 사용하기도 한다. 이 기능을 깃에서 지원하고 있으며 patch의 마지막 줄에 Signed-off-by 부분이 추가된다. 예제 커밋 메시지는 다음과 같다.

initial commit

Signed-off-by: Random J Developer <random@developer.example.org>

이를 사용하기 위해서는 깃에서 commit 시에 -s 파라미터만 붙여주면 된다.

>git commit -s -m "initial commit"

문제는 이 파라미터를 안드로이드 스투디오(정확히는 IDEA)에서 추가할 방법이 없다는 것이다. 커스텀 파라미터도 제공하지 않고, 체크박스를 통해 활성화/비활성화 할 방법도 없다. 아틀라시안(Atlassian) 사의 소스트리(SourceTree) 는 이미 지원하고 있다는데 안드로이드 스투디오에는 2011년부터 일부 IDEA 사용자가 요청하고 있지만 아직 추가되지 않았다.

~/.gitconfig 안에 format.signoff 파라미터를 지정할 수 있다고 하나, 안드로이드 스투디오에는 효과가 없다. 윈도우즈 환경이라면 깃의 commit 명령어인 경우 여기에 -s 파라미터를 추가하는 스크립트를 만들어, 이 배치 파일을 안드로이드 스투디오의 ‘File > Settings > Version Control > Git > Path to Git executable’ 에 배치파일을 지정하면 된다.

androidstudio_git-signoff

배치 파일의 코드는 다음과 같다.

@FOR /f "usebackq tokens=4*" %%i in (`@ECHO %*`) DO @SET other_params=%%j

@IF /i "%4" EQU "commit" (
    git %1 %2=%3 %4 -s %other_params%
) ELSE (
    git %*
)

위 방법은 파라미터들을 변수에 저장하기 때문에 순서를 바꾼다거나, 특정 파라미터만 비교할 수 있는 장점이 있다. 하지만, 단순 치환(replace)로도 ‘commit -s’는 지원할 수 있다.

:파라미터를 변수에 할당한다.
@set command=%*

: 바꾸고 싶은 값을 열거한다.
@set command=%command: commit = commit -s %
@set command=%command: merge = merge --no-commit %


:명령 실행
@git %command%

필요에 따라 사용하도록 하자.

그 밖에

git config의 format.signoff 파라미터는 패치(patch)에 대한 것으로 커밋(commit)에는 적용되지 않는다. 이에 대한 설명은 여기에! 만약, 모든 commit에 signed-by-off 부분을 추가하고 싶다면 GPG(GNU Private guard)에 대한 다른 글 참고하자.

업데이트

안드로이드 스투디오 3.0에 commit 시 signed-off를 달지 선택하는 체크박스가 추가되었다.

참고

이클립스에서 안드로이드 스투디오로 이동하기

2015년 3월 현재 안드로이드 개발자에게는 선택할 수 있는 IDE가 아래와 같이 3종류이다.

  • ADT(Android Developer Tools, 이클립스 기반)
  • 인텔리제이 커뮤니티 에디션(Intelli J 무료 버전)
  • Android Studio(Intelli J 기반의 무료 IDE)

하지만, 구글 공식 IDE는 Android Studio이다. 아직, ADT를 다운로드 받을 수 있지만 이전 글처럼 지원이 종료되었고, Android Studio가 Develop > Tools의 첫 페이지에 있는 것과 달리 ADT페이지는 이미 저 안쪽에 숨겨져 있고 Android Studio 프로젝트로 전환하는 방법이 먼저 보이며, 다운로드 받는 링크를 찾기는 이미 힘들다.

이 소식을 알자마자, 열혈개발자인 나는 구글의 제안에 따라 Android Studio를 사용하기로 결심해버렸다. 내 주변 개발자들은 아직도 ADT를 쓰고 있지만, 나만 바꾸면 되지 않겠나?

이클립스, 인텔리제이 그리고 안드로이드스투디오

아마도 내 마음과 달리 잘 안될 수 있다. 위 세가지 IDE가 지원하는 안드로이드 프로젝트 타입이 다르기 때문이다. 각각 어떤 안드로이드 프로젝트 타입을 지원할까. 안드로이드 스투디오 이동을 염두하여 중요한 프로젝트만 열거해보자.

  • 이클립스
    • 이클립스 프로젝트
  • 인텔리제이
    • 인텔리제이 프로젝트
    • (Gradle로 빌드되는) 인텔리제이 프로젝트
  • 안드로이드 스투디오
    • 인텔리제이 프로젝트
    • Gradle 기반 안드로이드 프로젝트(위의 Gradle을 빌드스크립트로만 쓰는 경우와는 다름)

위 내용만 보면, 이클립스 프로젝트를 안드로이드 스투디오에서 잘 import 해서 쓰면 되겠지 싶다. 하지만 안드로이드 스투디오에서 지원하는 프로젝트 종류에는 크게 두가지 문제가 있다.

  • 안드로이드 스투디오에서는 새 인텔리제이 안드로이드 프로젝트를 만들 수 없고, 열 수만 있다.
  • 안드로이드 스투디오에서 이클립스나 인텔리제이 기반 안드로이드 프로젝트를 Gradle 기반의 안드로이드 프로젝트로 import할 때 폴더구조가 완전히 바뀐다.

위와 같은 제약으로 인해, 팀 내 혼자서 안드로이드 스투디오로 이동하면 다른 IDE(특히 이클립스)를 사용하는 개발자와 같은 VCS를 쓸 수가 없다.

그럼 어떻게 IDE를 변경해야 하나?

먼저 개인 개발자라면, 그냥 바꾸면 된다. 폴더 구조가 바뀌는 것은 번거롭지만 한번만 하면 되니 어쨌든 상관 없다.

같은 프로젝트를 여러사람과 개발하고 있다면 좀 머리아프다.  아래와 같이 정리할 수 있다.

  • 이쯤되니 머리가 아프다. 그냥 ADT 쓴다. (좋은 생각이다.)
  • 인텔리제이에서는 이클립스의 폴더구조를 바꾸지 않고도, 안드로이드 프로젝트를 만들 수 있다. 게다가, 안드로이드 스투디오의 좋은 기능들을 대부분 지원하고 있다. 그러므로, 안드로이드 스투디오 대신에 인텔리제이 커뮤니티 에디션(무료)를 사용하고, 프로젝트 파일(.iml)파일은 로컬에만 두고 쓴다.
  • ‘가려면 안드로이드 스투디오로 가야지 무슨 인텔리제이냐’라고 생각한다면, 인텔리제이와 안드로이드 스투디오를 모두 사용하는 방법을 생각할 수 있다. 이클립스 프로젝트를 인텔리제이에서 import한 후에(즉, 인텔리제이 프로젝트로 변환), 이를 안드로이드 스투디오에서 열면 된다. 안드로이드 스투디오에서는 새 인텔리제이 프로젝트를 만들 수 없을 뿐 열 수 있기 때문이다. 물론, 모듈(이클립스의 프로젝트와 같은 개념의 단어)을 추가할 때마다 인텔리제이를 열어야겠지만,  역시 나만 조심해서 쓰면 된다.
  • 마지막 방법은 어쩌면 쉬울 수 있다. 일단, 모두 퇴근할 때까지 기다린 후에 이클립스 프로젝트를 안드로이드 스투디오를 통해 Gradle 기반 프로젝트로 변환(폴더구조를 바꾸어 사본 프로젝트를 만들어준다.)한 후에 이를 VCS에 올리고 집에 간다. (조금 더 배려하고 싶다면, 다른 개발자들의 컴퓨터에 안드로이드 스투디오를 설치해줄 수 있다.)

마지막 방법은 물론 농담이다. 위 방법들을 보면 알겠지만, 팀내에서 혼자서만 안드로이드 스투디오로 IDE를 바꾸기는 어렵다. 물론 .gradle 파일을 고쳐 볼 수도 있겠지만, 안드로이드 스투디오에서 제안하는 구조와 방법들로는 어렵다. 너무 무리한 변경이 아니었나도 싶지만, 일단 옮기고 나면 분명 장점이 있다. 그러니, 안드로이드 스투디오로 옮길 때에는 팀 내 의견을 조율하여 함께 진행하는 것이 정답이다. 

그 밖에 사소하지만 큰 문제들

인텔리제이는 많은 플러그인을 제공한다. 단, 프로페셔널 버전(유료)에 한해서다. 인텔리제이 커뮤니티 에디션(무료)이나 안드로이드 스투디오의 경우, 자신이 사용하는 형상관리 시스템(VCS)과 연동이 되는지 꼭 확인해야한다. 현재 안드로이드 스투디오에서 연동이 가능한 대표적인 형상관리 시스템은 다음과 같다.

  • Git
  • Subversion(SVN)
  • CVS
  • Mercurial

지원되지 않은 대표적인 형상관리 시스템은 아래와 같다.

  • Perforce
  • Clear Case

참고로, Perforce 같은 경우는 무료 플러그인이 한참 개인 개발자에 의해 만들어지고 있으나 만족스럽지 않다.