Android Bootstrap

http://www.androidbootstrap.com/



Quality Tools for Android

https://github.com/stephanenicolas/Quality-Tools-for-Android



Android Libraries

http://www.openintents.org/en/libraries



Ultimate Android Library

http://www.theultimateandroidlibrary.com



Android Patterns

http://www.androidpatterns.com/



Android UI Patterns

http://www.androiduipatterns.com/



Resources every Android developer must know

http://www.bongizmo.com/blog/android-resources-each-developer-should-know/



SW아키텍처 실무자포럼 '모바일시스템 참조모델'

http://www.software.kr/mbs/swkr/jsp/board/view.jsp?boardId=143&boardSeq=1218201&id=swkr_040100000000





신고
Posted by 에코지오

댓글을 달아 주세요

  1. 임성묵 2014.03.25 15:08 신고  댓글주소  수정/삭제  댓글쓰기

    오.. androidbootstrap 은 처음보네요. 링크들 감사합니다.

  2. 이경래 2014.10.13 12:12 신고  댓글주소  수정/삭제  댓글쓰기


    갤탭3 10.1인치를 미국에서 사가지고 왔는데

    안드로이드 4.4.2 로 업그레이드 한 후 큰 문제 두가지 때문에 골치가 아프네요..

    1. 네이버 앱을 실행하면 화면에 네모난 검은 박스가 여러게 생기는 문제

    2. 화면이 흐려지가다 정지(먹통)되는 현상.....한참 기다려야 작동

    다운그레이드 하는 방법이나...해결 방법 없나요..?

  3. 이재현 2015.03.31 09:56 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 에코지오님
    한가지 너무너무 궁금한게 있어 이렇게 글을 남깁니다.
    다름아니라 이번에 모바일 웹+폰갭을 통해 하이브리드 앱을 제작하고있는대요
    모바일웹은(spring프레임워크) 개발하엿습니다. 그리고 cmd창에서 폰갭을 install해서 폰갭프로젝트를 만들어서
    총 모바일웹, 폰갭 이렇게 프로젝트가 2개로 되어있습니다.

    그런데 첨부파일다운로드, alert 관련해서 이제 폰갭이 제공하는 function을 이용해야지 다운로드 되고 메세지창도 이쁘게 나도더라고요 여기서 질문이 있는대요 폰갭에서 제공하는 function lib를 사용할려면 모바일 웹 소스를 폰갭 프로젝트에 import하고 환경셋팅해서 폰갭 프로젝트에 tomcat을 띄워서 사용해야하는건가요? 아니면 모바일 웹 프로젝트에 특정 js파일을 import하여 연동 시킬수 있는지 궁금합니다.

    메일로 보내주시면 많은 도움이 될꺼같습니다
    friend8805@naver.com입니다 감사합니다.

AndroidAnnotations 라이브러리와 비교하여 RoboGuice의 단점으로 지적되고 있는 사항을 해결하기 위한 방안입니다.



런타임시에 리플렉션(reflection) 사용에 따른 성능하락

- 스마트폰 하드웨어 성능이 점점 강해지고 있으므로 앞으로 큰 문제는 안될 것임

  또한 Dalvik VM의 리플렉션 성능이 점점 좋아지고 있음

- 게임처럼 대부분의 기능이 스마트폰 내에서 처리되는 앱이라면 문제될 수 있음

  그러나 주로 네트워크를 통해 서버측에서 결과를 받아 단순히 표출하는 클라이언트 앱의 경우에는 

  응답시간의 대부분은 네트워크 소요시간이 차지하며, 폰 로컬의 리플렉션 처리가 차지하는 시간은 매우 작을 것으로 판단됨. 

  따라서 클라이언트 앱에서 RoboGuice의 런타임 리플렉션은 큰 문제가 아님.



앱 용량이 많이 커지는 문제

- RoboGuice를 사용하기 위해 필요한 guice-3.0.jar 파일과 roboguice-2.0.jar 파일의 크기를 합치면 거의 820KB임.

- 반면, androidannotations-2.5.jar 파일은 53KB에 불과함

- 그러나 실제로 apk의 용량이 820KB만큼 커지는 것은 아니며 ProGuard를 적절히 설정하면 apk 파일 크기가 생각보다 많이 늘어나지 않음



RoboActivity 상속에 따른 Activity 클래스의 유연성 부족

- AndroidAnnotations에는 Activity에 @EActivity 어노테이션을 선언만하면 되기 때문에 Activity가 다른 액티비티를 상속받는 것이 가능함

