Coder Social home page Coder Social logo

hujiangtechnology / gradle_plugin_android_aspectjx Goto Github PK

View Code? Open in Web Editor NEW
3.9K 98.0 563.0 16.6 MB

A Android gradle plugin that effects AspectJ on Android project and can hook methods in Kotlin, aar and jar file.

License: Apache License 2.0

Groovy 100.00%

gradle_plugin_android_aspectjx's Introduction

AspectJX

一个基于AspectJ并在此基础上扩展出来可应用于Android开发平台的AOP框架,可作用于java源码,class文件及jar包,同时支持kotlin的应用。

最近更新

v2.0.10 (2020-03-31)

  • Supports android gradle plugin 3.6.1
  • Upgrade inner aspectjrt version to 1.9.5

查看更多版本信息

AspectJX 2.0.0版本与旧版本之间编译性能对比数据

下面的数据来自于同一个项目不同环境下的编译情况 由于旧版本不支持Instant Run增量编译,故没有这块数据

gradle version android plugin version full build(2.0.0/1.1.1 ms) instant run(2.0.0/1.1.1 ms) 性能提升
2.14.1 2.2.0 9761/13213 2596/- +35%
3.3 2.3.0 8133/15306 890/- +88%
4.1 3.0.1 6681/15306 713/- 129%
4.4 3.1.4

如何使用

AspectJX是基于 gradle android插件1.5及以上版本设计使用的,如果你还在用1.3或者更低版本,请把版本升上去。

本使用说明是基于重构后的2.0.0版本编写的,如需要查阅旧版本的README,请切换到对应的Tag。

  • 插件引用

在项目根目录的build.gradle里依赖AspectJX

 dependencies {
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8'
        }

或者使用product目录下的jar包,在你的项目根目录下新建目录plugins,把product/gradle-android-plugin-aspectjx-2.0.0.jar拷贝到plugins,依赖jar包

dependencies {
        classpath fileTree(dir:'plugins', include:['*.jar'])
        }

注意:

  1. 区别于旧版本,离线新版本不再需要依赖org.aspectj:aspectjtools:1.8.+
  2. compile 'org.aspectj:aspectjrt:1.8.+' 必须添加到包含有AspectJ代码的module. 可以参考Demo
  • 在app项目的build.gradle里应用插件
apply plugin: 'android-aspectjx'
//或者这样也可以
apply plugin: 'com.hujiang.android-aspectjx'
  • AspectJX配置

AspectJX默认会处理所有的二进制代码文件和库,为了提升编译效率及规避部分第三方库出现的编译兼容性问题,AspectJX提供include,exclude命令来过滤需要处理的文件及排除某些文件(包括class文件及jar文件)。

注意:2.0.0版本之后旧版本的includeJarFilterexcludeJarFilter命令废弃,不再支持使用

2.0.0版本的 include,exclude通过package路径匹配class文件及jar文件,不再支持通过jar物理文件路径匹配的方式,比如:

支持

aspectjx {
//排除所有package路径中包含`android.support`的class文件及库(jar文件)
	exclude 'android.support'
}

不支持

aspectjx {
	excludeJarFilter 'universal-image-loader'
}

//或者
aspectjx {
	exclude 'universal-image-loader'
}

支持***匹配

aspectjx {
//忽略所有的class文件及jar文件,相当于AspectJX不生效
	exclude '*'
}

提供enabled 开关

enabled默认为true,即默认AspectJX生效

aspectjx {
//关闭AspectJX功能
	enabled false
}

常见问题

  • 问:AspectJX是否支持*.aj文件的编译?

答: 不支持。目前AspectJX仅支持annotation的方式,具体可以参考支持kotlin代码织入的AspectJ Demo

  • 问:编译时会出现can't determine superclass of missing type**及其他编译错误怎么办

答:大部分情况下把出现问题相关的class文件或者库(jar文件)过滤掉就可以搞定了

