Java.lang.NoSuchMethodError: Нет виртуального метода keySet ()

Недавно я обновил свой Android-проект для Android Studio 3. Я хотел бы поддерживать функции языка Java 8, поэтому добавил build.gradle:

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } 

Затем я запускаю свое приложение на устройстве Android 8.0.0. Во время выполнения я вижу

 java.lang.NoSuchMethodError: No virtual method keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView; in class Ljava/util/concurrent/ConcurrentHashMap; or its super classes (declaration of 'java.util.concurrent.ConcurrentHashMap' appears in /system/framework/core-oj.jar) 

Я понимаю, что это связано с тем, что подпись keySet() была изменена в Java 8 от возврата Set<K> к возврату KeySetView<K,V> .

Строка, вызвавшая это исключение, выглядит следующим образом:

 for (Long id : mSomeMap.keySet()) 

KeySetView реализует Set , это, безусловно, Iterable , поэтому, если эта строка интерпретируется как Java 7 или Java 8, я бы подумал, что это будет работать в любом случае. Мое понимание основ Java является отрывочным – что здесь происходит?

Обновить

До сих пор мое ясное понимание таково:

Хотя Android теперь поддерживает некоторые функции языка Java 8, его API не идентичен Java 8. В частности, реализация ConcurrentHashMap.keySet() Android возвращает Set , в то время как реализация ConcurrentHashMap.keySet() Java 8 возвращает KeySetView .

Так или иначе, Android Studio удалось скомпилировать мое приложение со стандартным Java 8 JDK, и поэтому во время выполнения ожидается найти метод с сигнатурой KeySetView<K,V> keySet() . Однако Android ConcurrentHashMap не имеет метода с этой подписью, поэтому я получаю NoSuchMethodError .

Я не ближе к разработке того, как и почему Android Studio строится с несовместимым JDK. В структуре проекта проверяется «Использовать встроенный JDK (рекомендуется)», поэтому я предполагаю, что Android Studio работает с JDK, входящим в комплект поставки.

Вы используете специальную реализацию ConcurrentHashMap

В /system/framework/core-oj.jar появляется декларация «java.util.concurrent.ConcurrentHashMap»

keySet() не имеет метода keySet()