- 그러나 RoboGuice에서는 RoboActivity를 상속받아야 하므로 다른 액티비티를 상속받을 수 없음

- 따라서 AOP를 통해서 다른 액티비티를 상속받지 않고도 기능을 추가할 수 있는 방법을 적용하는 것을 고려



유틸리티성 어노테이션 부족

- AndroidAnnotations는 @ViewById 같은 injection용 어노테이션 외에 @Click, @Rest, @Background, @UiThread 등의 다양한 유틸리티성 어노테이션을 제공함

- 반면 RoboGuice는 코드를 줄여주는 이러한 유틸리티가 별로 없음

- AndroidAnnotations 소스를 참고하여 유틸리티성 어노테이션을 처리하는 AOP 애스펙트를 개발하여 적용하면 됨(별로 어렵지 않음)

- @Click : (공통) 액티비티의 setContentView() 메소드에 after 어드바이스로 처리

- @Background, @UiThread : 메소드에 around 어드바이스로 처리

- @Rest : ... 고민중...






신고
Posted by 에코지오

댓글을 달아 주세요

UI 쓰레드가 아닌 일반 쓰레드에서 UI 작업처리를 위해 new Handler() 를 통해 Handler를 사용할 경우 아래와 같은 에러가 발생합니다.


java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()


그럼 UI처리를 위한 Handler는 UI 쓰레드에서만 생성해야 한다고 생각할 수 있습니다.

http://huni.springnote.com/pages/5402287



그러나 그렇지 않습니다. 임의의 쓰레드에서도 UI작업용 Handler를 사용할 수 있습니다.

http://blog.naver.com/PostView.nhn?blogId=rgjoon&logNo=90094338577



다만, UI 작업을 처리하기 위해서는 아래와 같이 UI쓰레드에 바인딩된 Handler를 만들어야 합니다.

http://stackoverflow.com/questions/6369287/accessing-ui-thread-handler-from-a-service


Handler handler = new Handler(Looper.getMainLooper());




* 참고

http://www.aviyehuda.com/2010/12/android-multithreading-in-a-ui-environment/

http://babtingdev.tistory.com/276


신고
Posted by 에코지오

댓글을 달아 주세요

  1. Blaaaaack 2014.12.05 10:00 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다~ 덕분에 막히던 문제를 해결했네요!

  2. BlogIcon webnautes 2016.06.05 03:11 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다.. 덕분에 에러나던거 잡았네요

  3. 김민재 2017.08.03 02:07 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다ㅜㅜ 덕분에 문제 해결했습니다ㅎㅎ
    글 좀 제 블로그에 참고 좀 할게요!

이클립스 프로젝트에 RoboGuice(RG) 2.0 설치하기

- 안드로이드프로젝트의 libs에 roboguice-2.0.jar, guice-3.0-no_aop.jar, javax.inject-1.jar 파일을 넣고 빌드패스에 추가

- RG 2.0에서는 RoboApplication 상속받은 Application을 작성해서 AndroidManifest.xml에 등록할 필요는 없음

  


Activity 작성

- RoboActivity 상속받은 Activity 작성

- @InjectView , @Inject 등의 어노테이션 사용



모듈 주입 커스터마이징

- AbstractModule 클래스를 상속받는 클래스 작성

- configure() 메소드에서 커스텀 바인딩 정의 : 자세한 구현은 Google Guice 문서 참조

- res/values/roboguice.xml에 아래처럼 컴스텀 모듈 등록


<?xml version="1.0" encoding="utf-8"?>

  <resources> 

    <string-array name="roboguice_modules">

    <item>com.mypackage.MyModule</item>

  </string-array>

</resources>




인스턴스 스코프

RG에 의해 생성 및 관리되어 다른 클래스에 주입되는 클래스의 인스턴스 스코프(생명주기) 설정


1. Singleton 스코프

- 앱에서 하나의 인스턴스만 존재

- 클래스에 @Singleton 어노테이션 선언 : Guice에서 제공

- 어떤 클래스에서 이 객체를 요청하든 동일한 인스턴스가 제공됨. 그러므로 쓰레드세이프하게 작성해야 함.

- Application 컨텍스트는 직접 주입 받을 수있음(특정 Activity, Service 등 current context랑 관계없는 global context)

- current context(액티비티 컨텍스트)를 주입받으려면 Provider<Context>를 사용해야 함

- 싱글턴 스코프를 가진 기본제공 모듈 : Application, ViewListener, Resources 등?