感谢

  • 开发AspectJX的初衷
  1. 目前的开源库中还没有发现可应用于Android平台的比较好的AOP框架或者工具,虽然xposeddexposed非常强大,但基于严重的碎片化现状,兼容问题永远是一座无法逾越的大山。
  2. 目前其他的AspectJ相关插件和框架都不支持AAR或者JAR切入的,对于目前在Android圈很火爆的Kotlin更加无能为力。
  • 感谢
  1. 该项目的设计参考了大神JakeWhartonHugo项目及uPhycagradle-android-aspectj-plugin项目的设计**,并在它们的基础上扩展支持AAR, JAR及Kotlin的应用。在此感谢JakeWharton和uPhyca.
  2. 感谢热心的AspectJX粉丝及其他使用者的积极反馈,你们提供的PR以及在Issues里提出的问题和答复给大家解决了很多问题,你们都为AspectJX贡献了力量

参考

License

Copyright 2018 firefly1126, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.gradle_plugin_android_aspectjx

gradle_plugin_android_aspectjx's People

Contributors

aifeii avatar fioneragh avatar firefly1126 avatar franticn avatar landerlyoung avatar muja555 avatar saantiaguilera avatar seker avatar xuyisheng avatar zzz40500 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gradle_plugin_android_aspectjx's Issues

Android Studio 3.0 + Gradle 4.1-rc-1 = "no aspectjrt dependencies in classpath, do nothing"

Following the upgrade to Android Studio 3.0, ABT 3.0.0-beta2 with Gradle 4.1-rc-1 no weaving is occurring and the logs state;

:app:transformClassesWithAspectTransformForWithGoogleDebug
there is no aspectjrt dependencies in classpath, do nothing
directoryInput = 77e0d0e28e0bed23d54a35ca22a685be0ff20e71
jarInput = org.jacoco:org.jacoco.agent:0.7.4.201502262128
jarInput = org.aspectj:aspectjrt:1.8.9

My configuration was working as expected with Gradle 3.4 and ABT 2.3.3.

Specifically the errors emanate from;

 static final ASPECTJRT = "aspectjrt"
 ...
 def hasAjRt = false
        for (TransformInput transformInput : inputs) {
            for (JarInput jarInput : transformInput.jarInputs) {
                if (jarInput.file.absolutePath.contains(ASPECTJRT)) {
                    hasAjRt = true
                    break
                }
            }
            if (hasAjRt) break
        }
 }

Rest assured, the rest of the configuration is to standard;

build.gradle

buildscript {    
    dependencies {
        classpath "com.android.tools.build:gradle:3.0.0-beta2"
        classpath "org.aspectj:aspectjtools:1.8.9"
        ...
    }
}

module.gradle

dependencies {
  api "org.aspectj:aspectjrt:1.8.9"
}

apply plugin: 'android-aspectjx' 编译问题

在编译过程中
image
出现了以上问题。
苦逼的回滚代码和多次编译尝试后发现是build.gradle中apply plugin: 'android-aspectjx'和 该jar包发生冲突。
这个jar包混淆编译输出时未配置-dontusemixedcaseclassnames 导致同个包名下生成了ABCD和abcd类。
导致以上问题。
但是奇怪的是
aspectjx { excludeJarFilter '.jar' }
我已经添加上述选项,应该已经排除掉所有jar包了的。
为何还会抱截图问题呢,咨询下up主。

为什么Hook的类不能混淆呢?

如题,如果我想hook应用内所有try catch语句中的 catch代码块,那不是整个应用都无法混淆了么;另外,我理解这种方案其实就是在编译期将advice注入到代码中,和字节码注入有点类似,只要是在混淆之前注入的,按理说应该混淆了页没关系啊

Invalid byte tag in constant pool: 43

