Замените Retrolambda на Android Studio 3.0 Java 8 встроенными функциями
В моем проекте я использую популярную библиотеку retrolambda.
Я только что загрузил новую версию Android Studio 3.0 Canary 1.
Я обновил свой проект, чтобы использовать новую версию Gradle и т.д. И все в порядке.
Что нового в Android Studio 3 встроено в поддержку некоторых функций Java8.
Новый AS3 предлагает удалить retrolambda и использовать эти функции.
![Предупреждение Retrolambda]()
Я удалил retrolambda, Gradle сборка была успешной, но приложение терпит крах с этой ошибкой (в месте, где есть лямбда)
E/UncaughtException: java.lang.NoSuchMethodError: No static method lambda$replace$2
Я использую RxJava2 в своем проекте. Я не уверен, что это связано с этим, но похоже, что в моем случае встроенные функции для Java8 не работают. Может быть, мне нужно что-то установить где-нибудь?
Настройки моего проекта ![введите описание изображения здесь]()
Мои Gradle файлы
Корневой проект
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-alpha1'
classpath 'com.google.gms:google-services:3.0.0'
//classpath 'me.tatarka:gradle-retrolambda:3.6.1'
}
Модуль приложения
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
repositories {
mavenCentral()
maven { url "https://jitpack.io" }
}
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'
...
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.firebase:firebase-analytics:9.8.+'
compile 'com.google.firebase:firebase-crash:9.8.+'
compile 'com.google.android.gms:play-services-maps:9.8.+'
compile 'com.google.android.gms:play-services-analytics:9.8.+'
compile 'com.google.android.gms:play-services-auth:9.8.+'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
//Support Library
(...)
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.google.maps.android:android-maps-utils:0.4'
/* RXJAVA2 */
compile 'io.reactivex.rxjava2:rxjava:2.0.6'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'com.github.VictorAlbertos:ReactiveCache:1.1.0-2.x'
compile 'com.github.VictorAlbertos.Jolyglot:gson:0.0.3'
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
defaultConfig {
applicationId "my_app_id"
minSdkVersion 15
targetSdkVersion 25
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
(...)
dexOptions {
javaMaxHeapSize "4g"
}
lintOptions {
abortOnError false
}
}
buildTypes {
debug {
minifyEnabled false
shrinkResources false
}
debugpro {
minifyEnabled true
shrinkResources false
proguardFile file('proguard-project.txt')
proguardFile file('proguard-google-api-client.txt')
//noinspection GroovyAssignabilityCheck
signingConfig signingConfigs.debug
}
release {
minifyEnabled true
shrinkResources false
proguardFile file('proguard-project.txt')
proguardFile file('proguard-google-api-client.txt')
}
releaseci {
minifyEnabled true
shrinkResources false
proguardFile file('proguard-project.txt')
proguardFile file('proguard-google-api-client.txt')
//noinspection GroovyAssignabilityCheck
signingConfig signingConfigs.releaseci
}
(...)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.jakewharton.butterknife'
Ответы
Ответ 1
Вероятно, это связано с ошибкой в дескрипторе языка Gradle Java 8, который отслеживается в https://issuetracker.google.com/issues/62456849
desugar
, похоже, слепо переименовывает синтетические методы в файл класса, если их имя начинается с lambda$
(добавление имени класса владельца) независимо от того, существует ли ссылка на этот метод уже в байт-код (и эта ссылка не позволяет переименовать).
Когда путь кода попадает в такую ссылку во время выполнения, очевидным результатом является NoSuchMethodError
, потому что метод с этим именем больше не существует.