web-dev-qa-db-ja.com

RetrolambdaをAndroid Studio 3.0 Java 8つの組み込み機能に置き換える

私のプロジェクトでは、人気のあるライブラリretrolambdaを使用しています。新しいAndroid Studio 3.0 Canary1をダウンロードしました。

新しいバージョンのGradleなどを使用するようにプロジェクトを更新しました。すべて問題ありません。

Android Studio 3の新機能は一部のJava8機能のサポートに組み込まれています。新しいAS3は、レトロラムダを削除してこれらの機能を使用することを提案しています。

Retrolambda warning

レトロラムダを削除しました。Gradleビルドは成功しましたが、アプリがこのエラーでクラッシュします(ラムダがある場所で)

E/UncaughtException: Java.lang.NoSuchMethodError: No static method lambda$replace$2

プロジェクトでRxJava2を使用しています。これが関連しているかどうかはわかりませんが、私の場合、Java8の組み込み機能が機能していないようです。たぶん私は「どこかに」何かを設定する必要がありますか?

私のプロジェクト設定 enter image description here

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'
15
adek

これはおそらく、Gradleのバグが原因ですJava 8言語機能の脱糖が追跡されています https://issuetracker.google.com/issues/62456849

desugarは、名前がlambda$(所有者のクラス名を追加)で始まる場合、クラスファイル内の合成メソッドの名前をやみくもに変更しているようです関係なくそのメソッドへの参照がすでにあるかどうかバイトコードに存在します(そしてその参照しない名前も変更されます)。

コードパスが実行時にそのような参照にヒットすると、その名前のメソッドはもう存在しないため、明らかな結果はNoSuchMethodErrorになります。

4
Stefan Zobel