Android Studio 3,Java 8,报了这样的错,而且貌似和hugo不兼容
org.aspectj.apache.bcel.classfile.ClassFormatException: File: '/Users/dzc/Desktop/Luoo_Android/app/build/intermediates/transforms/AspectTransform/developer/debug/folders/1/1f/aspect/net/luoo/LuooFM/activity/common/RecommendationCommentsActivity$2.class': Invalid byte tag in constant pool: 43 at org.aspectj.apache.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:192) at org.aspectj.apache.bcel.classfile.ClassParser.parse(ClassParser.java:131) at org.aspectj.weaver.bcel.Utility.makeJavaClass(Utility.java:472) at org.aspectj.weaver.bcel.BcelWeaver.processReweavableStateIfPresent(BcelWeaver.java:1392) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1098) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:514) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterCompiling(AjPipeliningCompilerAdapter.java:375) at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.aj:78) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:471) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1036) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:272) 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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:192) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) at com.hujiang.gradle.plugin.android.aspectjx.AspectWork.doWork(AspectWork.groovy:89) at com.hujiang.gradle.plugin.android.aspectjx.AspectWork$doWork$0.call(Unknown Source) at com.hujiang.gradle.plugin.android.aspectjx.AspectTransform.doAspectTransform(AspectTransform.groovy:174) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210) at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174) at com.hujiang.gradle.plugin.android.aspectjx.AspectTransform.transform(AspectTransform.groovy:100) at com.android.build.api.transform.Transform.transform(Transform.java:290) at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:185) at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:181) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102) at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:176) at sun.reflect.GeneratedMethodAccessor1445.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:163) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.execute(ExecuteActionsTaskExecuter.java:115) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.execute(ExecuteActionsTaskExecuter.java:109) at org.gradle.internal.Transformers$4.transform(Transformers.java:169) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:109) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:90) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:68) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88) at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228) at org.gradle.internal.Transformers$4.transform(Transformers.java:169) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)

Can not build using Java 8 and the Jack toolchain

While using the aspectjx plugin, when I set the compile options to Java 8 and enable the jack toolchain,
` android {
compileSdkVersion 24
buildToolsVersion "24.0.1"

defaultConfig {
    jackOptions {
        enabled true
    }
}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

}
`

the build fails with the error:

Error:Cannot cast object 'task ':app:transformJackWithJackForDebug'' with class 'com.android.build.gradle.internal.pipeline.TransformTask_Decorated' to class 'org.gradle.api.tasks.compile.JavaCompile'

Using:

  • Android Studio 2.2
  • Gradle 2.14.1
  • Gradle Plugin 2.2

引入Ant打包的jar后编译报错

Error:Execution failed for task ':app:transformClassesWithAspectTransformForDebug'.

Cannot read debug info for @aspect to handle formal binding in pointcuts (please compile with 'javac -g' or '<javac debug='true'.../>' in Ant)

我写了一个带@aspect的jar包加入工程中,如果是用IDE Export的jar包,就可以正常编译且aspect生效。现在我想用Ant给部分代码混淆,重新生成jar以后,编译时就出现了以上这个错误。

针对android studio里,provided方式引入的第三方库,编译出错,应该怎么处理

Error:Execution failed for task ':app:transformClassesWithAspectTransformForDebug'.

can't determine modifiers of missing type com.yjl.test.external
when weaving type com.qihoo.apmsdkdemo.MainActivity
when weaving classes
when weaving
when batch building BuildConfig[null] #Files=2 AopXmls=#0
[Xlint:cantFindType]

错误如上所示
missing的类( com.yjl.test.external)是在jar包里,但是这个jar包是provided的方式引入的,如果不做aop是可以编译通过的,但是加上aop之后,就无法编译通过,不知道这个如何处理
我用provided方式引入jar的的场景是想调用系统不公开的api,比如PackageParser

can't determine superclass of missing type xxx

`Error:Execution failed for task ':app:transformClassesWithAspectTransformForDevDebug'.

can't determine superclass of missing type android.hardware.fingerprint.FingerprintManager$AuthenticationCallback
when weaving type android.support.v4.hardware.fingerprint.FingerprintManagerCompatApi23$1
when weaving classes
when weaving
when batch building BuildConfig[null] #Files=0 AopXmls=#0
[Xlint:cantFindType]`

我的目录结构最开始为:
---app
---aspjx1
其中app中也有切面编程的东西,此时打包是正常的

