2015-02-16 4 views
6

Ich arbeite in einem Android-Projekt, in dem ich Dagger für die Abhängigkeitsinjektion verwende. Ich weiß nicht so viel über Gradle, aber soweit ich weiß, werden die Dolch-Anmerkungen vom Compiler verarbeitet, sobald das Projekt fertiggestellt ist. Es ist kein Problem, es zu konfigurieren, wie das Benutzerhandbuch sagt. Nun, jetzt möchte ich auch AspectJ integrieren, also schaue ich mir one of the plugins for Android an.Ist es möglich, Dagger und AspectJ in ein Android Studio-Projekt zu integrieren?

Es scheint jedoch, dass dieses Plugin einen Build-Post-Processing-Job erstellt, um auch die Aspekte zu lesen, die in Konflikt mit dem stehen, was der Dagger-Compiler tut. Das ist meine aktuelle build.gradle-Datei (ein Testprojekt gebaut haben ein SSCCE):

apply plugin: 'com.android.application' 

buildscript { 
    repositories { 
     mavenLocal() 
     mavenCentral() 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.0.0' 
     classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.9' 
    } 
} 

apply plugin: 'android-aspectj' 

android { 
    compileSdkVersion 20 
    buildToolsVersion "20" 

    defaultConfig { 
     minSdkVersion 12 
     targetSdkVersion 20 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:support-v4:20.+' 
    compile 'com.android.support:appcompat-v7:20.+' 
    compile 'com.squareup.dagger:dagger:1.2.2' 
    provided 'com.squareup.dagger:dagger-compiler:1.2.2' 
} 

Und die Aspect verwendet:

@Aspect 
public class HelloAspect { 
    @Around("execution(void com.mycompany.test.MainActivity.test())") 
    public void around(ProceedingJoinPoint pj) throws Throwable { 
     Log.d("Prueba","Hello, @Aspect"); 
    } 
} 

Und das ist die Ausnahme ausgelöst wird:

java.lang.RuntimeException: 
Problem processing attributes in C:\Users\user1\workspaces\android\Test\app\build\intermediates\classes\debug\tesicnor\com\test\aspects\HelloAspect.class 
at org.aspectj.weaver.bcel.BcelObjectType.ensureAspectJAttributesUnpacked(BcelObjectType.java:387) 
at org.aspectj.weaver.bcel.BcelObjectType.<init>(BcelObjectType.java:162) 
at org.aspectj.weaver.bcel.BcelWorld.buildBcelDelegate(BcelWorld.java:410) 
at org.aspectj.weaver.bcel.BcelWorld.addSourceObjectType(BcelWorld.java:490) 
at org.aspectj.weaver.bcel.BcelWorld.addSourceObjectType(BcelWorld.java:456) 
at org.aspectj.weaver.bcel.BcelWeaver.addClassFile(BcelWeaver.java:453) 
at org.aspectj.weaver.bcel.BcelWeaver.addClassFile(BcelWeaver.java:477) 
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.initBcelWorld(AjBuildManager.java:904) 
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:249) 
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:185) 
at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:112) 
at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60) 
at org.aspectj.tools.ajc.Main.run(Main.java:371) 
at org.aspectj.tools.ajc.Main$run.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120) 
at com.uphyca.gradle.android.AspectjCompile.compile(AspectjCompile.groovy:63) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63) 
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218) 
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211) 
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200) 
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579) 
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562) 
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) 
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) 
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) 
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) 
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) 
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) 
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) 
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) 
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) 
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 
at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:305) 
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) 
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) 
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) 
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23) 
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88) 
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29) 
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 
at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) 
at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68) 
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) 
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55) 
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149) 
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106) 
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86) 
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80) 
at org.gradle.tooling.internal.provider.BuildModelAction.run(BuildModelAction.java:43) 
at org.gradle.tooling.internal.provider.BuildModelAction.run(BuildModelAction.java:30) 
at org.gradle.tooling.internal.provider.ConfiguringBuildAction.run(ConfiguringBuildAction.java:119) 
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36) 
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26) 
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:47) 
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:35) 
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:24) 
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
at org.gradle.launcher.daemon.server.exec.StartStopIfBuildAndStop.execute(StartStopIfBuildAndStop.java:33) 
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:71) 
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:69) 
at org.gradle.util.Swapper.swap(Swapper.java:38) 
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:69) 
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60) 
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:70) 
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34) 
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
at org.gradle.launcher.daemon.server.exec.DaemonHygieneAction.execute(DaemonHygieneAction.java:39) 
at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119) 
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:46) 
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246) 
at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 

