Прежде всего , давайте взглянем на важные концепции, затем сосредоточимся на проблеме и предоставляемых решениях. Я попытался собрать важные и низкоуровневые документы, чтобы найти и объяснить вашу проблему.
Как показывает Logcat, есть много предупреждений о dex2oat tool. Имейте в виду, что dex2oat не является компилятором, это инструмент, который используется ART.И также ART не является компилятором, это комбинация нескольких компиляторов.
ART использует опережающую (AOT) компиляцию, и начиная с Android 7.0 (Nougat или N), он использует гибридную комбинацию AOT, JIT-компиляции и Profile-управляемая компиляция.
Как упоминалось выше, она была запущена в Android 7.0
Давайте углубимся в подробности
Во время установки, ART компилирует приложения, используя инструмент dex2oat на устройстве
Приведенная выше цитата объясняет на устройстве dex2oat tool.it означает, что на устройстве нет инструмента dex2oat, это не будет аблe, чтобы использовать инструмент dex2oat. Как я уже объяснял, dex2oat - это инструмент ART, который был запущен на Android 7. В результате Первое решение (плохо) - использование устройства, которое не включено в инструмент dex2oat (версия
это еще не конец, поэтому сделайте перерыв и выпейте чашку кофе
Второе , Следующее решение должно погрузиться в ART.посмотрите ниже код, который написан c ++
void VerificationResults::ProcessVerifiedMethod(verifier::MethodVerifier* method_verifier) {
DCHECK(method_verifier != nullptr);
MethodReference ref = method_verifier->GetMethodReference();
bool compile = IsCandidateForCompilation(ref, method_verifier->GetAccessFlags());
const VerifiedMethod* verified_method = VerifiedMethod::Create(method_verifier, compile);
if (verified_method == nullptr) {
// We'll punt this later.
return;
}
WriterMutexLock mu(Thread::Current(), verified_methods_lock_);
auto it = verified_methods_.find(ref);
if (it != verified_methods_.end()) {
// TODO: Investigate why are we doing the work again for this method and try to avoid it.
LOG(WARNING) << "Method processed more than once: " << ref.PrettyMethod();
if (!Runtime::Current()->UseJitCompilation()) {
DCHECK_EQ(it->second->GetDevirtMap().size(), verified_method->GetDevirtMap().size());
DCHECK_EQ(it->second->GetSafeCastSet().size(), verified_method->GetSafeCastSet().size());
}
// Delete the new verified method since there was already an existing one registered. It
// is unsafe to replace the existing one since the JIT may be using it to generate a
// native GC map.
delete verified_method;
return;
}
verified_methods_.Put(ref, verified_method);
DCHECK(verified_methods_.find(ref) != verified_methods_.end());
}
Этот метод создает профилированную компиляцию (я объяснил сначала), который используется ART, и его цель
При следующем перезапуске приложения будет использоваться код, управляемый профилем, и избегать JIT-компиляции во время выполнения для уже скомпилированных методов.Методы, которые JIT-компилируются во время новых запусков, будут добавлены в профиль, который затем будет выбран демоном компиляции
, кратко : избегайте выполнения JIT-компиляции ввремя выполнения для ускорения компиляции во время выполнения.
Ваша точная проблема здесь, каждый раз, когда вы нажимаете кнопку отладки сборки, этот метод вызывается и появляются предупреждения. Вы можете спросить, почему эти предупреждения происходят, икак это исправить?
Как вы упомянули, у вас есть многомодульный проект, и у каждого модуля есть свой файл build.gradle.
Когда вызывается ART (отладка сборки), он пытается собратьмультимодульный проект профильная компиляция во время установки. Поэтому ниже приведена схема.
app.gradle
dependencies
a <= verified
b <= verified
c <= verified
module.gradle
dependencies
a <= ops ! Method processed more than once
b <= ops ! Method processed more than once
d <= verified
module2.gradle
dependencies
a <= ops ! Method processed more than once
x <= verified
v <= verified
Наконец , мы нашли, в чем наша проблема.мы должны перепроектировать наши файлы Gradle.
Заключение , Эта проблема возникает примерно на 98% из плохо организованных файлов Gradle, либо app.gradle, либо модуля Gradle. Чтобы избежать этих предупреждений, вам следуетиметь глобальные файлы Gradle вместо нескольких независимых файлов Gradle.
Ссылки
Android Runtime (ART) и Dalvik
Формат исполняемого файла Dalvik
Настройка ART