!!! Android 개발에 있어 많고 많은 빌드 에러 중 Windows 환경에서 종종 발생하는 에러에 대한 내용입니다 !!!!

Android Studio에서 Test Coverage를 돌릴 경우 발생하는 에러에 대해서 얘기해보려 합니다.

 

먼저 작성한 코드의 테스트 코드를 작성 후 Run 으로 동작이 잘 됨을 확인한 상태였습니다.

그 후 Run ... with Coverage 동작시 아래와 같은 에러가 발생하더군요.

java.lang.reflect.InvocationTargetException
FATAL ERROR in native method: processing of -javaagent failed
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
	at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)

 

구글링을 해보아도 딱히 짐작이 가는 부분이 없습니다.

더 찾아보다보니 아래와 같은 내용이 있더군요.

https://youtrack.jetbrains.com/issue/IDEABKL-5941

안타깝게도 러시아 사용자도 유사한 증상을 겪은 것으로 보이죠.

Temp 경로에 러시아 문자가 들어가면서 발생한 것으로 보고 있고요.

저는 한글 유저명이 문제가 된 것으로 추정할 수 있었습니다.

다시 Android Studio 로 돌아가서 Run 윈도우를 뒤져 실행다시 커맨드를 봅니다.

 

아 제 환경은 gradle 경로도 미리 D 드라이브로 변경해놓은 상태였습니다.

https://nobase-dev.tistory.com/273

원인은 Temp 경로가 Windows 환경에서는 사용자 홈으로 잡혀서 생긴 문제로 보입니다.

https://stackoverflow.com/a/29716813

https://docs.microsoft.com/ko-kr/windows/win32/api/fileapi/nf-fileapi-gettemppatha?redirectedfrom=MSDN#remarks

위 글들을 보면 기본으로 사용자 홈이 잡힌 이유는 아래와 같네요.

  1. Java에서 temp 경로를 Windows 환경에서는 Win32API 인 GetTempPath를 사용함
  2. GetTempPath에서는 아래의 순서로 경로를 지정함.
  3. The path specified by the TMP environment variable.
  4. The path specified by the TEMP environment variable.
  5. The path specified by the USERPROFILE environment variable.
  6. The Windows directory.

아무튼 다시 아래 글을 보아 Android Studio에서도 temp 경로를 수정해봅니다.

https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000020720-IntelliJ-Idea-generate-classpath-jar-files-in-C-Users-User-AppData-Local-Temp-

 

IntelliJ Idea generate classpath.jar files in C:\Users\User\AppData\Local\Temp\

I need change location where IntelliJ Idea generate the classpath.jar files. When I generate a new service, controller or domain file, is generated a new classpath.jar file in C:\Users\User\AppData...

intellij-support.jetbrains.com

Help -> Edit Custom VM Option 에서 아래 문구 추가 후 Android Studio 재시작

(studio64.exe.vmoptions)

# custom Android Studio VM options, see https://developer.android.com/studio/intro/studio-config.html
-Djava.io.tmpdir=d:/temp

 

이제 다시 Run ... with Coverage를 돌려봅니다.

 

오오 이제 잘 나오네요.

한글 Windows에서 개발은 참 다양한 어려움들이 있는 것 같네요. ^^

SonarQube(소나큐브) 도입 및 적용에 대한 내용입니다.

먼저 소나큐브란 무엇인가?

위키에서는 아래와 같이 소나큐브를 설명하고 있습니다.

소나큐브(SonarQube, 이전 이름: 소나/Sonar)[2]는 20개 이상의 프로그래밍 언어에서 버그, 코드 스멜, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼이다. 소나소스(SonarSource)가 개발하였다. 소나큐브는 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안 취약점의 보고서를 제공한다.

개발자에게 좋은 정적분석 툴이라는 내용 같네요.

https://www.sonarqube.org/ 에 적혀있는 대문 문구입니다.

Your teammate forCode Quality and Security

SonarQube empowers all developers to write cleaner and safer code.

역시 소나큐브가 모든 개발자(가)보다 깨끗하고 안전한 코드를...

뭐 아무튼 코드 품질과 보안에 대한 도움을 준다는 내용 같네요.

슬라이드쉐어에 소나큐브에 대해 잘 정리된 슬라이드가 있어 달아봅니다~

https://www.slideshare.net/curvc/sonarqube-sonarqube

저는 어떤 타이밍에 어떻게 소나큐브를 활용할지에 대한 부분에 앞서 실제로 써보는 시간을 가져보았습니다.