我就想把app中的切面编程移除来,变成:
---app
---aspjx1
---aspjx2
然后就报上述错误了

support weave code in build-cache

If you enable build-cache, then exploded jar will store in directory like

/Users/2dxgujun/.android/build-cache/a38fde34e54ce5d6da3f0f6f50d29f612279957f/output/jars/classes.jar

How to locate file?

AOP定义防止连续点击,编译报错无法运行

代码:
@aspect
public class SingleClickAspect {
static int TIME_TAG = 10000;
public static final int MIN_CLICK_DELAY_TIME = 600;

@Around("execution(* android.view.View.OnClickListener.onClick(..))")
public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
    View view = null;
    for (Object arg : joinPoint.getArgs())
        if (arg instanceof View) view = (View) arg;
    if (view != null) {
        Object tag = view.getTag(TIME_TAG);
        long lastClickTime = ((tag != null) ? (long) tag : 0);
        KLog.debug("SingleClickAspect", "lastClickTime:" + lastClickTime);
        long currentTime = Calendar.getInstance().getTimeInMillis();
        if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {//过滤连续点击
            view.setTag(TIME_TAG, currentTime);
            KLog.debug("SingleClickAspect", "currentTime:" + currentTime);
            joinPoint.proceed();
        }
    }
}

}
报错信息:
Error:Execution failed for task ':app:transformClassesWithDexForAppDebug'.

com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Return code 1 for dex process
Error:1 error; aborting
Error:Uncaught translation error: com.android.dx.cf.code.SimException: local variable type mismatch: attempt to set or access a value of type java.lang.Object using a local variable of type int. This is symptomatic of .class transformation tools that ignore local variable information.
删除around定义的代码块后即可正常运行,clean和rebuild也试过,均无用。求助,谢谢

com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.5 拉不下来

如题,因为aspectjx插件是放在jcenter**库,如果出现插件拉不下来的情况,可以将jcenter的地址改为http协议拉取,这样可以拉取成功,如:

buildScript {
    repositories {
        jcenter() {
            url 'http://jcenter.bintray.com/'
        }
    }
}

实在不行可以通过依赖本地jar的方式来达到目的。

与其他 Transform 插件一起使用存在问题

1. aspectjx 依赖 JarInput 的路径来作过滤

当 aspectjx 不是第一个被应用时,JarInput 的路径(举个例子:excludeJar:::/Users/.../.../app/build/intermediates/transforms/.../alpha/jars/1/10/e57ebac67c347bc2985e94932aa28dc58f848c3c.jar)无法作为判断条件,可能导致 aspectjx 找不到需要处理的文件

2. aspectjx 插件把多个输入的 Jar 和 Dir 合并成了一个

导致其他插件的可能无法正常执行 Transform JavaDoc

It is best practice to write into as many outputs as Jar/Folder Inputs have been received by the transform. Combining all the inputs into a single output prevents downstream transform from processing limited scopes.

Related Issue

插入aspectjx配置

您好,我想插入aspetcjx的时候,不插桩任何第三方包,下面这个配置需要在哪里面配置呢
aspectjx {
excludeJarFilter '.jar'
}

Could not get this feature:is_support_double_system, value is null

