dex2oat dex를 oat로 변환하는 실행 경로 개관

4807 단어 AndroidArt 연구
dex2oat는 실행 가능한 파일로 원본에서 파일art\dex2oat\Dex2oat를 컴파일합니다.cc생성.
dex2oat의 실행 입구는 다음과 같습니다.
int main(int argc, char** argv) {
  return art::dex2oat(argc, argv);
}

함수 dex2oat에서 dex2oat->CreateOatFile 함수를 호출하고,CreateOatFile 함수에서driver->CompileAll(class loader,dex files,timings)을 실행했습니다.문장, 이 문장은dex 파일을 oat 파일로 컴파일합니다.
void CompilerDriver::CompileAll(jobject class_loader,
                                const std::vector& dex_files,
                                base::TimingLogger& timings) {
  DCHECK(!Runtime::Current()->IsStarted());
  UniquePtr thread_pool(new ThreadPool(thread_count_ - 1));
  PreCompile(class_loader, dex_files, *thread_pool.get(), timings);
  Compile(class_loader, dex_files, *thread_pool.get(), timings);
  if (dump_stats_) {
    stats_->Dump();
  }
}

Compile 함수
void CompilerDriver::Compile(jobject class_loader, const std::vector& dex_files,
                       ThreadPool& thread_pool, base::TimingLogger& timings) {
  for (size_t i = 0; i != dex_files.size(); ++i) {
    const DexFile* dex_file = dex_files[i];
    CHECK(dex_file != NULL);
    CompileDexFile(class_loader, *dex_file, thread_pool, timings);
  }
}

CompileDexFile 함수
void CompilerDriver::CompileDexFile(jobject class_loader, const DexFile& dex_file,
                                    ThreadPool& thread_pool, base::TimingLogger& timings) {
  // TODO: strdup memory leak.
  timings.NewSplit(strdup(("Compile " + dex_file.GetLocation()).c_str()));
  ParallelCompilationManager context(Runtime::Current()->GetClassLinker(), class_loader, this,
                                     &dex_file, thread_pool);
  context.ForAll(0, dex_file.NumClassDefs(), CompilerDriver::CompileClass, thread_count_);
}

context.ForAll(0, dex_file.NumClassDefs(), CompilerDriver::CompileClass, thread_count_);이 문장에서 중요한 것은CompilerDriver::CompileClass,CompilerDriver::CompileClass는 리셋 함수를 대표하는데 이 리셋 함수는dex의 클래스를 컴파일합니다.
CompileClass 함수에서 CompileMethod 함수를 호출하여 하나의 방법을 컴파일하였는데, 그 중에서 클래스의 구성원 변수 jni 를 사용하였다compiler_및 compiler,두 멤버 변수는 CompilerDriver 클래스의 구조 함수에 지정됩니다.
CompilerDriver::CompilerDriver(CompilerBackend compiler_backend, InstructionSet instruction_set,
                               bool image, DescriptorSet* image_classes, size_t thread_count,
                               bool dump_stats) ... {
...
  if (compiler_backend_ == kPortable) {
    // Initialize compiler_context_
    init_compiler_context = reinterpret_cast(ArtInitCompilerContext);
    compiler_ = reinterpret_cast(ArtCompileMethod);
  } else {
    init_compiler_context = reinterpret_cast(ArtInitQuickCompilerContext);
    compiler_ = reinterpret_cast(ArtQuickCompileMethod);
  }
...
  if (compiler_backend_ == kPortable) {
    jni_compiler_ = reinterpret_cast(ArtLLVMJniCompileMethod);
  } else {
    jni_compiler_ = reinterpret_cast(ArtQuickJniCompileMethod);
  }
...
}

이 중에는 주목할 만한 몇 가지 함수가 있는데 그것이 바로ArtCompileMethod,ArtQuickCompileMethod,ArtLVMJniCompileMethod,ArtQuickJniCompileMethod이다.
ArtCompileMethod 함수의 코드를 보려면 다음과 같이 하십시오.
extern "C" art::CompiledMethod* ArtCompileMethod(art::CompilerDriver& driver,
                                                 const art::DexFile::CodeItem* code_item,
                                                 uint32_t access_flags,
                                                 art::InvokeType invoke_type,
                                                 uint16_t class_def_idx,
                                                 uint32_t method_idx,
                                                 jobject class_loader,
                                                 const art::DexFile& dex_file) {
  UNUSED(class_def_idx);  // TODO: this is used with Compiler::RequiresConstructorBarrier.
  art::ClassLinker *class_linker = art::Runtime::Current()->GetClassLinker();

  art::DexCompilationUnit dex_compilation_unit(
    NULL, class_loader, class_linker, dex_file, code_item,
    class_def_idx, method_idx, access_flags);
  art::llvm::CompilerLLVM* compiler_llvm = ContextOf(driver);
  art::CompiledMethod* result = compiler_llvm->CompileDexMethod(&dex_compilation_unit, invoke_type);
  return result;
}

위의 ArtCompileMethod 함수의 코드를 통해 클래스art:llvm::CompilerLVM의CompileDexMethod 함수를 사용하여dex의 방법을 컴파일하였습니다.
art::llvm::CompilerLLVM은 LLVM의 범주에 속합니다.이상은 dex2oat 도구가 dex를 oat로 전환하는 실행 경로 개관입니다. 구체적인 세부 사항은 언급하지 않았습니다.

좋은 웹페이지 즐겨찾기