dex2oat dex를 oat로 변환하는 실행 경로 개관
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로 전환하는 실행 경로 개관입니다. 구체적인 세부 사항은 언급하지 않았습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.