안드로이드 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