05-07 14:59:31.935 16135-16135/com.example.lenovo.androidaop W/FeatureConfig: Could not get this feature:is_support_double_system, value is null
java.lang.Throwable
at com.yulong.android.feature.FeatureConfig.getIntValue(FeatureConfig.java:470)
at com.yulong.android.server.systeminterface.SystemInterfaceImpl.isSupportDoubleOS(SystemInterfaceImpl.java:5295)
at com.yulong.android.server.systeminterface.SystemInterfaceImpl.(SystemInterfaceImpl.java:5678)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at com.yulong.android.reflect.YLReflect.Load_class(YLReflect.java:59)
at com.yulong.android.reflect.YLReflect.(YLReflect.java:40)
at android.app.ContextImpl$49.createService(ContextImpl.java:683)
at android.app.ContextImpl$ServiceFetcher.getService(ContextImpl.java:281)
at android.app.ContextImpl.getSystemService(ContextImpl.java:1760)
at android.media.AudioManager.(AudioManager.java:454)
at android.app.ContextImpl$7.createService(ContextImpl.java:368)
at android.app.ContextImpl$ServiceFetcher.getService(ContextImpl.java:281)
at android.app.ContextImpl.getSystemService(ContextImpl.java:1760)
at android.view.ContextThemeWrapper.getSystemService(ContextThemeWrapper.java:117)
at android.app.Activity.getSystemService(Activity.java:4590)
at android.view.ViewRootImpl.getAudioManager(ViewRootImpl.java:5570)
at android.view.ViewRootImpl.playSoundEffect(ViewRootImpl.java:5658)
at android.view.View.playSoundEffect(View.java:17276)
at android.view.View.performClick(View.java:4462)
at android.view.View$PerformClick.run(View.java:18772)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5367)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:663)
at dalvik.system.NativeStart.main(Native Method)

Build error with a android project with 2 flavours

Hi, I am trying to use aspects on an android project but build failed with the exception

Execution failed for task ':app:transformClassesWithExtractJarsForInternalDebug'.
Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithExtractJarsForInternalDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
...
Caused by: java.lang.RuntimeException: error
at com.android.build.gradle.internal.pipeline.IntermediateFolderUtils.parseScopeLevelFolders(IntermediateFolderUtils.java:444)
at com.android.build.gradle.internal.pipeline.IntermediateFolderUtils.parseTypeLevelFolders(IntermediateFolderUtils.java:411)
at com.android.build.gradle.internal.pipeline.IntermediateFolderUtils.computeNonIncrementalInputFromFolder(IntermediateFolderUtils.java:116)
at com.android.build.gradle.internal.pipeline.IntermediateStream.asNonIncrementalInput(IntermediateStream.java:132)
at com.android.build.gradle.internal.pipeline.TransformTask.computeNonIncTransformInput(TransformTask.java:246)

What I did to use aspectJX

  • add an android library ("aspectjx") to the android studio project - to hold JoinPoint(s)
  • add dependencies to this library: appCompat and 'org.aspectj:aspectjrt:1.8.9'
  • add to settings.gradle: include ':app', ':aspectjx'
  • add to project gradle:
    resolutionStrategy { cacheChangingModulesFor 0, 'seconds' }
    dependencies {... classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.9'}
  • add to app grade:
    apply plugin: 'android-aspectjx'
    aspectjx { includeJarFilter 'android.context' excludeJarFilter '.jar' }
    dependencies {
    ...
    compile 'org.aspectj:aspectjtools:1.8.9'
    compile project ':aspectjx'
    }

My objective is to add a join point in android.context.Context.

Note: my app has 2 "flavors" (public and internal), hence the "transform...InternalDebug", and no join point has been defined yet.

Did I miss something ?
Thanks

可以对三方库的一些方法hook吗?

比如我想在vollry request类的add方法前做一些事情
代码如下:
@before("call(* com.android.volley.RequestQueue.add(..))")
public void onGetVolleyHttpBefore(JoinPoint joinPoint) throws Throwable{
Log.v(TAG,"volley lib send request");
Object[] objects=joinPoint.getArgs();
Request request=(Request)objects[0];
Log.v(TAG,"volley lib request method="+request.getMethod());
String url=request.getUrl();
Log.v(TAG,"volley lib request url="+url);
}
不生效,为什么?求大神

org.aspectj.apache.bcel.classfile.ClassFormatException Invalid byte tag in constant pool: 17

环境是studio 3.0,项目中使用了retrolambda,所以Java升级到了1.8,错误如下:
Caused by: org.aspectj.apache.bcel.classfile.ClassFormatException: File: '/path/to/package/WebViewActivity.class': Invalid byte tag in constant pool: 17 at org.aspectj.apache.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:192) at org.aspectj.apache.bcel.classfile.ClassParser.parse(ClassParser.java:131) at org.aspectj.weaver.bcel.Utility.makeJavaClass(Utility.java:472) at org.aspectj.weaver.bcel.BcelWeaver.processReweavableStateIfPresent(BcelWeaver.java:1392) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1098) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:514) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterCompiling(AjPipeliningCompilerAdapter.java:375) at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.aj:78) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:471) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1036) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:272) 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 com.hujiang.gradle.plugin.android.aspectjx.AspectWork.doWork(AspectWork.groovy:89) ... 46 more

