Why? 왜 우분투에서 안드로이드 앱 개발을 해야할까?
    1. 윈도우 보다는 안드로이드 개발하기가 편하다.
      이유 : 윈도우에서 안드로이드폰을 테스트하기 위해서는 USB 드라이버를 제조사별로 설치해야 한다.
        -> 우분투에서는 android용 rule.set만 설정해주면 된다.
    2. 무료로 사용할 수 있는 안정적인 리눅스 운영체제이다.
    3. 개발 중에 필요한 서버테스트 환경 등을 손쉽게 구축할 수 있다.



  적어도 안드로이드 앱 개발자에게는 윈도우보다는 나은 환경을 제공한다(맥북에서 써보니까 맥북도 괜찮다. 하지만, 맥북을 사야한다. 우분투는 지금 쓰는 노트북의 운영체제를 밀고 설치하면 된다).
  우분투에서 안드로이드 앱 개발환경을 구축하기는 쉽다.


1. JDK 설치하기
    1.1. JDK 설치 여부 확인
        - honeymon$ java -version
            = 설치되어 있는 경우 : 2.1.로 넘어가자.
            = 설치되어 있지 않은 경우 : 1.2.로 넘어가자.
    1.2. JDK 설치하기
        - JDK 중 하나를 선택하자.
            = OpenJDK(참조하는 라이브러리에서 오류가 발생한다고 합니다. 다른 분들은 이걸 비추.)
            = SunJDK(많은 분들은 이걸 추천합니다.)
            = IBMJDK 듣보잡!
        - JDK를 설치하기
            = sudo apt-get install sun-6-jdk
            = 설치 완료 확인 : java -version
2. Android SDK 설치하기(ADK -> Android SDK로 변경)
    2.1. 구글 안드로이드 개발 사이트 : http://developer.android.com/index.html
        - 우분투용 Android SDK를 다운로드 받는다
            = Android SDK url : http://developer.android.com/sdk/index.html
            ** i386이라고 되어있지만 아키텍쳐(32bit/64bit)는 크게 신경쓰지 않아도 된다.
        - Android SDK를 지정한 위치에 푼다.
            = honeymon : /home/honeymon/Dev/android-sdk 에 설치함
    2.2. Android SDK가 설치된 경로(PATH)를 .bashrc 에서 설정해준다.
        - 설정 이유 : adb, ddms와 같은 안드로이드를 다루는데 필요한 커맨드를 실행할 수 있도록 해주는 것이다.
        - Tip. 윈도우에서는 1개의 경로가 끝나면 끝에 ;(세미콜론)을 붙이지만, 유닉스와 리눅스에서는 :(콜론)을 사용한다.
          = 윈도우 사용자가 유닉스나 리눅스 환경에서 낯설어하는 부분 중 하나다. 윈도우가 유닉스를 따라한 것이다. 모든 운영체제의 시작은 유닉스였다고 보면 된다.

설정방법 :
  .bashrc 제일 마지막 문장에 PATH 추가

ANDROID_PATH=/home/honeymon/Dev/android-sdk
PATH=$PATH:$ANDROID_PATH/bin

    2.3. Android SDK 경로설정이 완료되었는지 확인한다.
        - adb help
3. Eclipse 설치하기
    3.1. Eclipse DownLoad site : http://www.eclipse.org/downloads/
        - Eclipse IDE for Java Developers 가 안드로이드 앱 개발에는 더 적합해 보인다.
        - 내가 처음에 배울 때는 Eclipse classic 을 추천받았었는데...
    3.2. Eclipse의 압축을 푼다.
    3.3. eclipse.ini 환경을 설정한다.
        - 개발에 적합한 것들과 설정했을 때 관련이 있는 것을 알려준다.
    3.4. eclipse를 설치한다.
4. ADT 플러그인 설치하기
    - 참고 사이트 : http://developer.android.com/sdk/eclipse-adt.html
    4.1. eclipse adt update site 추가 : https://dl-ssl.google.com/android/eclipse/
    4.2. Update 목록에 나온 플러그인을 선택하고 설치한다. 설치 완료 후 이클립스 재시작
    4.3. android Manager에서 ADK의 위치를 설정한다.
    4.4. 개발하려고하는 android 버전의 라이브러리를 확인한다.
        - 다운로드 속도가 느린 편이므로 마음의 여유를 가지고 임하자.
    4.5. 라이브러리 다운로드가 완료된 후 이클립스를 다시 시작한다.
5. ADT 설치확인
    5.1. Android manager를 선택한다.
    5.2. Android Emulator를 추가한다.
    5.3. Android Emulator를 실행한다.
    5.4. DDMS perspective를 선택하여 화면전환 후 5.3.에서 실행한 에뮬레이터가 인식되는지 확인한다.
    5.5. 가볍게 화면을 캡쳐해본다.
