저는 안드로이드를 Emacs 로 개발하고 있는 중인데요. 외부 jar 가 추가 될 때 자동으로 classpath 에 추가 하고 자동으로 import 기능을 활성화 시키는 방안을 찾는 중인데, 없더군요.. 

물론 Eclipse 를 사용하면서 Google AdMob SDK 같은 외부 jar를 사용하기는 쉽습니다. 외부 라이브러리로 추가해 주면 끝이기 때문입니다. 다만 CLI (Command Line Interface) 에서 Ant 를 이용해서 빌드를 할 때는 마구 마구 귀찮아집니다. 하지만 쉽게 하는 방법이 생겼더군요. 

$(ANDROID_PROJECT_ROOT) 밑에 /libs 라는 디렉토리를 만들고 그 안에다가 GoogleAdMobAdsSdk-6.0.1.jar android-support-v4.jar 두개의 파일을 복사해줍니다. 


$(ANDROID_PROJECT_ROOT) 밑의 ant.properties 파일을 열고 다음과 같이 추가해 줍니다. 

  jar.libs.dir=libs


이제 

$ ant clean && ant debug 



해 주시면 성공적으로 바인딩 되는 것을 확인하실 수 있습니다. 

다만 위와 같이 따로 libs 를 추가해 주면 JDE 환경에서 자동으로 classpath 뒤져서 Import 해주는 기능이 libs 에 추가된 jar 에 대해서는 동작하지 않습니다. 이럴 때를 위해서 따로 함수를 만들어 뒀습니다. (100% 제가 만든것입니다 쿨럭..) 



(defun android-mode-my-hook () 
  (progn
    (and (file-exists-p 
          (concat (android-root) "/libs"))
         (setq jde-global-classpath 
               (append jde-global-classpath 
                       (directory-files
                        (concat (android-root) "/libs")
                        t "jar"))))
    ))
(add-hook 'android-mode-hook 'android-mode-my-hook)


다음과 같이 만들어 주면 됩니다. 저는 java 설정만 따로 모아놓고 쓰지만 그렇지 않으신 분들은 .emacs 파일 구석에 적어두시면 될 것입니다. 물론 jdee 와 android-mode 설정 뒤에 적어주셔야 할 것입니다. jde-global-classpath 는 jdee 를 추가 해줘야 생기는 변수고 android-root 는 안드로이드 프로젝트의 루트를 찾아주는 편리한 함수인데 android-mode 를 추가해줘야만 쓸 수가 있습니다. 

점점 lisp 으로 코딩하는게 재밌어 지기 시작합니다. ㅎㅎ 
 
 Emacs 와 JDEE 와 Maven 과의 결합의 마지막을 해결했습니다. 그 전의 세팅을 보시고 싶으시면 


    2 번까지 끝을 내고 나니 Emacs 내에서 maven 컴파일과 빌드를 하고 싶더군요. (당장은 mvn install 만 되게) 딱히 다른 사람들이 만든 것은 내 필요에 부합하지 않은 것 같기도 하고 지원도 더 이상 하지 않는 것 같기에 직접 만들게 됐습니다. jdee 프로젝트 안에 있는 jde-make 를 변경했습니다. 간단하게 되더군요. 적당한 곳 (~/.emacs.d 안에)에 jde-mvn.el 을 복사하시고 .emacs 안에서 

(require 'jde-mvn)


 을 해주시면 됩니다. 그리고 세부 설정을 위해서 


(custom-set-variables

 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(ecb-options-version "2.40")
 '(jde-build-function (quote jde-mvn))
 '(jde-global-classpath (quote 
     ("/Users//work/android/\
      sdk/platforms/android-17/android.jar" 
      "/Users//.emacs.d/\
      jdee/build/classes")))
 '(jde-mvn-enable-find t)
 '(js2-auto-indent-p t)
 '(js2-cleanup-whitespace t)
 '(js2-enter-indents-newline t)
 '(js2-global-externs (quote ("$" "Ext")))
 '(js2-mirror-mode nil)
 '(slime-complete-symbol-function 
   (quote slime-fuzzy-complete-symbol))
 '(tab-width 2))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )


 와 같이 jde 설정을 해주시면 완료입니다. 

 필요한 파일은 https://github.com/crazia/jdee-mvn 에 올려두었습니다.
   저번에 올린 Emacs 와 JDEE 를 가지고 안드로이드를 개발하는 방법에 대해서 글을 올렸습니다. 그런데 최근 화두는 어떻게 하면 Mavenpom.xml 을 이용해서 JDEE 의 개발환경에 접목을 시킬까 하는 것이였습니다. 아.. 진짜 힘들었습니다. 그래도 몇가지 테스트와 노력을 끝으로 드디어 성공했습니다. 

