Why should I know this?

Android 파헤치기 - ClassLoader 본문

Knowledge/Android

Android 파헤치기 - ClassLoader

die4taoam 2019. 2. 18. 21:29



Android 파헤치기


0. 시작하기 전에...
'Android 파헤치기'에서 다루고자 하는 것은 Android라는 오픈소스를 구성하는 Stack 중에 가상머신(현재는 Runtime으로 대체되었다) 자체이다. 그러므로 응용 개발이나 프레임워크 개발을 하시는 분들에게 유용한 정보가 많지 않을 수도 있다.


1. 다양한 Class Load path
전 글에서 언급했듯이, Class는 Android 가상머신의 핵심 중에 핵심이며 Class가 로드, 링킹되는 과정만 이해해도 사실상 안드로이드의 대부분은 이해했다고 해도 무리가 아니다. 그만큼 Class를 로드하는 일은 매우 높은 빈도로 다양한 곳에서 많이 발생한다.



이처럼 Class를 로드하는 Path가 다양한 이유는 다음과 같다.

-. System Class와 Framework 포함 사용자 Class가 구분된다.

-. 사용자 정의 형태로 Class를 Load 할 수 있는 인터페이스가 제공된다.

-. Class를 로드하는 과정에서 의존성 있는 다른 Class를 Linking하기 위한 로드가 이뤄진다.



2. Android 가상머신 Dalvik의 Class Load

기본적으로 Class를 로드하는 주체는 늘 Interpreter이다. Java에서 제공하는 다양한 클래스 로드 메소드를 사용하여 클래스를 로드하는 것과 유사한 형태로 Interpreter는 현재 실행 중인 method에서 다른 Class를 참조하려고 할 때 Class를 Resolve하기 위한 요청을 시스템에 보내게 된다.




요청이라고 표현했지만 이는 다음 실행을 위해 순차적으로 이뤄지므로 사실상 함수 호출이나 다름없다. 기존 ClassLoader인 BaseDexClassLoader 안에는 loadClass라는 메소드를 재정의해 사용할 수 있도록 정의해놨다. 그리고 이 함수는 Native의 Interpreter가 요청한 흐름에 의해 호출되게 된다.


소스코드를 정적 분석하면 Native부에서 클래스로더(기본은 BaseDexClassLoader)의 loadClass 메소드를 dvmCallMethod를 통해 native에서 호출한다.


1361    /*
1362     * Invoke loadClass().  This will probably result in a couple of
1363     * exceptions being thrown, because the ClassLoader.loadClass()
1364     * implementation eventually calls VMClassLoader.loadClass to see if
1365     * the bootstrap class loader can find it before doing its own load.
1366     */
1367    LOGVV("--- Invoking loadClass(%s, %p)", dotName, loader);
1368    {
1369        const Method* loadClass =
1370            loader->clazz->vtable[gDvm.voffJavaLangClassLoader_loadClass];
1371        JValue result;
1372        dvmCallMethod(self, loadClass, loader, &result, nameObj);
1373        clazz = (ClassObject*) result.l;
1374
1375        dvmMethodTraceClassPrepEnd();
1376        Object* excep = dvmGetException(self);

대충 이런식이다.


시작하기 전에...
'Android 파헤치기'에서 다루고자 하는 것은 Android라는 오픈소스를 구성하는 Stack 중에 가상머신(현재는 Runtime으로 대체되었다) 자체이다. 그러므로 응용 개발이나 프레임워크 개발을 하시는 분들에게 유용한 정보가 많지 않을 수도 있다.


출처: https://die4taoam.tistory.com/42 [Why should I know this?]


Comments