簡體   English   中英

RoboBinding和Retrolambda的集成

[英]Integration of RoboBinding and retrolambda

我想在我的android項目中同時使用evant / gradle- retrolambdaRoboBinding / RoboBinding

將RoboBinding添加到您的項目時,可以選擇使用RoboBinding / RoboBinding-aspectj-plugin將其與AspectJ一起使用。 但是,無論何時打開它,代碼中的lambda表達式都會產生以下編譯錯誤:

Error:error at (no source information available)
/mnt/FCEE58DAEE588F30/AndroidstudioProjects/SpeechACall/app/src/main/java/com/voicesense/personality_profiling_dialer/GcmRegistrationHandler.java:1:0::0 The type java.lang.invoke.MethodHandles cannot be resolved. It is indirectly referenced from required .class files
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugAspectJ'.
> The type java.lang.invoke.MethodHandles cannot be resolved. It is indirectly referenced from required .class files

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

這是我的build.gradle文件

buildscript {
    repositories {
        mavenCentral()
        maven() {
            name 'RoboBinding AspectJPlugin Maven Repository'
            url "https://github.com/RoboBinding/RoboBinding-aspectj-plugin/raw/master/mavenRepo"
        }
    }

    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:2.4.1'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.+'
        classpath 'org.robobinding:aspectj-plugin:0.8.+'
    }
}

repositories {
    mavenCentral()
}

apply plugin: 'retrolambda'
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'org.robobinding.android-aspectj'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.voicesense.hr_dialer"
        minSdkVersion 15
        targetSdkVersion 21
    }

    signingConfigs {
        release {
            storeFile file("../../../../../../home/amitai/personality-profiling-dialer_key.keystore")
            storePassword System.getenv("KSTOREPWD")
            keyAlias "alias_name"
            keyPassword System.getenv("KEYPWD")
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-project.txt'
            signingConfig signingConfigs.release
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

retrolambda {
    jvmArgs '-noverify'
}

ext {
    //robobindingVersion = 'latest.integration'
    robobindingVersion = '0.8.9'
}


dependencies {
    compile files('libs/acra-4.5.0.jar')
    compile files('libs/ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar')
    compile 'com.google.android.gms:play-services:6.1.71'
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.android.support:support-v13:20.0.0'
    //compile 'com.netflix.rxjava:rxjava-android:0.20.7'
    compile 'io.reactivex:rxandroid:0.24.0'
    //compile 'com.googlecode.libphonenumber:geocoder:2.16'
    compile 'com.googlecode.libphonenumber:libphonenumber:7.0'
    compile ("org.robobinding:robobinding:$robobindingVersion:with-aop-and-dependencies") {
        exclude group: 'com.google.guava', module: 'guava'
    }

    aspectPath ("org.robobinding:robobinding:$robobindingVersion:with-aop-and-dependencies") {
        exclude group: 'com.google.guava', module: 'guava'
    }
    apt "org.robobinding:codegen:$robobindingVersion"

}

是一個壓縮的Android Studio項目,可用於再現(包含相關的build.gradle文件和無法編譯的lambda表達式)。

經過一番調查,我發現它與AspectJ與Java 8不兼容有關。我相信Java 8兼容性/更新AspectJ·第22期·JakeWharton / hugoJava 8不支持·第6期·uPhyca / gradle-android -aspectj-plugin有相同的問題。 有什么建議么?

我用Retrolambda制作了自己的插件支持Aspectj。 GradleAndroidAspectJPlugin

當項目使用Retrolambda時。 Retrolamda編譯后,必須使用ant iajc重新編譯類。

    project.configurations {
        aspectjTaskClasspath
        aspectsInPath
    }

    project.repositories {
        mavenCentral()
    }

    def aspectjVersion = '1.8.5';
    project.dependencies {
        //AspectJ
        aspectjTaskClasspath "org.aspectj:aspectjtools:$aspectjVersion"
        compile "org.aspectj:aspectjrt:$aspectjVersion"
    }

    project.afterEvaluate {
        project.android.applicationVariants.all { variant ->

            def buildTypeName = variant.name.capitalize()
            def hasRetrolambda = project.plugins.hasPlugin('me.tatarka.retrolambda')

            def copyDir = new File("${project.buildDir.absolutePath}/copyClasses")
            if (copyDir.exists()) {
                copyDir.deleteDir()
            }
            copyDir.mkdirs()

            def copyClassTask = project.task("copy${buildTypeName}Classes", type: Copy) {
                from variant.javaCompile.destinationDir
                into copyDir
                doLast {
                    variant.javaCompile.destinationDir.deleteDir()
                    variant.javaCompile.destinationDir.mkdirs()
                }
            }

            def aspectsInPaths = [];
            def aspectsInPathsAbsolute = [];
            def aopTask = project.task("compile${buildTypeName}AspectJ") {
                doFirst {
                    project.configurations.aspectsInPath.each {
                        aspectsInPaths.add(it);
                        aspectsInPathsAbsolute.add(it.absolutePath);
                    }
                }

                doLast {
                    ant.taskdef(
                            resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties",
                            classpath: project.configurations.aspectjTaskClasspath.asPath
                    )
                    ant.iajc(
                            source: project.android.compileOptions.sourceCompatibility,
                            target: project.android.compileOptions.targetCompatibility,
                            fork: "true",
                            destDir: variant.javaCompile.destinationDir,
                            bootClasspath: project.android.bootClasspath.join(File.pathSeparator),
                            inpathDirCopyFilter: "java/**/*.class"
                    ) {
                        classpath {
                            variant.javaCompile.classpath.each {
                                if (!aspectsInPathsAbsolute.contains(it)) {
                                    pathElement(location: it)
                                }
                            }
                        }
                        inpath {
                            pathElement(location: copyDir)
                            aspectsInPaths.each {
                                if (!it.name.startsWith("aspectjrt")) {
                                    pathElement(location: it)
                                }
                            }
                        }
                    }
                }
            }
            aopTask.dependsOn(copyClassTask);

            def filterPreDexTask = project.task("filter${buildTypeName}PreDex") {
                doLast {
                    def finalPreDexJars = []
                    project.tasks["preDex${buildTypeName}"].inputFiles.each {
                        if (it.name.startsWith("aspectjrt") ||
                                !aspectsInPathsAbsolute.contains(it.absolutePath)) {
                            finalPreDexJars.add(it)
                        }
                    }
                    project.tasks["preDex${buildTypeName}"].inputFiles = finalPreDexJars
                }
            }
            project.tasks["preDex${buildTypeName}"].dependsOn(filterPreDexTask)



            if (hasRetrolambda) {
                project.tasks["compileRetrolambda$buildTypeName"].finalizedBy(aopTask)
            } else {
                project.tasks["compile${buildTypeName}Java"].finalizedBy(aopTask)
            }

        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM