안드로이드 소스 코드 분석 -Dalvik 가상 머신 생성 과정

더 완전한 프로젝트 다운로드합니다. 계속합니다. 소스. 그래픽 지식 이후 업로드 GitHub의.
당신은 클릭 할 수 있습니다 내에서  내가 얻을 링크

I. 서론 달빅

 1.java 작업이 JVM, 안드로이드 자바 언어에 사용 된 동일, VM을 요구해야합니다. 휴대 전화의 프로세서와 메모리 등의 하드웨어 자원의 부족과 VM의 출시를 들어, DVM라는 안드로이드를 실행하기위한 환경을 제공합니다.

 2.Dalvik 가상 머신의 여러 인스턴스를 할 수 있습니다. 사실 안드로이드에서 당 응용 프로그램은 자신의 VM 인스턴스 (샌드 박스)에서 실행됩니다. 리눅스의 각 VM 인스턴스는 동일한 개념으로 간주 될 수 있으며, 별도의 프로세스입니다. 자신의 과정에서 DVM 실행은 다른 응용 프로그램은 서로 간섭하지 않으며, 프로세스가 모든 응용 프로그램이 충돌되는 DVM의 붕괴로 이어질하지 않습니다. 이와 관련하여, 안드로이드 DVM 과정과 리눅스 프로세스, 응용 프로그램의 개념과 유사 프로세스.

3. JVM 차이는 :

  •  1. 다른 아키텍처를 기반으로. JVM은 DVM 기반 아키텍처를 등록하고, 스택 기반의 아키텍처입니다.
  • 2.jvm는 바이트 코드 파일을 실행하고 사용자가 정의한 DVM 덱스 파일 형식을 실행됩니다.
     

    JVM 컴파일 자바 -> 클래스 -> JAR의
    DVM 컴파일 자바 -> 클래스 -> 덱스

DVM와 JVM의 차이를 요약 :

차이 : DVM 음주 덱스 포맷 JVM 실행이 후, 덱스 도구 파일, 덱스 파일에 다음 리소스 파일 및 덱스 처리 된 .class 것이다 컴파일 된 파일 로이드 프로그램 이후의 .class 된 .class 파일을 생성하는 것이다 파일의 .apk 파일로 패키지. APK 안드로이드 패키지를 의미한다. JVM의 .class 파일이 실행됩니다.
둘 사이의 차이 : DVM는 JVM 실행 가상화 스택 가상 머신을 기반으로하면서 가상 머신을 기반 레지스터. 스택보다 빠른 액세스 속도를 등록 DVM 모바일 장치에 더 적합한 하드웨어, 최대 최적화를 달성한다.
세 차이 : 중복 된 정보의 .class 파일을 많이 덱스 도구 중복 정보를 제거하고 파일을 덱스하는 모든 class 파일을 통합 할 수는 있습니다. I / O 작업을 감소 검색 속도 클래스를 개선하기 위해

사진은 어떻게 주로 DVM을 이해 :
안드로이드 소스 코드 분석 -Dalvik 가상 머신 생성 과정

두 .Dalvik 부팅 프로세스