Is the 'new' plugin in Maven repo?

Hi,

When i tried to import the 'deprecated' plugin as stated on this page: http://blog.egorand.me/going-aspect-oriented-with-aspectj-and-google-analytics/ it worked:

buildscript {  
    ...
    dependencies {
        ...
        classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.14'
    }
}

However if I try to use the new one like you mention in 'How to use' section:

dependencies {
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.5'
        }

gradle fails to find it. Looks like it's not there?

Can it be effectively used in a library project?

I want to create a common error handler for a library class by means of your plugin. Is it possible at all? Can I do it without too much affecting client code, I mean if I do so, will client code be able to use instant run and other features?

ASM error

this is some of my app gradle file:

buildscript {
repositories {
jcenter()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.aspectj:aspectjtools:1.8.10'
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.11'
}
}
apply plugin: 'com.android.application'
apply plugin: 'android-aspectjx'

However, I get the following error, why?

org.aspectj.weaver.BCException: Unable to find Asm for stackmap generation (Looking for 'aj.org.objectweb.asm.ClassReader'). Stackmap generation for woven code is required to avoid verify errors on a Java 1.7 or higher runtime

多渠道release打包出现`NoSuchMethodError`的问题

1.0.5版本在多渠道打包,或者多build type打包,并且加混淆(特别是使用了dexguard混淆)的情况下,打出的渠道包运行会出现NoSuchMethodError

现在1.0.6版本已经解决了这个问题。出现这个问题的伙伴可以升级到1.0.6版本使用。

com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.6

support the gradle android plugin 2.2

java.lang.NoClassDefFoundError: com/android/builder/signing/SignedJarBuilder$IZipEntryFilter
at com.hujiang.gradle.plugin.android.aspectjx.AspectTransform.transform(AspectTransform.groovy:147)

这个类在plugin 2.2中已经不再提供了

没有注入成功

No static method aspectOf()Lcom/gd/ge/aop/FragmentAspectj; 这个好像是没有注入成功,要怎么解决啊

comple error Android studio 3.0 beta2 + gradle 4.1-rc-1

`

  • What went wrong:
    Execution failed for task ':AspectApp:transformClassesWithDexBuilderForDebug'.

Unexpected scopes found in folder '/home/fenggang/Desktop/AndridTips/AspectApp/build/intermediates/transforms/AspectTransform/debug'. Required: PROJECT, SUB_PROJECTS, EXTERNAL_LIBRARIES. Found: EXTERNAL_LIBRARIES, PROJECT, PROJECT_LOCAL_DEPS, SUB_PROJECTS, SUB_PROJECTS_LOCAL_DEPS

`

运行时间太慢了

因为你们现在使用的方式,是在lib里面不处理aspectj,在主工程处理,这样会导致会扫描所有包,虽然能用includeJar的方式,但是acpectj花费的时间还是要1分钟
你看这样可不可以,只在对应工程处理自己内部的aspectj,这样如果是aar或者maven依赖的话,就不用在扫描里面的了
还有你可以看看这个http://www.jianshu.com/p/814315922353,看看有没有可以吸取的**,提高编译速度

照readme配置上。不起作用。

root gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.2'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

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

lib gradle:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'

    compile 'org.aspectj:aspectjrt:1.8.1'
}

app gradle

apply plugin: 'com.android.application'
apply plugin: 'android-aspectjx'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.mysmalldemo.myaopsample"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile project(':aoplib')
    compile 'org.aspectj:aspectjrt:1.8.1'
}