소나큐브를 설치할 서버를 만들 능력은 없어 제 Windows 10 PC에 Docker 설치 후 SonarQube Image를 받은 후 돌려보았습니다.

Docker Image는 SonarQube Community Edition을 기본 지원하는 것 같네요.

Docker 설치 및 설정 등은 아래 링크들을 참고하면 됩니다.

참고로 포스팅 글에서 sonar-scanner 부분은 스킵하였습니다.

그냥 설치시는 아래 링크 참조하시면 될 것 같네요.

https://docs.sonarqube.org/latest/setup/get-started-2-minutes/

Docker에 소나큐브 서버는 아래와 같이 돌렸습니다.

> docker pull sonarqube > docker run -d --name sonarqube_com -p 9000:9000 sonarqube

잘 돌아가는지 소나큐브 페이지에 들어가봅니다.

http://localhost:9000/

Android 개발자다 보니 Android 개발 환경에서 설정하였고, Android Studio에서 포스팅 글을 참고하여 설정하니 잘 되었습니다.

Android Studio의 Terminal에서 아래와 같이 실행하면 로컬 Docker에 설치된 소나큐브 서버에 결과가 잘 올라가더랍니다.

> gradlew sonarqube

진행하다보니 같이 일하는 iOS 개발자의 소스도 돌려보려 하니 안되더군요.

Docker로 돌린 소나큐브는 Community Edition 이었고, Objective-C나 Swift는 과금해야 사용할 수 있는 Developer Edition 부터 사용이 가능한 문제가 있었습니다.

 

어떻게 활용할지보다 일단 써보자는 취지로 접근한 지라 Trial 로 써보기로 합니다.

https://www.sonarsource.com/plans-and-pricing/

How are the plans licensed?

Community Edition is free.

Developer Edition, Enterprise Edition and Data Center Edition are priced per instance per year and based on your lines of code. You pay per instance for a maximum number of lines of code to be analyzed.

Determine your max number of LOCs on your edition of choice and see what it will cost you.

Can I get an evaluation license?

It is possible to get a free, 14 day evaluation license of any commercial edition by filling in the form you see once you select your edition.

마침 소나큐브 Docker Image도 Developer Edition을 지원을 하고는 있네요.

> docker run -d --name sonarqube_dev -p 9001:9000 sonarqube:developer-beta

Community Edition과 동시에 돌려보려 포트 설정을 요리조리 바꿔봤지만... 워낙 Docker 및 서버 문외한이라 결국 실패하였고.. 필요시마다 하나씩만 돌려보기로 합니다;;

Docker로 설치한 소나큐브 Developer Edition도 서버가 잘 돌아감을 확인하고 역시나 Andorid 소스 환경에서 자연스럽게 gradlew sonarqube를 쳐보았습니다.

잘 분석을 하고 잘 올린거 같습니다.

한번 소나큐브 페이지에 들어가서 확인해봅니다.

http://localhost:9001/

이런.. 프로젝트 Overview부터 결과들이 안나옵니다.

몇 군데를 들락거리니 라이센스 키를 입력하라는 페이지가 뜨네요.

알고보니 Developer Edition 을 Trial 버전으로 사용하려고 해도 키를 발급받아야 했습니다.

키를 발급받기 위해 소나소스에서 시키는 대로 고분고분 폼을 작성하여 제출해봅니다.

https://www.sonarsource.com/plans-and-pricing/developer/

성심성의 껏 작성하면 고맙다고 하네요.

https://www.sonarqube.org/forms/success-developer-edition/

하지만 라이센스 키가 바로 안옵니다.

단순하게 폼 작성 후 제출하면 자동 생성해서 키를 줄거라 생각했는데, 그게 아니었습니다.

어느 정도 시간이 흐른뒤 정말 담당자에게서 메일이 왔습니다.

또 고맙다면서 이것저것 묻더군요.

  • 이전에 소나큐브를 쓰고 있었냐?
  • 소나큐브 어떤 기능에 관심이 있고 어떤 프로그래밍 언어를 스캔할거냐?
  • 사용하려는 서버가 Developer Edition이냐? Community Edition 이냐?

대략 저에게는 저 정도를 궁금해 하셨습니다. 스위스 분께서요..

암튼 구글의 도움으로 더듬더듬 영작해서 회신을 해봅니다.

Hello

I'm not...

I blabla..

I would be grateful if you could provide license.

...

구글의 힘으로 14일 후 만료되는 Developer Edition Trial 라이센스 키를 발급 받게 되었습니다.

다시 소나큐브 페이지에 들어가서 라이센스 입력화면에서 입력해봅니다.