=> 그러나 RG에서 제공하는 대부분의 모듈은 context를 필요로 하므로 ContextSingleton 스코프를 갖는다.

- current context가 필요없거나 또는 Application 컨텍스트만 필요한 클래스에 적합


2. ContextSingleton 스코프

- current context(액티비티 컨텍스트)에 대해서 하나의 인스턴스만 존재

- 클래승 @ContextSingleton 어노테이션 선언 : RG에서 제공하는 스코프

- current context가 필요한 클래스는 ContextSingleton으로 선언

- 동일 액티비티 객체에 대해서 동일 인스턴스 제공(모든 액티비티에 대해서 동일 인스턴스 제공은 아님)

- Application, Context, Activity, Service 등 @Singleton/@ContextSingleton 클래스를 직접 주입받을 수 있음

- 컨텍스트싱글턴 스코프를 가진 기본제공 모듈 : Context, Activity, Service, AssetManager, ContentResolver,

   LayoutInflator 및 기타 시스템서비스 모듈들

- current context가 필요한 클래스에 적합


3. 프로토타입 스코프

- 요청할 때마다 새로운 인스턴스 생성

- 클래스에 별도의 스코프 어노테이션 선언 없음. (프로토타입이란 용어는 제가 스프링에서 따온 것임)

- 주입될 때마다 또는 provider.get() 할 때마다 새 인스턴스가 생성됨

- 스코프가 설정돼있지 않고 public 기본생성자가 존재하는 모든 클래스가 가능

- Handler처럼 Provider에서 get() 요청시마다 새로운 인스턴스를 리턴하는 클래스

- context가 필요없고 상태를 가진 클래스에 적합


스코프 지정 방법

 (1) 구현체 클래스에 @Singleton 붙임

 (2) @Provides 붙은 메소드에 @Singleton 붙임

 (3) bind().xxx().in(Singleton.class);


주요 기본제공 클래스의 스코프

http://code.google.com/p/roboguice/wiki/ProvidedInjections



어떤 컨텍스트를 주입받을 것인가 

- http://code.google.com/p/roboguice/wiki/InjectingContexts

- current context가 필요한게 아니라면 명시적으로 Application을 주입받아라

- Activity가 필요하다면 Activity를 주입받아라

- 잘 모르겠으면 Context를 주입받아라



Inject 되기 위한 생성자 조건

- 기본 생성자가 존재하거나 

- Inject가능한 파라미터로만 구성되고 @Inject 선언된 생성자가 존재


  @Inject

  SomeClass(Context context, MyComponent component) {}

  // 여기서 context와 component는 inject 가능해야함...



일반 POJO 클래스에 다른 객체들을 주입하는 방법

1. POJO 생성을 RG가 처리하는 경우 

- POJO 내부의 @Inject로 선언된 멤버들은 자동 주입됨

- POJO 클래스가 RoboActivity를 상속받는 액티비티의 @Inject 멤버변수로 선언돼있는 경우 등


2. POJO 생성을 RG가 처리하지 않는 경우(개발자 또는 라이브러리에서 직접 생성하는 경우)

- POJO 생성자 등에서 RoboGuice.injectMembers(context, this)를 이용하여 수동으로 주입함



명시적인 injector 사용을 피하는 방법(생성자 등 초기화 메소드를 핸들링할 수 없는 경우)

- 클래스 또는 Provider, ContextScopedProvider를 static하게 inject 받음

- http://code.google.com/p/roboguice/wiki/HowToInjectXYZ

 

 @Inject protected static ContextScopedProvider<T> tProvider; // T는 @ContextSingleton이어야함

 @Inject protected static ExceptionHandler;//singleton


=> 단, MyModule에서 requestStaticInjection(POJO.class)을 해주어야 함