6. Android Project 생성하기(맛뵈기)
    6.1. Android Project 추가
    6.2. 실행하기
        - Android Application 선택 -> 수행
    6.3. 5.3.에서 실행한 Emulator에서 실행되는지 확인하기
        - Emulator가 동작하는데 걸리는 시간은 실제 안드로이드가 실행되는 시간보다 오래걸린다.
        - CPU의 성능에 따라서 그 차이가 제법 난다.
        - Emulator보다는 넥서스, 넥서스S, 넥서스 프라임과 같은 레퍼런스폰을 개발기기로 연결해서 테스트하는 것이 좋다.
    6.4. 실행시킨 에뮬레이터가 에뮬레이터에 보이면 정상적인 빌드 및 설치가 완료된 것이다.
7. 안드로이드 개발 Tip
    7.1. Java에 대한 공부는 꾸준하게 한다.
    7.2. 커뮤니티 활동을 한다.
    7.2. 로그(Log)를 잘 이용해서 동작을 체크하자.
        - 디버그(Debug)모드를 자주 이용하면 동작을 한눈에 확인하기 어렵다.
        - 기록(로그)을 세밀하게 남겨서 확인하는 습관을 가지자.
    7.3. Android Reference를 꼼꼼히 읽어두자.
        - 어느 개발서적보다 낫다.
        - 개발서적들은 대부분 저자가 자세히 모르는 내용은 얼버무리게 된다.

     



P.S. 안드로이드 개발용 rule.set 설정하기

안드로이드에서 위치정보를 가져오기 위해 사용하는 클래스가 LocationManager이다.

Location location = locationManager.getKnowLastLocation(LocationManager.GPS_PROVIDER);


의 형태로 정보를 가져오게 되는데, 앱을 개발하다가 이 API를 이용해서 위치정보를 가져오지 못하는 상황을 계속 접했다.

위치정보를 내놓지 못하는 폰이 '갤럭시S' 였기 때문에 '갤쓰레기!!'라며 속으로 욕하면서 인터넷 검색을 했지만 사람들은

나와 비슷한 반응을 보이며 안된다고 이야기 하고 있었다.


하지만 폰에 설치된 위치정보 서비스를 제공하는 앱들은 위치정보를 정상적으로 가져오고 있었다. 그럼 왜 그런거지?

혹시나 하는 마음에 무선WiFi를 끄고 3G로 접속한 후에 약간의 인터넷 서핑과 위치정보 앱을 가동시켰다. 이렇게 하면, '위치정보가 저장되지 않을까?'라는 기대를 하면서한 시도였다.

그렇게 한 후에 위의 코드를 다시 실행하니까!!

왠걸!

위치정보를 가져오는 것이다. 이런이런!!

다른 폰들도 확인을 해봤다. 처음에는 위치정보를 가져오지 못했었는데, 3G 로 접속해주고 위치정보 앱 실형시켜주니까

그 이후로는 정상적으로 동작한다.


이 위치정보를 가져오기 위해 무선WiFi에 연결한 상태에서 위치정보 앱을 실행시켰을 때는 그 정보를 가져오지 못했는데...

내가 기대한 바를 보란 듯이 외면해주는 안드로이드.



   정리 
 

1. 안드로이드는 오랫동안 꺼져있다가 켜지면 위치정보를 가지고 있지 않다.

2. WiFi만 연결해서는 네트워크를 이용한 위치정보를 가져오지 못한다.

3. GPS를 켜고 위치정보를 가져올떄까지 기다리는 리스너를 통해서 위치정보를 가져올 수는 있다.

4. 내가 구현한 방식 : GPS를 10초동안 동작시켜서 그동안 위치정보를 가져오면 그 정보를 등록하고, 그렇지 않을 경우에는 네트워크 위치정보를 가져와서 사용하도록 만들었다. 오랫동안 GPS 정보를 가져오는 것을 꺼려했다.

5. 문제의 원인 : 그런데 테스트에 사용된 스마트폰들은 개발 이후 꽤 오랜시간을 꺼져있는 상태로 방치되었던 탓에 이런 위치정보 등이 소거된 상태였을 것이다. 내가 만든 방식과 WiFi 에만 연결된 형태로 인해서 위치정보를 가져올 수가 없었다.

6. 조치방법 : 3G를 켜고 인터넷 서핑과 위치정보 서비스를 이용. 개인적인 생각으로는 '3G'만 켜서 잠시 내버려둬도 될 것이다.


프로젝트에서 하이브리드앱 형태로 해서 모바일웹페이지를 안드로이드의 웹뷰에서 보여주며 동작시키는 앱을 만들었다.