http://localhost:9001/

잘 됩니다.

하지만 라이센스 등록 전 돌렸던 분석결과는 볼 수가 없습니다;;

새 출발하는 마음으로 새로 돌려봅니다.

gradlew sonarqube

...

잘 됩니다.

이젠 Overview도 잘 나오고 소나큐브에서 지원하는 다양한 기능을 써볼 수 있었습니다.

Community Edition 대비 Developer Edition 사용시 느낀 차이점은 가장 큰 건 지원하는 언어의 차이도 있겠지만, branch 관리도 차이가 있더군요.

gradle에 branch 속성을 설정해서 올리면 소나큐브 내에서 한 프로젝트에서 다른 brach로 관리가 가능하였습니다.

앞으로 소나큐브로 어떤 타이밍에 어떤 수준까지 고려하여 사용할지를 고민해보아야 할 것 같네요.

+) 소나큐브 가격표입니다. (2020.02.07 기준) 

!!! Android 개발에 있어 많고 많은 빌드 에러 중 Windows 환경에서 종종 발생하는 에러에 대한 내용입니다 !!!!

개인적으로 Android 개발에 있어서 Android Studio에서 Build나 Run 하는 경우가 많았는데요.

주로 툴의 UI 버튼등을 단순히 눌러서 해왔죠.

하지만 Terminal 에서 Build 가 필요할 때도 있지요.

기껏 Terminal 에서 Build 하는 명령어 등을 검색 후 실행했을때 에러가 뜬다면 참 번거럽겠죠.

그 수많은 에러 중 아래의 에러 문구시에 대한 해결책입니다.

C:\Users\?????\.gradle\caches\transforms-1\files-1.1\appcompat-v7-28.0.0.aar\50aa894a55f6ff1ab5e7586893bfabff\res\layout\abc_dialog_title_material.xml: error: file not found.
C:\Users\?????\.gradle\caches\transforms-1\files-1.1\appcompat-v7-28.0.0.aar\50aa894a55f6ff1ab5e7586893bfabff\res\drawable\abc_spinner_textfield_background_material.xml: error: file not found.

> Task :mobile:mergeDebugResources
Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':mobile:mergeDebugResources'.
> Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 18s
14 actionable tasks: 6 executed, 8 up-to-date

D:\HelloWorld>

 

어디가 문제일까요?

그냥 느낌적인 느낌으로 눈에 들어오는 부분이 있을 겁니다?????

C:\Users\?????\.gradle\caches\transforms-1\files-1.1\appcompat-v7-28.0.0.aar\50aa894a55f6ff1ab5e7586893bfabff\res\layout\abc_dialog_title_material.xml: error: file not found.

 

gradle 캐시에 외부 라이브러리들을 저장해놓고 빌드시 사용하는 것으로 보이죠.

그 경로에 한글이 들어가서 문제가 발생한 것으로 보이고요.

그럼 왜 굳이 gradle은 캐시 위치를 저리 잡는지에 대한 궁금증이 생깁니다.

https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_environment_variables

gradle docs에서 뒤져보니 이런 문구가 있네요.

GRADLE_USER_HOME

Specifies the Gradle user home directory (which defaults to $USER_HOME/.gradle if not set).

맞습니다.

저는 GRADLE_USER_HOME 을 설정하질 않았었네요.

Android Studio에서는 Setting 에서 설정이 가능해보이네요.

Gradle home 항목이 그걸로 보이는데... 사실 안해봐서 모릅니다;;

일단 저는 Terminal 이나 Windows CMD 창에서 작업을 시작했으니 그 곳에서 설정을 해봅니다.

Windows에서 환경변수를 보는 것이 set이라는 명령어를 사용하네요.

> set
ALLUSERSPROFILE=C:\ProgramData
ANDROID_HOME=d:\Android\sdk\
ANDROID_SDK_HOME=d:\Android\sdk\
APPDATA=C:\Users\유저명\AppData\Roaming
classpath=%classpath%;
...

참고로 GRADLE_USER_HOME 은 안보이네요.

저는 d:\.gradle\ 경로로 지정을 해보겠습니다.

>set GRADLE_USER_HOME=d:\.gradle\
>set
...
GRADLE_USER_HOME=d:\.gradle\
...

이제 되었네요.

다시 Terminal 에서 빌드를 진행해보면 두가지의 경우가 발생할 겁니다.

잘 되거나.. 다른 에러가 발생하겠죠.

Good Luck!!

+) Windows 에서는 보통 시스템 환경변수 설정에서 직접 입력하기도 하지요.

+ Recent posts