본문 바로가기

안드로이드 개발/Native

안드로이드 DexClassLoader를 이용한 dex동적으로 로딩

반응형

안드로이드 DexClassLoader를 이용한 dex동적으로 로딩





안드로이드의 Dalvik VM은 실행 파일인 dex를 지정된 위치에서 로딩하는 대신, 동적인 위치에서 읽어들일 수 있다. 

DexClassLoader을 이용하는 방법인데, 동적인 위치에서 읽음으로 다음과 같은 장점이 있다.



1. 무거운 어플리케이션을 개발하였는데, Java Heap 사이즈 제한에 걸려 어플리케이션 실행시 메모리 할당을 할 수 없는 경우.

2. 런타임 중 동적으로 기능을 확장이 필요한경우. (티스토어/구글마켓등 앱 업데이트 없이 기능들이 달라진다.)




대부분 어플리케이션에서는 불필요한 작업 이지만, 이러한 장점으로 때때로 유용한 경우가 있다.





클래스 로딩 및 메소드 호출



DexClassLoader cl = new DexClassLoader(dexPath, 
                                         dexOutputDir,
                                         null,
                                         getClassLoader());
  Class libProviderClazz = null;
  try {
   
     libProviderClazz =
          cl.loadClass("com.example.dex");
   
      LibraryInterface lib = (LibraryInterface) libProviderClazz.newInstance();  //라이브러리 인터페이스 클래스
      lib.myMethod(this, "Hello");
  } catch (Exception e) { ... }


DexClassLoader 클래스 인스턴스를 생성후, dex파일을 로드한다. 이런 방식으로 로드된 메소드 호출을 위해서는 여러가지 방법이 있는데, 위의 방법은 클래스 인스턴스를 바로 인터페이스 캐스팅 한 후, 메소드를 호출하는 방법을 활용하였다. 



Constructor cons = cls.getConstructor(); 
obj = cons.newInstance();
Method m = cls.getMethod("myMethod", String.class); //직접 메소드 호출
m.invoke(obj, "Hello");


또 다른 방법으로는 위와 같은 Relflection API(Method, Dield, Constructure 클래스)를 이용하는 방법인데, 미리 약속한 인터페이스를 지정하지 않아도 된다는 장점이 있긴 하나, 코드가 지저분해지고 느려진다.


이 Relflection API를 통해 저번에 설명 했던 노티피케이션 Disable을 할 수 있었던 것이다.

2013/01/19 - [개발관련/Android] - StatusBar Disable





이 처럼 외부의 dex를 불러와서 클래스를 로딩 후 메소드를 호출 할 수있다. 외부저장 공간(sdcard)에서 dex파일을 불러오는 방법은 보안에 취약 하기때문에 어플리케이션의 private 파일 패스로 복사하는등 보안문제에 신경써서 사용 하기 바란다.



이 외 빌드프로세스에 대해서 좀 더 알아 보고 싶으면 아래 링크를 참조하자.

http://android-developers.blogspot.kr/2011/07/custom-class-loading-in-dalvik.html





반응형