java.lang.RuntimeException: Unexpected scopes found in folder

Under android studio 3.0 & gradle 4.1 milestone, I encountered the compile error:

Caused by: java.lang.RuntimeException: Unexpected scopes found in folder '/app/build/intermediates/transforms/AspectTransform/debug'. Required: PROJECT, SUB_PROJECTS, EXTERNAL_LIBRARIES. Found: EXTERNAL_LIBRARIES, PROJECT, PROJECT_LOCAL_DEPS, SUB_PROJECTS, SUB_PROJECTS_LOCAL_DEPS at com.android.build.gradle.internal.pipeline.IntermediateFolderUtils.makeRestrictedCopies(IntermediateFolderUtils.java:455) at com.android.build.gradle.internal.pipeline.IntermediateFolderUtils.<init>(IntermediateFolderUtils.java:66) at com.android.build.gradle.internal.pipeline.IntermediateStream.init(IntermediateStream.java:191) at com.android.build.gradle.internal.pipeline.IntermediateStream.asNonIncrementalInput(IntermediateStream.java:146) at com.android.build.gradle.internal.pipeline.TransformTask.computeNonIncTransformInput(TransformTask.java:281) at com.android.build.gradle.internal.pipeline.TransformTask.access$500(TransformTask.java:70) at com.android.build.gradle.internal.pipeline.TransformTask$1.call(TransformTask.java:196) at com.android.build.gradle.internal.pipeline.TransformTask$1.call(TransformTask.java:157) at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102) at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:152) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:168) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)

I checked the build output dir, and there is a exactly a AspectTransform directory. maybe gradle considers it invalid?

I'm also working with hugo, and knows that our plugin works the same as hugo in the AspectJ part, so i made a compartion of source code between them.