제조사마다 다양한 종류의 디바이스에서 테스트를 해봐야하는 안드로이드 개발은 앞으로도 고역이 될 것 같다.


얼마간 나를 괴롭히던 녀석이 있었다.

로그인을 할때 CookieManager를 이용해서 웹뷰의 쿠키 Sync를 맞춰두고 로그인상태를 유지하도록 만들었다.

이 싱크를 맞추는 작업이 지금까지도 곤혹스럽다. 


갤럭시S는 사용자가 많다. 그런데 가장 이상한 안드로이드폰이 갤럭시S다. 갤럭시S를 제외한 안드로이드폰들에서는

정상적으로 동작하는 앱이 꼭! 갤럭시S에서는 다르게 반응하는 것이다. 후아.

인터넷을 뒤져보다가 이 문제에 대한 해결책을 찾았다.


  
/**
 * Remove all session cookies, which are cookies without expiration date
 */
public void removeSessionCookie() {
    final Runnable clearCache = new Runnable() {
        public void run() {
            synchronized(CookieManager.this) {
                Collection> cookieList = mCookieMap.values();
                Iterator> listIter = cookieList.iterator();
                while (listIter.hasNext()) {
                    ArrayList list = listIter.next();
                    Iterator iter = list.iterator();
                    while (iter.hasNext()) {
                        Cookie cookie = iter.next();
                        if (cookie.expires == -1) {
                            iter.remove();
                        }
                    }
                }
                CookieSyncManager.getInstance().clearSessionCookies();
            }
        }
    };
    new Thread(clearCache).start();
}

위의 소스를 보면 마지막에 new Thread(clearCache).start()가 실행되는 것이 보인다. CookieManager.removeSessionCookie() 가 스레드로 실행되는 것을 확인할 수 있다.

갤럭시S가 다른폰들과 다른 반응을 보인 부분이 이 부분이다.


인터넷에 해결방법이 있을까?


하는 생각으로 인터넷을 뒤적거리다가 해결방법을 찾았다.

jinu's blog : Android webview cookie sync 문제 : http://jinu.info/blog/372

1년 전에 작성된 글인데, 글의 중간에 보면

try { Thread.sleep(500); } catch (Exception e) {}


위의 코드가 핵심이다. 500ms의 강제 대기시간을 주어서 cookieManager가 세션쿠키를 삭제할 수 있는 충분한 시간적인 여유를 부여한 후에 진행되도록 하는 것이다.


<< 위의 내용을 힌트삼아서 수정한 소스 >>

  
public void removeAllCookie() {
        Log.d(LOG_TAG, "webViewHelper removeAllCookie execute.");
        cookieManager.removeAllCookie();
        threadSleep();
        setDefaultCookies();
        CookieSyncManager.getInstance().sync();
    }

    public void removeSessionCookies() {
        Log.d(LOG_TAG, "webViewHelper removeSessionCookies execute.");
        cookieManager.removeSessionCookie();
        threadSleep();
        this.httpClient = null;
        setDefaultCookies();
        CookieSyncManager.getInstance().sync();
    }

    private void threadSleep() {
        try {
            Thread.sleep(500);
        } catch (Exception e) {
            Log.d(LOG_TAG, "thread Exception!");
        }
    }

처럼 처리했다.

안드로이드 프로젝트를 SVN에 등록하고, 소스버전관리를 하다가 작업폴더를 정돈하면서 옮기기 위해 SVN에 있는 Check out으로 내려받았다. 그런데 이클립스 이녀석!!이 내려받은 안드로이드 프로젝트를 제대로 인식하지 않는 것이다. 몇가지 방법을 동원해봤지만 마음에 들지 않는다.

그래서 인터넷 검색을 했다. 그리고 발견했다.


링크 : SVN으로 받은 후 android 프로젝트로 인식시키는 방법



방법 :


1. SVN으로 원하는 안드로이드 프로젝트를 체크아웃(Check Out)하여 소스를 내려받는다.

2. new Project 를 이용해서 새로운 안드로이드 프로젝트를 생성한다.

3. 파일 탐색기등을 이용해서 새로 생성한 안드로이드 프로젝트 폴더 루트에 있는 .classpath, .project 파일 두개를 'SVN으로 내려받은 안드로이드 프로젝트 루트'에 복사한다.

4. F5를 눌러서 프로젝트를 다시 읽는다.

5. 대체적으로 정상적으로 인식 될 것이다.


딱히 이클립스에서 해결할 수 있는 방법은 없는 것으로 보인다. 다음에는 maven을 이용해서 프로젝트 소스와 라이브러리를 관리해볼까한다. 미루지말고 이녀석부터 당장해볼까? ㅡ_-)?

+ Recent posts