私のプロジェクトでは、人気のあるライブラリretrolambdaを使用しています。新しいAndroid Studio 3.0 Canary1をダウンロードしました。
新しいバージョンのGradleなどを使用するようにプロジェクトを更新しました。すべて問題ありません。
Android Studio 3の新機能は一部のJava8機能のサポートに組み込まれています。新しいAS3は、レトロラムダを削除してこれらの機能を使用することを提案しています。
レトロラムダを削除しました。Gradleビルドは成功しましたが、アプリがこのエラーでクラッシュします(ラムダがある場所で)
E/UncaughtException: Java.lang.NoSuchMethodError: No static method lambda$replace$2
プロジェクトでRxJava2を使用しています。これが関連しているかどうかはわかりませんが、私の場合、Java8の組み込み機能が機能していないようです。たぶん私は「どこかに」何かを設定する必要がありますか?
MyGradleファイル
ルートプロジェクト
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'
これはおそらく、Gradleのバグが原因ですJava 8言語機能の脱糖が追跡されています https://issuetracker.google.com/issues/62456849
desugar
は、名前がlambda$
(所有者のクラス名を追加)で始まる場合、クラスファイル内の合成メソッドの名前をやみくもに変更しているようです関係なくそのメソッドへの参照がすでにあるかどうかバイトコードに存在します(そしてその参照しない名前も変更されます)。
コードパスが実行時にそのような参照にヒットすると、その名前のメソッドはもう存在しないため、明らかな結果はNoSuchMethodError
になります。