2015-01-15 2 views
1

Я хочу использовать как evant/gradle-retrolambda, так и RoboBinding/RoboBinding в моем проекте андроида.Интеграция RoboBinding и retrolambda

При добавлении RoboBinding в ваш проект вы можете использовать его с AspectJ, используя RoboBinding/RoboBinding-aspectj-plugin. Тем не менее, всякий раз, когда я включаю его, лямбда-выражения в моем коде производить эту ошибку компиляции:

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" 

} 

И here является Молнии проект Android-студия, которая может использоваться для воспроизведения (содержит соответствующий файл build.gradle и выражение лямбда, которое не удается скомпилировать).

После некоторого исследования я узнал, что это было связано с AspectJ не совместима с Java 8. Я считаю Java 8 Compatiblity/Update AspectJ · Issue #22 · JakeWharton/hugo и Java 8 not supported · Issue #6 · uPhyca/gradle-android-aspectj-plugin имеют один и тот же вопрос. Какие-либо предложения?

+0

Я знаю, что сейчас самое время, но вы нашли какое-нибудь решение? –

+0

На самом деле я больше не использую RoboBinding .. Так что нет .. –

ответ

0

Я сделал свой собственный плагин поддерживает aspectj с retrolambda. GradleAndroidAspectJPlugin

Когда проект использует retrolambda. Вы должны перекомпилировать классы, используя ant iajc после компиляции retrolamda.

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) 
      } 

     } 
    } 
Смежные вопросы