Check Out from Subversion

Intelli J에서 외부 도구를 쓸 때 아래와 같이 “Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.”라는 메시지가 나올 수 있다.

Screen Shot 2014-04-20 at 17.57.20

원인은 Intelli J가 아니라 Xcode다. Xcode에서 (아마도, 패키징을) 제공하는 있는 것으로 라이센스 동의 없이는 내 맥에 설치된 Git이나 Subversion용 도구를 쓸 수 없다는 것이다.

그럼 라이센스에 동의를 해주러 가보자. 에러 팝업 창에 표시된대로, sudo 명령어를 이용해 명령어를 실행하보자.

JD-Mac:~ sunphiz$ sudo git

비밀번호를 입력하면, 엔터를 치면 라이센스를 볼 수 있다는 안내가 나온다.

You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.

Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'

라이센스를 모두 본 후에 마지막에 “agree”를 해준다.  그리고, 다시 Intelli J로 돌아가면 잘 된다.

인텔리 제이에서 시스템 정보 확인하기(adb shell dumpsys)

안드로이드는 리눅스를 기반으로 한 운영체제 이기때문에 쉘(shell)을 사용할 수 있고 다른 글에서 쓴바 있다. 그리고 그 쉘에서 dumpsys라는 툴을 이용하면 안드로이드의 관심있는 서비스(?) 정보를 매우 자세하게 뽑아낼 수 있다. 이에 대한 자세한 설명은 안드로이드 개발자 사이트에 잘 정리되어 있기도 하다.

하지만, 번거롭다. 명령창을 통해  실행해야 하는데, 대부분의 개발자가 있는 줄 알면서도 안쓰게 만드는 가장 큰 이유다.

인텔리 제이 IDE에서 adb shell dumpsys 를 통해 확인하던 시스템 정보(System Information)을 추출할 수 있는 방법을 제공한다. Android DDMS 패널의 좌측 메뉴 중에 돋보기 모양의 “System Information” 버튼을 이용하면 된다.

android_ddms

제공하는 기능은 Community version 기준으로 다음과 같다.

  • Activity Manager State
  • Package Information
  • Memory Usage
  • Memory Use Over Time
  • Graphics State

단말이 연결된 상태에서 프로세스를 하나 선택해 메뉴가 활성화된다. 각 명령은

adb shell dumpsys [서비스 이름] [프로세스 번호 | 패키지 이름]

과 매치된다.  예를 들면, Memory Usage를 adb shell dumpsys를 통해 보려면

adb shell dumpsys meminfo android.my.app

라고 치는 식이다.

adb shell dumpsys를 이용하면 더많은 정보를 볼 수 있지만, adb 실행이나 매번 바뀌는 프로세스 번호 같은 것을 기억하지 않아도 된다는 점을 생각하면 역시 편리하다. dumpsys 툴 이이야기가 나온 김에 어떤 서비스 정보를 추출할 수 있는지 잘 정리된 링크도 걸어둔다.

그리고, 가장 많이 쓰는 기능은 모두 모여 있으니 애용해보자.

toString() 메소드 만들기

toString()은 자바 객체를 문자열로 표기해야할 때 자동으로 호출되는 함수이다. 꽤나 중요하지만 잘 만드는 것은 귀찮다.
Intelli J에서는 에디터 화면에서 Alt + Insert 버튼으로 toString()을 만들고 채울 수 있는데 꽤나 유용하다. 그 샘플은 다음과 같다.

public String toString() {
        return "VoObject{" +
                "merchantId='" + merchantId + '\'' +
                ", orderId='" + orderId + '\'' +
                ", notiUrl='" + notiUrl + '\'' +
                '}';
    }

Json 처럼 예쁘게 정리해서 보여주고, 줄바꿈도 해준다. 앞으로 자주 써야지 =)

 

trouble writing output: Too many methods

dependencies

안드로이드 프로젝트를 빌드할 때 메소드 갯수가 많은 경우 아래와 같은 에러를 내며 빌드가 되지 않는 경우가 있다.

Android Dex: [IAP] trouble writing output: Too many methods: 77667; max is 65536. By package:
Android Dex: [IAP] 26 android
Android Dex: [IAP] 83 android.accessibilityservice
Android Dex: [IAP] 661 android.accounts
....

일단 에러의 원인은 Dalvik에서 실행하기 위해서는 앱이 65536 개를 초과하는 메소드를 가져서는 안되기 때문이다. 보통은 만날 일이 없는 에러일테다. 하지만, 에러가 났다면 어떻게 해야할까? 해결책은 링크를 참조하면 된다. 간단히 요약하면 리팩토링을 통해 메소드 갯수를 줄이라는 것이다.

그런데, 제공받은 라이브러리 때문에 나는 경우라면? 임의로 수정할 수도 없는 노릇이다. 다만, 안드로이드 단말에서 런타임시에 제공되는 (일명) 시스템 라이브러리라면, 라이브러리를 참조하는 scope를 바꾸어 빌드를 하지 않도록 설정 해 위 에러를 이를 피해갈 수 있다. 먼저, 인텔리제이의 도움말 – Dependency 탭의 Scope항목을 살펴보자.

  • Compile : The dependency is included in the classpath for your sources and test sources at the compilation and run phases.
  • Test : The dependency is included in the classpath only for your test sources at the compilation and run phases.
  • Runtime : The dependency is included in the classpath for your sources and test sources but only at the run phase.
  • Provided : For your sources, the dependency is included in the classpath only at the compilation phase. This is useful when there is a container (e.g. a web container of an application server) that provides the corresponding dependency at runtime.

위에 써 있듯이 스코프를 Provided로 하면 런타임시에 컨테이너에서 제공한다고 생각하여 apk 안에 포함하여 빌드 하지않고 컴파일 시에 참조만 한다. 이를 통해 빌드하는 도중에 나는 위 에러는 피할 수 있을 것이다. 다만, 이는 모든 경우에 해당하는 것은 아니다.