//AndroidRuntime.cpp
int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
{
    JavaVMInitArgs initArgs;
    char propBuf[PROPERTY_VALUE_MAX];
    char stackTraceFileBuf[sizeof("-Xstacktracefile:")-1 + PROPERTY_VALUE_MAX];
    char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX];
    char heapstartsizeOptsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];
    char heapsizeOptsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
    char heapgrowthlimitOptsBuf[sizeof("-XX:HeapGrowthLimit=")-1 + PROPERTY_VALUE_MAX];
    char heapminfreeOptsBuf[sizeof("-XX:HeapMinFree=")-1 + PROPERTY_VALUE_MAX];
    char heapmaxfreeOptsBuf[sizeof("-XX:HeapMaxFree=")-1 + PROPERTY_VALUE_MAX];
    char usejitOptsBuf[sizeof("-Xusejit:")-1 + PROPERTY_VALUE_MAX];
    char jitmaxsizeOptsBuf[sizeof("-Xjitmaxsize:")-1 + PROPERTY_VALUE_MAX];
    char jitinitialsizeOptsBuf[sizeof("-Xjitinitialsize:")-1 + PROPERTY_VALUE_MAX];
    char jitthresholdOptsBuf[sizeof("-Xjitthreshold:")-1 + PROPERTY_VALUE_MAX];
    char useJitProfilesOptsBuf[sizeof("-Xjitsaveprofilinginfo:")-1 + PROPERTY_VALUE_MAX];
    char jitprithreadweightOptBuf[sizeof("-Xjitprithreadweight:")-1 + PROPERTY_VALUE_MAX];
    char jittransitionweightOptBuf[sizeof("-Xjittransitionweight:")-1 + PROPERTY_VALUE_MAX];
    char gctypeOptsBuf[sizeof("-Xgc:")-1 + PROPERTY_VALUE_MAX];
    char backgroundgcOptsBuf[sizeof("-XX:BackgroundGC=")-1 + PROPERTY_VALUE_MAX];
    char heaptargetutilizationOptsBuf[sizeof("-XX:HeapTargetUtilization=")-1 + PROPERTY_VALUE_MAX];
    char cachePruneBuf[sizeof("-Xzygote-max-boot-retry=")-1 + PROPERTY_VALUE_MAX];
    char dex2oatXmsImageFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];
    char dex2oatXmxImageFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
    char dex2oatXmsFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];
    char dex2oatXmxFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
    char dex2oatCompilerFilterBuf[sizeof("--compiler-filter=")-1 + PROPERTY_VALUE_MAX];
    char dex2oatImageCompilerFilterBuf[sizeof("--compiler-filter=")-1 + PROPERTY_VALUE_MAX];
    char dex2oatThreadsBuf[sizeof("-j")-1 + PROPERTY_VALUE_MAX];
    char dex2oatThreadsImageBuf[sizeof("-j")-1 + PROPERTY_VALUE_MAX];
    char dex2oat_isa_variant_key[PROPERTY_KEY_MAX];
    char dex2oat_isa_variant[sizeof("--instruction-set-variant=") -1 + PROPERTY_VALUE_MAX];
    char dex2oat_isa_features_key[PROPERTY_KEY_MAX];
    char dex2oat_isa_features[sizeof("--instruction-set-features=") -1 + PROPERTY_VALUE_MAX];
    char dex2oatFlagsBuf[PROPERTY_VALUE_MAX];
    char dex2oatImageFlagsBuf[PROPERTY_VALUE_MAX];
    char extraOptsBuf[PROPERTY_VALUE_MAX];
    char voldDecryptBuf[PROPERTY_VALUE_MAX];
    ...

    /*
     * Initialize the VM.
     *
     * The JavaVM* is essentially per-process, and the JNIEnv* is per-thread.
     * If this call succeeds, the VM is ready, and we can start issuing
     * JNI calls.
     */
    if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {
        ALOGE("JNI_CreateJavaVM failed\n");
        return -1;
    }

    return 0;
}

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{

    /* start the virtual machine */
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    onVmCreated(env);

    /*
     * Register android functions.
     */
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }

}

     //Dalvik虚拟机在Zygote进程中的启动过程,这个启动过程主要就是完成了以下四个事情:
        //1. 创建了一个Dalvik虚拟机实例;
        //2. 加载了Java核心类及其JNI方法;
        //3. 为主线程的设置了一个JNI环境;
        //4. 注册了Android核心类的JNI方法。

접합자 효과가 시작 달빅 :

    1. 접합자 과정은 당신이하는 최대 속도, 이동 새로 만든 안드로이드 응용 프로그램 프로세스에 자신의 달빅 가상 머신 인스턴스를 복사 할 수 있습니다 안드로이드 응용 프로그램의 프로세스를 생성 접합자 과정 후 달빅 가상 머신 인스턴스, 안드로이드 시스템의 좋은 준비가 안드로이드 응용 프로그램 시작 프로세스.
  • 2.Java 코어 클래스와 안드로이드의 핵심 클래스 (덱스 파일에 위치)뿐만 아니라, JNI의 자신의 방법은 안드로이드 응용 프로그램 프로세스의 생성, 메모리 매핑 따라서, 읽을 수있는 방법입니다, Zygote의 프로세스를 (파일 있도록 위치) 때, 새로 생성 과정 안드로이드 응용 프로그램을 복사 할 달빅 가상 머신의 자체 인스턴스뿐만 아니라, 그들은 또한 그래서, 핵심 안드로이드 자바 코어 클래스와 클래스, 그 방법과 안드로이드 JNI 새로 만든 응용 프로그램 프로세스를 공유 할 수 있습니다 그것은 메모리 소비를 절약 할 수 있습니다.

  • 이 자바 핵심 클래스의 많은로드, 안드로이드 핵심 클래스 JNI 방법의 큰 번호를 등록해야하기 때문에 시작 프로세스 3.Zygote 안드로이드 응용 프로그램 처리 속도를 높이기 위해, 그들은 그들의 시작 속도를 희생. 자바 코어 클래스를로드뿐만 아니라 그들이 확인하고 최적화 할 필요가있을 때 달빅 가상 머신, 이들은 일반적으로 시간이 많이 소요됩니다. Zygote의 프로세스는 init 프로세스에 의해 시작되어 있기 때문에, 그 과정은 부팅 Zygote의 부팅 시간은, 그래서 희생 Zygote의 과정이 상대적으로 크다. 그러나 결국, 우리가 전화를 재생, 거의가 거의 따라서 속도 Zygote의 과정이 안드로이드 응용 프로그램의 빠른 실행에 대한 대가로, 가치가 희생 시작, 설정되지 않은 종료하지 않습니다.

    더 완전한 프로젝트 다운로드합니다. 계속합니다. 소스. 그래픽 지식 이후 업로드 GitHub의.
    당신은 클릭 할 수 있습니다 내에서  내가 얻을 링크

추천

출처blog.51cto.com/14541311/2444231