the Hugo plugin is as follows:
JavaCompile javaCompile = variant.javaCompile javaCompile.doLast { String[] args = [ "-showWeaveInfo", "-1.5", "-inpath", javaCompile.destinationDir.toString(), "-aspectpath", javaCompile.classpath.asPath, "-d", javaCompile.destinationDir.toString(), "-classpath", javaCompile.classpath.asPath, "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator) ] log.debug "ajc args: " + Arrays.toString(args) ......
and our plugin:
`def args = [
"-showWeaveInfo",
"-encoding", encoding,
"-source", sourceCompatibility,
"-target", targetCompatibility,
"-d", destinationDir,
"-classpath", classPath.join(File.pathSeparator),
"-bootclasspath", bootClassPath
]

    if (!getInPath().isEmpty()) {
        args << '-inpath'
        args << getInPath().join(File.pathSeparator)
    }
    if (!getAspectPath().isEmpty()) {
        args << '-aspectpath'
        args << getAspectPath().join(File.pathSeparator)
    }`

i doubt that the output dir differs, which caused gradle report this exception.

Error:Execution failed for task ':aweme:transformClassesWithAspectTransformForDebug'. > ABORT

ABORT
org.aspectj.weaver.BCException: Whilst processing type 'Lcom/squareup/haha/guava/collect/Iterables$2;' - cannot cast the outer type to a reference type. Signature=Lcom/squareup/haha/guava/collect/Iterables; toString()=com.squareup.haha.guava.collect.Iterables class=Iterables
when processing type mungers
when weaving
when batch building BuildConfig[null] #Files=0 AopXmls=#0

Databind error

Error:Execution failed for task ':aspectjx-demo:transformClassesWithAspectTransformForDebug'.

can't determine superclass of missing type android.support.v7.widget.CardView
when weaving type android.databinding.adapters.CardViewBindingAdapter
when weaving classes
when weaving
when batch building BuildConfig[null] #Files=0 AopXmls=#0
[Xlint:cantFindType]

Getting classpath error: unable to find org.aspectj.lang.JoinPoint when running instrumentation tests

Getting this error message when running instrumentation tests (androidTest) both in my project and in AspectJX-Demo project:

Execution failed for task ':app:transformClassesWithAspectTransformForDebugAndroidTest'.
> classpath error: unable to find org.aspectj.lang.JoinPoint (check that aspectjrt.jar is in your classpath)

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithAspectTransformForDebugAndroidTest'.

Error:Execution failed for task ':app:transformClassesWithAspectTransformForFullDebug'.

Error:Execution failed for task ':app:transformClassesWithAspectTransformForFullDebug'.

trouble in:
public class com.eg.odk.client.utils.NameValuePairComparator extends java.lang.Object implements java.util.Comparator:
public void ():
ALOAD_0 // Lcom/eg/odk/client/utils/NameValuePairComparator; this (line 14)
INVOKESPECIAL java.lang.Object. ()V
constructor-execution(void com.eg.odk.client.utils.NameValuePairComparator.())
| RETURN
constructor-execution(void com.eg.odk.client.utils.NameValuePairComparator.())
end public void ()
public int compare(org.apache.http.NameValuePair, org.apache.http.NameValuePair):
ALOAD_1 // Lorg/apache/http/NameValuePair; lhs (line 17)
INVOKEINTERFACE org.apache.http.NameValuePair.getName ()Ljava/lang/String;
ALOAD_2 // Lorg/apache/http/NameValuePair; rhs
INVOKEINTERFACE org.apache.http.NameValuePair.getName ()Ljava/lang/String;
INVOKEVIRTUAL java.lang.String.compareTo (Ljava/lang/String;)I
IRETURN
end public int compare(org.apache.http.NameValuePair, org.apache.http.NameValuePair)
public volatile int compare(Object, Object):
ALOAD_0 // Lcom/eg/odk/client/utils/NameValuePairComparator; this (line 14)
ALOAD_1 // Ljava/lang/Object; x0
CHECKCAST org.apache.http.NameValuePair
ALOAD_2 // Ljava/lang/Object; x1
CHECKCAST org.apache.http.NameValuePair
INVOKEVIRTUAL com.eg.odk.client.utils.NameValuePairComparator.compare (Lorg/apache/http/NameValuePair;Lorg/apache/http/NameValuePair;)I
IRETURN
end public volatile int compare(Object, Object)
end public class com.eg.odk.client.utils.NameValuePairComparator

com.eg.odk 是引用的第三方包

遇到过@Aspect不起作用

@aspect注解过的类,反编译后正常情况下会有以下代码,现在没有了,报找不到AdviceProcessor.aspectOf()错误,不知道什么原因会造成该现象。

private static Throwable ajc$initFailureCause;
public static final AdviceProcessor ajc$perSingletonInstance;

static
{
try
{
ajc$postClinit();
return;
}
catch (Throwable localThrowable)
{
ajc$initFailureCause = localThrowable;
}
}

private static void ajc$postClinit()
{
ajc$perSingletonInstance = new AdviceProcessor();
}

public static AdviceProcessor aspectOf()
{
if (ajc$perSingletonInstance == null)
throw new NoAspectBoundException("com.qiangqu.shandiangou.apptrace.annotation.AdviceProcessor", ajc$initFailureCause);
return ajc$perSingletonInstance;
}

public static boolean hasAspect()
{
return ajc$perSingletonInstance != null;
}

Not working with Gradle plugin 2.2 and Gradle 2.14.1

Caused by: java.lang.NoClassDefFoundError: com/android/builder/signing/SignedJarBuilder$IZipEntryFilter
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at com.hujiang.gradle.plugin.android.aspectjx.AspectTransform.transform(AspectTransform.groovy:147)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at com.android.build.api.transform.Transform.transform(Transform.java:290)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:178)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:174)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:156)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:173)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:158)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:129)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:118)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
16:11:06.173 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   ... 68 more

transformClassesWithExtractJarsForDebug

Error:Execution failed for task ':app:transformClassesWithExtractJarsForDebug'.

error
新建project,只修改了两个build.gradle,clean不报错,运行时提示这个
环境:
AS 2.2.3
compileSdkVersion 25
buildToolsVersion "25.0.2"
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.8'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.