evant / gradle-retrolambda

A gradle plugin for getting java lambda support in java 6, 7 and android
Apache License 2.0
5.3k stars 449 forks source link

android library can't use Lambda #217

Closed lengyue524 closed 7 years ago

lengyue524 commented 7 years ago

My project have app and library. Code in app can use Lambda. library can write code in Lambda but when I run the app it crash with follow errow.

looks like Lambda did generate class.

how to fix it?

java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
                                                                            at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:114)
                                                                            at android.os.Handler.handleCallback(Handler.java:743)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                            at android.os.Looper.loop(Looper.java:150)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5546)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
                                                                         Caused by: java.lang.NoSuchMethodError: No virtual method com_lengyue_mi_MiSettingActivity$1$$Lambda$4_lambda$onClick$0(Lorg/apache/commons/lang3/tuple/MutablePair;)V in class Lcom/lengyue/mi/MiSettingActivity$1; or its super classes (declaration of 'com.lengyue.mi.MiSettingActivity$1' appears in /data/app/com.lengyue.mobilerush-1/base.apk)
                                                                            at com.lengyue.mi.MiSettingActivity$1$$Lambda$4.call(Unknown Source)
                                                                            at rx.internal.util.ActionSubscriber.onNext(ActionSubscriber.java:39)
                                                                            at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:139)
                                                                            at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:227)
                                                                            at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
                                                                            at android.os.Handler.handleCallback(Handler.java:743) 
                                                                            at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                            at android.os.Looper.loop(Looper.java:150) 
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5546) 
                                                                            at java.lang.reflect.Method.invoke(Native Method) 
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 

project build.gradle:

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
        classpath 'me.tatarka:gradle-retrolambda:3.3.1'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()
        maven { url "https://jitpack.io" }
    }
    project.ext {
        compileSdk = 25
        buildTool = "25.0.0"
        minSdk = 21
        targetSdk = 23
        vCode = 1
        vName = "1.0"
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

apply plugin: 'me.tatarka.retrolambda'

task clean(type: Delete) {
    delete rootProject.buildDir
}

app build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion project.ext.compileSdk
    buildToolsVersion project.ext.buildTool

    defaultConfig {
        applicationId "com.lengyue.mobilerush"
        minSdkVersion project.ext.minSdk
        targetSdkVersion project.ext.targetSdk
        versionCode project.ext.vCode
        versionName project.ext.vName
        jackOptions {
            enabled true
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility project.ext.sourceCompatibility
        targetCompatibility project.ext.targetCompatibility
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':mi')
}

library build.gradle:

apply plugin: 'com.android.library'
apply plugin: 'me.tatarka.retrolambda'

android {
    compileSdkVersion project.ext.compileSdk
    buildToolsVersion project.ext.buildTool

    defaultConfig {
        minSdkVersion project.ext.minSdk
        targetSdkVersion project.ext.targetSdk
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility project.ext.sourceCompatibility
        targetCompatibility project.ext.targetCompatibility
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.0.0'
    compile project(':core')
}
lengyue524 commented 7 years ago

I change retrolambda to 3.2.5 the error changed:

Process: com.lengyue.mobilerush, PID: 25492
                                                   java.lang.IncompatibleClassChangeError: The method 'void com.lengyue.mi.MiSettingActivity.com_lengyue_mi_MiSettingActivity_lambda$setlistener$2(android.view.View)' was expected to be of type direct but instead was found to be of type virtual (declaration of 'com.lengyue.mi.MiSettingActivity' appears in /data/app/com.lengyue.mobilerush-1/base.apk)
                                                       at com.lengyue.mi.MiSettingActivity.access$lambda$0(MiSettingActivity.java)
                                                       at com.lengyue.mi.MiSettingActivity$$Lambda$1.onClick(Unknown Source)
                                                       at android.view.View.performClick(View.java:5264)
                                                       at android.view.View$PerformClick.run(View.java:21297)
                                                       at android.os.Handler.handleCallback(Handler.java:743)
                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                       at android.os.Looper.loop(Looper.java:150)
                                                       at android.app.ActivityThread.main(ActivityThread.java:5546)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
Archinamon commented 7 years ago

You should apply retrolambda plugin directly in your library's build.gradle file. Otherwise it won't work.

lengyue524 commented 7 years ago

@Archinamon I have apply the plugin in my library's build.gradle

levaja commented 7 years ago

@lengyue524 Would you share how did you resolve this issue? Thanks!