Error:java.lang.RuntimeException: bad WeaverState.Kind: -115. File was :<Unknown>::0 
at org.aspectj.weaver.WeaverStateInfo.read(WeaverStateInfo.java:170) 
at org.aspectj.weaver.AjAttribute.read(AjAttribute.java:105) 
at org.aspectj.weaver.bcel.Utility.readAjAttributes(Utility.java:101) 
at org.aspectj.weaver.bcel.BcelObjectType.ensureAspectJAttributesUnpacked(BcelObjectType.java:383) 

Es scheint, dass AspectJ HelloAspect 's Attribute nicht weben kann. Tatsächlich sieht es so aus, als ob die Datei selbst nicht gefunden werden kann (File was :<Unknown>::0). Also ... Kann AspectJ zusammen mit Dolch verwendet werden? Ich habe keine Probleme, wenn ich sie getrennt benutze.

Mein Testprojekt in einem zip file

Verwandte:

+0

Bitte, versuchen Sie [mein aspectj Gradle Plugin] (https://github.com/Archinamon/GradleAspectJ-Android) unterstützt es auch Dagger und Android Annotations/ButterKnife (die APT verwendet). Also ich denke, es wird Ihre Probleme lösen. Btw, meiner Meinung nach brauchst du kein Runtime Weben, es reicht, aj-poincuts nach daggers Compiler zu kompilieren. Dieser Fall ist auch in meinem Plugin in Ordnung. :) Wir freuen uns auf jede Rückmeldung! – Archinamon

+0

Danke für den Beitrag @Archinamon! –

Antwort

7

Es sieht aus, dass Sie Laufzeit Weben verwenden möchten, aber ich weiß Dalvik nicht unterstützt diese , also sollten Sie Ihr Gradle-Skript ändern, um AspectJ zum Kompilieren zu bekommen. Hier finden Sie zwei Lösungen:

+0

Ich habe nach der Tatsache gesucht, dass Dalvik das Runtime Weben nicht unterstützt und scheint [du hast recht] (https://deansserver.co.uk/~dean/tag/aspectj/). Für die Links meldet mir der erste einen Fehler bei der Erstellung von Graples, während der zweite mehr oder weniger funktioniert (ich habe mir das schon mal angesehen), aber es benutzt das 'apply plugin: 'com.android. Bibliothek ', so dass es eine Bibliothek statt einer Anwendung erstellt, die ich starten kann und die Aspekte funktionieren ordnungsgemäß, aber ich bekomme eine Warnung in Android Studio. +1 für Sie, aber ich möchte mein Projekt als Android-Anwendung behalten. –

+0

ehrlich gesagt, ich habe nicht tief in diesen Beschreibungen gegraben, Entschuldigung dafür – harcos

1

Ich habe diese Arbeit bekam aber trotzdem ein „Hack“ in diesem Stadium in Betracht gezogen werden, da Sie nicht einfach die „run“ Taste drücken, können eine weaved- installieren Dolch-injizierte App. Hier ist, was ich gefunden habe, während ich versuche, meine Spring-ähnliche @Transactional Datenbank Transaktionserstellungspunkt-Schnitte wiederherzustellen.

Befolgen Sie den Rat von diesem SO response und fügen Sie in dem Handbuch AspectJ-Teile build.gradle Ihrer Anwendung hinzu. Versuch, das Projekt auszuführen, mein Projekt kompiliert und installiert, aber dann mit dem Dredgen fehlgeschlagen;

„Bitte stellen Sie sicher Codegenerierung ist auf diesem Modul ausgeführt wurde“

... Fehler, den Dolch erzeugt.Verdächtig, dass es das Weben war, das den /gen Ordner löschte, der durch Dolch verursacht wurde, bevor ich den .class Bytecode änderte, den ich die Linie auskommentierte;

Plugin anwenden: 'Android-aspectj'

... und die Anwendung wieder lief jeder Code ändert, ohne zu machen. Zu meiner Überraschung wurden die gewebten Klassen, die beim ersten Versuch generiert wurden, beibehalten und dann die Anweisungen des Dolch-Moduls hinzugefügt! Dies hatte den Effekt, dass der generierte AspectJ-Code beibehalten wurde und die Anweisungen des Dagger-Moduls überlagert wurden! Erfolg? Irgendwie ... gibt es eindeutig einen Konflikt (wahrscheinlich um das Aufräumen des "Gen" -Ordners), den ich als nächstes überwinden werde. Aber, und es ist ein wichtiger, aber, ich betreibe eine App mit AspectJ AOP-Code, der Dolch für DI verwendet ... Fortschritt ...

Verwandte Themen