From d7c10c237bf2631630fac7982c3f374b1a27ed01 Mon Sep 17 00:00:00 2001 From: Alex Light Date: Thu, 31 Mar 2016 10:03:07 -0700 Subject: Fix issued with non-public interface methods. Some APK's ship with dex files containing non-public interface methods. These would cause crashes on newer versions of ART due to stricter verification of dex files. Make ART emit a warning but allow this behavior. Bug: 27928832 Change-Id: Ia3689ee091aa154fb5954b1f6dd50c489128acce --- runtime/class_linker.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'runtime/class_linker.cc') diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 706059369c..f4880e017c 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -5874,9 +5874,14 @@ ClassLinker::DefaultMethodSearchResult ClassLinker::FindDefaultMethodImplementat !target_name_comparator.HasSameNameAndSignature( current_method->GetInterfaceMethodIfProxy(image_pointer_size_))) { continue; + } else if (!current_method->IsPublic()) { + // The verifier should have caught the non-public method for dex version 37. Just warn and + // skip it since this is from before default-methods so we don't really need to care that it + // has code. + LOG(WARNING) << "Interface method " << PrettyMethod(current_method) << " is not public! " + << "This will be a fatal error in subsequent versions of android. " + << "Continuing anyway."; } - // The verifier should have caught the non-public method. - DCHECK(current_method->IsPublic()) << "Interface method is not public!"; if (UNLIKELY(chosen_iface.Get() != nullptr)) { // We have multiple default impls of the same method. This is a potential default conflict. // We need to check if this possibly conflicting method is either a superclass of the chosen -- cgit v1.2.3-59-g8ed1b