참고한 사이트입니다. 


여기에서 근본적인 pom-parser.el 을 다운 받을 수 있었습니다. 그런데 제대로 동작을 하지 않더군요. 이유는 maven 의 실행 옵션들이 변해서 그렇답니다. 


위 사이트를 참조하시면 어떻게 변경해야 하는지 알 수가 있습니다. 위 까지만 적용하면 다 될 줄 알았는데 제가 기본적으로 jde-global-classpath 에 넣어둔 것이 사라지면서 에러가 발생하더군요. 그래서 기존에 있는 클래스 패스를 포함하는 버젼으로 수정했습니다. 
    올려둔 파일을 다운 받으시고 ~/.emacs.d/ 에 복사하시고 maven 프로젝트가 있는 곳 (정확히는 pom.xml 파일이 있는 곳)에 다음과 같은 파일 prj.el 을 만들어 주시면 됩니다. 


(jde-project-file-version "1.0")
(jde-set-variables
'(jde-compile-option-command-line-args
(quote ("-Xlint:all" "-Xlint:-serial"))))
(require 'pom-parser)
  (with-pom ()
  (pom-set-jde-variables *pom-node*))


제가 최근에 읽었던 프로그래머들의 특징에 관한 글중에서 공감이 갔던 구절이 하나 있습니다. 

"프로그래머는 UX (User eXperience)를 개발한다고 해도 자신이 좋아하는 환경은 CLI (Command Line Interface)다" 


 다시금 진행하기전에 다짐하듯이 말씀드리는 사항은 안드로이드 (Android) 개발하기에 최적의 환경은 Google 에서 제공하는 ADT (http://developer.android.com/intl/ko/sdk/index.html) 환경에서 개발하는 것입니다. 이 포스트는 ADT 에서 개발을 진행하더라도 자꾸 자꾸 눈이 CLI 환경에서 떠나지 않는 중독자(?!!)들을 위한 것입니다. 

 이 포스트는
Emacs Version 24로 업글후 Clojure 와 Common Lisp 개발 환경 갖추기 의 연장선상에 있으며 (Version 24 로 올라간 후 정말 많은 것이 바꼈습니다), Snow Leopard 에서 Emacs 를 Android 개발환경 IDE 로 세팅의 연장선상 이기도 합니다. 그 시절과는 정말 많은 것이 달라졌더군요. 


Android SDK 다운로드 
     
http://developer.android.com/intl/ko/sdk/index.html 에서 'USE AN EXISTING IDE' 라고 되어 있는 부분을 누르시면 SDK 만 받는 부분이 있습니다. 받아서 적당한 곳에 풀어주시면 됩니다. 저는 "~/work/android" 에 풀어줬습니다.
 
     
.profile 에 PATH 추가 

export ANDROID_SDK_HOME=/Users/<자신의 아이디>/work/android/sdk
export PATH=$ANDROID_SDK_HOME/platform-tools:$ANDROID_SDK_HOME/tools:$PATH

     
이 내용을 추가해 줍니다. 이제 어디서건 android 명령과 adb 명령을 사용할 수가 있게 됩니다. 
 
     
android-mode 설치해주기 

$ git clone git://github.com/remvee/android-mode.git


 로 적당한 곳에 받아줍니다. 제 경우에는 "~/.emacs.d/android-mode" 입니다. 그리고 "$ANDROID_SDK_HOME/tools/lib" 에 있는 android.el 을 "~/.emacs.d/android-mode" 에 복사해줍니다. 
 

.emacs 파일에 android-mode 관련 내용 추가 



(add-to-list 'load-path "~/.emacs.d/android-mode") 
(require 'android-mode)
(require 'android)
(setq android-mode-sdk-dir "~/work/android/sdk")


를 추가해줍니다. 각각의 디렉토리는 제 것을 기준으로 했으니 자신의 디렉토리로 바꾸어 주는 작업이 필요할 것입니다. 
 

JDEE (Java Development Environment for Emacs) 설치하기 

JDEE Project Page 에서 받을 수도 있지만 저는 편하게 미러에서 받는 것을 선택했습니다. 
     

$ cd ~/.emacs.d 
$ git clone git://github.com/emacsmirror/jdee.git


 라는 식으로 적당한 곳에 jdee 를 받아줍니다. 그리고 이것을 컴파일 해줘야 하는데 아마 그냥 안 될것입니다. 
 Ant-Contrib 이라는 것이 필요합니다. "여기" 에서 다운 받을 수 있습니다. ant-contrib-1.0b3-bin.tar.gz 를 다운받고 압축을 풀어서 (ant-contrib-1.0b3.jar 파일이 나옴) 위의 디렉토리인 "~/.emacs.d/jdee" 로 복사해줍니다.  

$ emacs ~/.emacs.d/jdee/build.xml 


로 간단한 조작을 해줍니다. 기존 부분을 아래와 같이 변경해 줍니다. (금방 찾을 수 있습니다 !!)

<!-- add in the contribs (add ant-contrib-VERSION.jar) to CLASSPATH -->
<taskdef resource="net/sf/antcontrib/antlib.xml">
  <classpath>
    <pathelement location="/Users/&lt;자신의 아이디&gt;/.emacs.d/jdee/ant-contrib-1.0b3.jar">
  </pathelement></classpath>
</taskdef>


$ cd ~/.emacs.d/jdee
$ ant build 

해 주면 모든것이 컴파일 됩니다. 
 

Elib-1.0 설치하기 

 예전에 링크로 걸어둔 곳에 가봤더니 이제 받는 곳을 찾기가 어려워 졌습니다. 아마 기본적으로 Emacs 에 포함된 것이 아닐까 생각도 해보지만 혹시 모르니 제 디렉토리에 있는 것을 올려둡니다. 

 
첨부파일을 다운 받으시고 
     

$ tar xvzf elib-1.0.tgz 


로 적당한 곳에 풀어주시면 됩니다. 참고로 저는 "~/.emacs.d/elib-1.0" 에 풀어줬습니다. 


JDEE 세팅하기 

 저는 보통 세팅을 나눠서 하는 것을 좋아합니다. 주력하고 있는 프로젝트에 따라서 .emacs 파일을 조금씩 조절하는 것을 즐겨하기 때문에 이번에도 그런식으로 했습니다. 

$ emacs ~/.emacs 

     
로 열어서 맨 아래쪽에 


(require 'cr-jdee)


를 추가해줍니다. 그리고 

$ emacs ~/.emacs.d/cr-jdee.el


로 열어서 다음과 같은 내용을 채워줍니다. 


;;;
;;; jdeee settings 
;;;


(add-to-list 'load-path "~/.emacs.d/elib-1.0")
(add-to-list 'load-path "~/.emacs.d/jdee/build/lisp")

(setq jde-help-remote-file-exists-function '("beanshell"))

(require 'jde)

;;
;; 저장할 때마다 자동으로 import 정리해주기 
;;
(defun java-my-hook ()
  (progn
    (define-key jde-mode-map [(control return)] 'jde-complete)
    (add-hook 'before-save-hook
              (lambda ()
                (jde-import-kill-extra-imports)
                (jde-import-all)
                (jde-import-organize))
              nil t)
    ))

(add-hook 'jde-mode-hook 'java-my-hook)


(custom-set-variables
 `(jde-global-classpath (quote 
    ("/Users/<자신의 아이디>/work/android/sdk/platforms/\
      <자신의 주력 타겟:예로 android-16>/android.jar" 
     "/Users/<자신의 아이디>/.emacs.d/jdee/build/classes"))))

(provide 'cr-jdee)



이렇게 저장해 주면 기본적인 세팅은 끝입니다. 중간에 java-my-hook 함수로 하는건 몇 가지가 있지만 그중에 제일 편리한 기능이 파일 저장할 때 알아서 import 문을 추가해 주는 기능입니다. Eclipse 의 Cmd + Shift + O 누르면 해주는 기능과 비슷합니다. 처음 실행할 때 beanshell 실행하느라 좀 느리긴 하지만 일일이 찾아주는 것보다 얼마나 편합니까? ㅎㅎ 
     

테스트 하기 

프로젝트 만들고 간단하게 빌드 + 테스트는 
예전 포스트 와 Command Line 에서 프로젝트 관리하기 를 참조하시면 됩니다. 이 부분은 추후에 조금 더 보강해서 정리하겠습니다. 

Android 를 개발하기에 제일 좋은 환경은 Eclipse 입니다.  android-sdk 에서 따로 plug-in 을 제공하고 공식문서에서 기본으로 설명하는 것이기 때문에 가장 좋은 환경이라고 할 수 있습니다. 이클립스는 기본적으로 진화된 Emacs 라고 불릴정도로 많은 기능과 다양한 플러그-인 쉬운 UI 인터페이스등 정말 좋은 IDE라고 할 수 있습니다.

그럼에도 불구하고 나는 독하게 Emacs 를 쓰시겠다고 하는 분들만 아래에 쓰여질 내용을 보시면 됩니다.

1.  Emacs 를 Android 개발 환경으로 쓸려고 하면 android-mode 를 설치해야 합니다. git 가 설치되어 있다고 가정하고

git clone git://github.com/remvee/android-mode.git


과 같이 입력합니다. 그러면 android-mode 라는 디렉토리가 생깁니다. 제 경우에는 그 디렉토리를 "~/.emacs.d/android-mode" 로 복사해줬습니다.

2. 그리고  저번 포스팅인 "[Android] Snow Leopard 에 SDK 설치하기" 에서 설치됐던 Android SDK 가 위치한 곳 (제 경우에는 저번 포스트에서 "~/work/android" 였습니다.) "PATH_ANDROID_SDK/tools/lib"밀에 있는 android.el 을 "~/.emacs.d/android-mode" 밑에 같이 복사해 줍니다.

3. 그리고  .emacs 파일에 다음과 같이 추가해 줍니다.

(add-to-list 'load-path "~/.emacs.d/android-mode")
(require 'android-mode)
(require 'android)
(setq android-mode-sdk-dir "~/work/android")

이렇게 하면 android-mode 의 기능과 android 에서 자체적으로 지원하는 android 기능을 두가지 다 쓸 수가 있습니다.

이제 실제로 프로젝트를 만들어 보기로 하지요. http://developer.android.com/guide/developing/other-ide.html 이클립스를 쓰지 않고 다른 IDE 를 쓸 경우에 참조해야 하는 곳입니다. 그중에서 프로젝트 만드는 것을 참조하기로 하겠습니다.

android create project \
--target <target_ID> \
--name <your_project_name> \
--path path/to/your/project \
--activity <your_activity_name> \
--package <your_package_namespace>
라는 식으로 만들게 되어 있습니다. 다 일반적인 내용이고 실제로 몇번 만들어 보시면 어떤식으로 돌아가는지 아실 수 있습니다. 참조한 사이트에서 설명도 충분하고요. 다만 target 을 실제로 어떤것을 써야 할지 감이 안오실 수 있을 실텐데요. Terminal 창을 한개 여시고

android list targets.

라고 입력하시면 target 에 대한 설명이 자세히 나옵니다. 저번 포스팅 "[Android] Snow Leopard 에 SDK 설치하기" 에서 만들어본 testMachine 이라고 하는 AVD 는 타겟이 "10" 입니다.

이렇게 만들어진 프로젝트에서 "path/to/your/project/<your_project_name>/src/<your_package_namespace 를 갈라서 디렉토리로표현>/<your_activity_name>.java" 파일을 열어서

M-x

android-ant-install

라고 입력하시면 프로젝트가 컴파일이 되고 알아서 인스톨이 됩니다.

android-mode 에서 쓸만한 단축키를 보여드리겠습니다.

"\C-c \C-c" 를 입력한 상태에서

   
    ("d" . android-start-ddms)
    ("e" . android-start-emulator)
    ("l" . android-logcat)
    ("c" . android-ant-compile)
    ("i" . android-ant-install)
    ("r" . android-ant-reinstall)
    ("u" . android-ant-uninstall)

단축키에 따라서 실행되는 명령들 입니다.

여기까지는 쉽게 따라할 수 있는 부분입니다. 이제부터가 어려운데 특히나 Snow Leopard 에 설치하는 것이라 더 힘들었던것 같습니다.

위에 나와 있는 내용대로 포스팅을 하면 그냥 노트패드 같은 에디터에서 개발하는 것과 별 차이가 없습니다. 기본적으로 code generation 이나 code auto-completion 등이 되지 않으면 쓰기에 많이 불편합니다. 그래서 JDEE (Java Development Environment for Emacs) 를 설치해서 사용하게 됩니다.

Emacs + JDEE 가 딱 자바용 Eclipse 라고 보시면 됩니다. 다시금 Eclipse 를 설치해서 개발하면 편하다는 것을 말씀드리고 싶습니다.

1. JDEE 를 다운 받습니다. http://sourceforge.net/projects/jdee/files/ 에서 받으시고. 2.4.0.1 버젼을 받으시면 됩니다. 압축을 푸시고 "~/.emacs.d/jdee-2.4.0.1/" 로 복사해 두시면 됩니다.

2. ELIB 이 필요합니다. JDEE 를 받은곳에 포함되어 있습니다. http://sourceforge.net/projects/jdee/files/ 에서 받으시고 버젼은 1.0 입니다. elib-1.0.zip 을 받으시고 압축풀고 "~/.emacs.d/elib-1.0/" 으로 복사해 두시면 됩니다.

3. CEDET (Collection of Emacs Development Environment Tools) 이 필요합니다. http://cedet.sourceforge.net/ 에서 다운이 가능합니다. http://sourceforge.net/projects/cedet/files/ 에서 cedet-1.0pre7.tar.gz 을 다운 받으시고 압축을 푸신 다음에 "~/.emacs.d/cedet/" 으로 복사합니다.

4. USER_HOME 에 (제 경우에는 /Users/crazia ) 에 있는 .bash_profile 파일을 열고 다음과 같은 내용을 추가합니다.

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
export JAVAC=$JAVA_HOME/bin/java

저장하고 Terminal 창을 한개 열고

source .bash_profile


이라고 바로 효과가 나타나게 해 줍니다.

5. 이제 .emacs 파일에 다음과 같은 내용을 추가해 줍니다.  (추가 설명을 해 가면서 붙이기 하겠습니다)

(add-to-list 'load-path "~/.emacs.d/cedet/common")
(add-to-list 'load-path "~/.emacs.d/cedet/contrib")
(require 'cedet)

JDEE 는 기본적으로 CEDET 을 필요로 합니다. CEDET 을 설정하는 부분입니다.

(add-to-list 'load-path "~/.emacs.d/elib-1.0")
(add-to-list 'load-path "~/.emacs.d/jdee-2.4.0.1/lisp")
(require 'jde)

elib 과 jdee 의 path 를 추가해 주는 부분입니다. 그리고 jde 를 불러줍니다.

(setq jde-run-mode-hook t)

이상하게 jde-mode-hook 이 안불려지는 버그가 있더군요. 그래서 추가해 줍니다. 강제적으로 mode-hook 을 불러서 실행해줍니다.

(setq
 jde-sourcepath '( "/Users/crazia/work/android/project" )
 jde-db-option-connect-socket '(nil "28380")
 jde-jdk-registry (quote (
              ("1.5" . "/System/Library/Frameworks/JavaVM.framework/Versions/1.5/")
              ("1.6" . "/System/Library/Frameworks/JavaVM.framework/Versions/1.6/")
              )
             )
 jde-jdk `("1.6")
)

jdk 버젼을 조정할 수 있게 구현해 주는 부분입니다. OSX 다 보니 java 가 깔려 있는 곳의 디렉토리가 일반적인 unix 와는 조금 다릅니다.

;; cua-mode 끄기
(cua-mode nil)

\C-RET 은 정말 편하게 쓸 수 있는 단축키 인데 cua-mode 가 항상 점유하고 있으면서 바꿔지지도 않습니다. 아예 cua-mode 를 꺼버리면 편하게 쓸 수 있습니다.

(add-hook 'jde-mode-hook
          (lambda()
            (define-key jde-mode-map [(control return)] 'jde-complete)
        (define-key jde-mode-map [(meta return)] 'jde-complete-minibuf)
        (define-key jde-mode-map [(shift return)] 'jde-complete-in-line)))

자동 완성 단축키를 지정합니다. 제일 많이 쓰는 것이 "\C-RET" 다 보니 그 단축키를 jde-complete 함수에 묶었습니다.

이제부터 Emacs 에서 Android 개발이 쉬워지게 세팅을 끝냈습니다.


+ Recent posts