=> 그러나 RG 2.0에서는 static injection을 비권장 ( http://code.google.com/p/roboguice/wiki/UpgradingTo20 )

=> static injection은 context에 액세스할 수 없는 클래스 및 static 메소드를 가진 헬퍼나 유틸 클래스에 적합할 듯.

(http://www.rosscode.com/blog/index.php?title=android-development-part-3-wiring-up-roboguice&more=1&c=1&tb=1&pb=1 )



Provider란 무엇인가

- 인스턴스 생성이 복잡한 경우 인스턴스를 만드는 방법을 제공

- 예를들어 new MyPojo()로 객체 생성후 myPojo.init() 등의 추가 작업한 인스턴스를 리턴

- MyPojo를 주입받는 모듈은 초기화 완료된 MyPojo 인스턴스를 받게 됨

- Module에서 @Provides 어노테이션을 쓰는 메소드를 작성해도 됨(Provider 인터페이스 구현안해도 됨)

- http://code.google.com/p/google-guice/wiki/ProvidesMethods




명시적/묵시적 바인딩

- 명시적 바인딩 : Module에서 bind().to(), bind().toProvider()로 바인딩하는 것

- 묵시적 바인딩 : 

   (1) 기본생성자나 inject가능한 생성자를 가진 구현 클래스가 존재하는 경우

   (2) @ImplementedBy를 통해 기본 구현체를 지정한 경우

   (3) @ProvidedBy를 통해 구현체 인스턴스를 생성해줄 Provider를 지정한 경우



AOP 애스펙트에도 RG의 inject가 가능한가

- 가능함. Aspects.aspectOf()를 통해 aspect 싱글턴을 구하여 Guice 모듈에서 강제 inject시켜줌.



Injection 이후에 지정된 메소드 호출

- Guice의 TypeListener를 이용하거나 GuiceyFruit 또는 MyciaGuice의 @PostConstruct를 사용

- http://stackoverflow.com/questions/2093344/guice-call-init-method-after-instantinating-an-object

- http://code.google.com/p/mycila/wiki/MycilaGuice

- http://code.google.com/p/guiceyfruit/




* 참고

RoboGuice 2.0 설정 방법 : http://code.google.com/p/roboguice/wiki/UpgradingTo20


신고
Posted by 에코지오

댓글을 달아 주세요

1. RoboGuice 2.0

- RoboActivity의 onContentChanged() 메소드에서 View 주입(inject)


    @Override

    public void onContentChanged() {

        super.onContentChanged();

        RoboGuice.getInjector(this).injectViewMembers(this); //View 주입

        eventManager.fire(new OnContentChangedEvent());

    }



2. AndroidAnnotations 2.5

- 언더바 붙은 Activity(Java Annotation Processing에 의해 생성)의 setContentView() 메소드에서 View 주입 및 @Click 처리


    @Override

    public void setContentView(int layoutResID) {

        super.setContentView(layoutResID);

        afterSetContentView_();

    }



    private void afterSetContentView_() {

        //View 주입 코드

        mSaveBtn = ((Button) findViewById(id.save_btn)); 

        // ... ...


        // @Click 처리 코드

        {

            View view = findViewById(id.save_btn);

            if (view!= null) {

                view.setOnClickListener(new OnClickListener() {



                    public void onClick(View view) {

                        save();

                    }


                }

                );

            }

        }

        //... ...


        init();

        //... ...

    }


신고
Posted by 에코지오

댓글을 달아 주세요

RoboGuice 2.x 사용 환경에서 ProGuard 설정에 추가해줄 내용입니다.

(참고 : http://code.google.com/p/roboguice/wiki/ProGuard)


# res/values/roboguice.xml 파일에 풀네임이 지정되는 클래스 보존

-keep class * extends com.google.inject.AbstractModule


# 참조할 수 없다는 경고 제거(can't find referenced method)

-dontwarn roboguice.**


# roboguice,guice 클래스 및 멤버 보존(필요에 따라 좀더 세밀하게 조정할 것)

-keep class roboguice.event.EventThread { *; }

#-keep public class roboguice.**

#-keep public class com.google.inject.**


# @Inject 붙은 생성자/필드/메소드 및 public 기본생성자 보존

-keepclassmembers class * {

    @com.google.inject.Inject <init>(...);

    @com.google.inject.Inject *;

    public <init>();

}


# There's no way to keep all @Observes methods, so use the On*Event convention to identify event handlers

-keepclassmembers class * {

    void *(**On*Event);

}

신고
Posted by 에코지오

댓글을 달아 주세요

안드로이드 코딩시 도움이 되는 대표적 오픈소스 프레임워크/라이브러리인 RoboGuice와 AndroidAnnotations에 대한 비교 메모입니다.


1. RoboGuice (RG)

- Injection 대상 : View, Resource, 시스템서비스, POJO 등

- 향상된 유틸리티 클래스 제공 : RoboAsyncTask, Ln 등

- 액티비티 생명주기 Event 전달을 통한 모듈화 메커니즘 제공 : 액티비티에 대한 강한 커플링을 제거.

- Activity는 RoboActivity를 상속받아야 함

- Activity가 아닌 클래스에서도 안드로이드 컴포넌트 inject 가능

- 구글 Guice에 의존 : 강력하고 충실한 inject 기능 제공

- 런타임시에 inject 및 어노테이션을 처리하므로 성능하락 존재

- 용량 큼 : 590KB



2. AndroidAnnotations (AA)

- Injection 대상 : View, Resource, 시스템서비스, POJO(제한적) 등

- 다양한 유틸리티성 어노테이션 제공. inject외에 다양한 작업을 어노테이션을 통해 처리

 : 쓰레드작업(UiThread, Background,..), 이벤트처리(Click, ItemClick,...), REST통신 등

- 컴파일 타임에 inject 및 어노테이션 처리한 자식클래스를 생성 : 런타임 성능하락 없음

- 특정 Activity 상속 필요없음

- java annotation processing 설정 필요

- 새 액티비티 클래스 작성후 Android Manifest.xml 수정이 필요 => 액티비티 클래스명 끝에 언더바를 추가해줘야함

 : 예를들어 ".xxx.MyActivity" -> ".xxx.MyActivity_" 

- 명시적으로 액티비티 사용시에 언더바 붙은 액티비티를 사용해야 함

- 용량 작음 : 53KB



* 참고자료

http://blog.springsource.org/2011/08/26/clean-code-with-android/

http://blog.softwaregeeks.org/archives/647

신고
Posted by 에코지오

댓글을 달아 주세요

안드로이드 앱 프로젝트가 AspectJ 클래스를 포함하고 있는 안드로이드 라이브러리 프로젝트를 참조하는 경우에, 라이브러리 프로젝트의 aspect는 예상과는 달리 앱 프로젝트에 적용되지 않습니다. 

그러니까 앱 프로젝트의 소스 컴파일시에 라이브러리 프로젝트의 aspect들과 함께 위빙되어 컴파일이 돼야하는데 그렇지 않다는 겁니다.

아래의 방법으로 해결할 수 있습니다.


1. Aspect Path 설정

앱 프로젝트 속성창 > AspectJ Build > Aspect Path 탭에서 "Add Project"를 통해 라이브러리 프로젝트를 추가해줍니다.

(아래 그림에서는 mobile-framework-android 프로젝트가 라이브러리 프로젝트입니다)




이렇게 하면 AspectJ 컴파일러가 앱 프로젝트 빌드시에 라이브러리 프로젝트에 포함된 aspect를 포함하여 함께 위빙시킵니다.

(라이브러리 프로젝트의 bin/xxx.jar 파일을 추가해도 되며, jar파일이 'Reference Libraries' 변수로 자동 추가됨)


2. Ant 빌드파일 설정

custom_rules.xml의 iajc 타스크에 아래 설정을 추가합니다.


      <aspectPath>

        <!-- 라이브러리 프로젝트에 속한 애스펙트도 적용 -->

        <path refid="project.libraries.jars" />

      </aspectPath>



신고
Posted by 에코지오

댓글을 달아 주세요

최근에 Android SDK 버전을 r17로 업그레이드하고 나니 바뀐 점이 꽤 많더군요. 


1. 안드로이드 라이브러리 프로젝트

- bin 디렉토리에 R.class를 제외한 컴파일된 클래스를 포함하는 .jar 파일이 만들어짐.
  프로젝트이름이 my-library이면 my-library.jar 파일이 생성됨.


2. 안드로이드 앱 프로젝트

- libs 폴더의 모든 jar 파일이 'Android Dependencies' 라이브러리 변수에 자동으로 포함되어 빌드패스에 추가됨

- 라이브러리 프로젝트를 참조 라이브러리로 추가할 경우 라이브러리 프로젝트의 빌드 결과물 jar 파일이
  역시 'Android Dependencies' 라이브러리 변수에 자동으로 포함됨. 또한 라이브러리 프로젝트의 소스가 소스패스에 자동으로 추가됨.



* ADT를 통한 빌드시 자꾸 Dalvik 포맷 에러 발생하는 이슈 해결방법

- Conversion to Dalvik format failed with error 에러가 발생함

=> 앱 프로젝트에 자동으로 추가된 라이브러리 프로젝트의 소스폴더를 소스패스에서 제거해줌


* jar 파일과 소스 연결 이슈 해결방법

- 'Android Dependencies'에 포함된 jar 파일에 대해서 소스를 따로 attach할 수가 없음

=> jar 파일안에 .java 소스를 포함시키면 됨



3. ProGuard 설정

- 프로가드를 사용하려면 project.properties에서 아래 라인을 주석해제함.


proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt


- 설정파일이 proguard.cfg에서 proguard-project.txt로 변경되었으며, proguard-project.txt에는 프로젝트 specific한 내용만 작성.


4. Ant 빌드
- 여러가지 바뀜. 자세한 내용은 Android 사이트 참고.. -.-;;

* 참고하세요.

신고
Posted by 에코지오

댓글을 달아 주세요

1. 우리가 작성한 코드에 대해서만 위빙이 가능

 AOP에서 위빙하는 방식은 시점에 따라 컴파일타임 위빙과 런타임 위빙으로 나눌 수 있습니다. 

안드로이드 Dalvik VM(.class 를 변형한 .dex 포맷을 사용)은 아직까지 런타임 바이트코드 생성을 지원하지 않습니다. 따라서 안드로이드에서는 런타임 위빙을 사용할 수 없고, 컴파일타임 위빙만 가능합니다(AspectJ는 컴파일 타임 위빙을 지원합니다).

우리가 작성한 소스코드에 대해서만 인터셉트할 수 있으며, 안드로이드 프레임워크나 그외 라이브러리에 대한 어드바이스는 작동하지 않습니다.


예들들어 Activity 클래스의 onCreate() 메소드에 대한 execution() 포인트컷은 작동하지만, 반면에 call() 포인트컷은 작동하지 않습니다. 왜냐면 onCreate() 메소드를 호출하는 클래스는 수정불가한 안드로이드 프레임워크에 속하기 때문입니다.


그리고 before나 after 같은 어드바이스를 통해 우리가 작성한 Activity 클래스의 예들들어 onResume() 라이프사이클 메소드에 로직을 추가하기  위해서는 반드시 해당 액티비티 클래스에 onResumE() 메소드 "코드"가 존재해야합니다. 비록 액티비티가 상속받은 android.app.Activity 클래스에 이미 onResume()  메소드가 존재하지만, 런타임이 아닌 컴파일 타임에 위빙이 수행되므로 어드바이스가 적용되기 바란다면 onResume() 메소드를 오버라이드 해주어야 합니다.



2. thisJointPoint 를 사용하기 위한 이클립스 설정

어드바이스 안에 thisJointPoint 키워드를 사용하는 코드가 존재하면 컴파일은 되지만 실제로 런타임에 아래와 같이 AspectJ 클래스를 못찾는다는 에러가 발생합니다.


Caused by: java.lang.NoClassDefFoundError: org.aspectj.runtime.reflect.Factory


이는 AJDT 플러그인에 의해 빌드패스에 추가된 'AspectJ Runtime Library' 라이브러리(aspectjrt.jar) 파일이 최종 dex 파일에 포함되지 않아 발생하는 문제입니다. 프로젝트 빌드패스 설정창의 "Order and Export" 탭에서 "AspectJ Runtime Library" 항목을 체크해주면 해결됩니다.


그러나 여전히 Ant 빌드(build.xml)를 통해 빌드를 시도하면 NoClassDefFoundError 에러가 발생합니다. build.xml을 수정해줄 수도 있지만 그냥 aspectjrt.jar를 libs 폴더에 넣어두면 간단히 해결됩니다. libs에 존재하는 jar 파일은 "Android Dependencies " 형태로 빌드패스에 자동으로 추가되므로 AJDT에 의해 추가된 'AspectJ Runtime Library'는 더이상 필요없습니다.


결론적으로  안드로이드 라이브러리('Android 2.3.x' 같은) 변수와 'Android Dependencies' 라이브러리 변수를 제외한 모든 외부 라이브러리 변수는 제거하고 필요한 모든 외부 jar 파일은 libs 폴더에 넣어두는 것이 좋습니다.


신고
Posted by 에코지오

댓글을 달아 주세요

  1. 2012.04.18 20:44  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • BlogIcon 에코지오 2012.04.16 16:35 신고  댓글주소  수정/삭제

      안녕하세요. 제 개발환경 버전을 말씀드리자면 jdk1.6, eclipse indigo, android sdk 17, adt 17, aspectj 1.7입니다. 그외 안드로이드 관련 사이트는 검색해보면 많이 나오는데요... 제가 운영하는 사이트인 javarss.pe.kr 에 보시면 안드로이드 관련 사이트가 몇개 나옵니다. 안드로이드 펍같은 커뮤니티도 있고 개인 블로그도 있구요. AspectJ는 검색해서 보시거나 문서로 공부하시는게 나을거 같네요. 사실 aspectj는 저도 잘은 모릅니다. try & error 방식으로 공부 중입니다.



티스토리 툴바