flyjingfish / androidaop Goto Github PK
View Code? Open in Web Editor NEW🔥🔥🔥AndroidAOP 是专属于 Android 端 Aop 框架,只需一个注解就可以请求权限、切换线程、禁止多点、一次监测所有点击事件、监测生命周期等等,没有使用 AspectJ,也可以定制出属于你的 Aop 代码
License: Apache License 2.0
🔥🔥🔥AndroidAOP 是专属于 Android 端 Aop 框架,只需一个注解就可以请求权限、切换线程、禁止多点、一次监测所有点击事件、监测生命周期等等,没有使用 AspectJ,也可以定制出属于你的 Aop 代码
License: Apache License 2.0
Conversions 类通过字符串获取 Class 的方法 Class<?> getClass_(String className) 没有处理 className 为 xxx[] 的场景,比如有方法参数是 int[](也可能是多维数组 java.lang.Object[][] 等),这种场景下通过该方法获取不到参数类型,因而反射找不到方法,跑出 NoSuchMethodException。
运行示例
运行SecondActivity Scheduled时出错
FATAL EXCEPTION: main
Process: com.flyjingfish.androidaop, PID: 11763
java.lang.RuntimeException: java.lang.NoSuchMethodException: lambda$onCreate$1 [class android.view.View]
at com.flyjingfish.android_aop_annotation.AndroidAopJoinPoint.setArgs(AndroidAopJoinPoint.java:179)
at com.flyjingfish.androidaop.SecondActivity.lambda$onCreate$1$com-flyjingfish-androidaop-SecondActivity(Unknown Source:31)
at com.flyjingfish.androidaop.SecondActivity$$ExternalSyntheticLambda1.onClick(Unknown Source:2)
at android.view.View.performClick(View.java:6294)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
at android.view.View$PerformClick.run(View.java:24774)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6518)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.NoSuchMethodException: lambda$onCreate$1 [class android.view.View]
at java.lang.Class.getMethod(Class.java:2068)
at java.lang.Class.getDeclaredMethod(Class.java:2047)
at com.flyjingfish.android_aop_annotation.AndroidAopJoinPoint.setArgs(AndroidAopJoinPoint.java:173)
at com.flyjingfish.androidaop.SecondActivity.lambda$onCreate$1$com-flyjingfish-androidaop-SecondActivity(Unknown Source:31)
at com.flyjingfish.androidaop.SecondActivity$$ExternalSyntheticLambda1.onClick(Unknown Source:2)
at android.view.View.performClick(View.java:6294)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
at android.view.View$PerformClick.run(View.java:24774)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6518)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
最新的
AGP 8.0+
gradle 8.2
api 'io.github.FlyJingFish.AndroidAop:android-aop-core:1.4.2'
api 'io.github.FlyJingFish.AndroidAop:android-aop-annotation:1.4.2'
ksp 'io.github.FlyJingFish.AndroidAop:android-aop-ksp:1.4.2'
开发工具(最新稳定版)
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:8.2.2'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21'
classpath 'com.tencent.vasdolly:plugin:3.0.6'
classpath 'com.huawei.agconnect:agcp:1.9.1.300'
}
}
plugins {
id "io.github.FlyJingFish.AndroidAop.android-aop" version "1.4.8" apply false
id 'com.google.devtools.ksp' version '1.8.0-1.0.9' apply false
id 'cn.therouter.agp8' version '1.2.2' apply false
id "io.github.qq549631030.android-junk-code" version "1.3.3" apply false
}
代码为
@AndroidAopMatchClassMethod( targetClassName = "android.widget.Toast", methodName = ["show"], type = MatchType.EXTENDS ) class ToastAop : MatchClassMethod { override fun invoke(joinPoint: ProceedJoinPoint, methodName: String): Any? { Log.e( "MatchTestMatchMethod", "======" + methodName + ",getParameterTypes=" + joinPoint.getTargetMethod() .getParameterTypes().size ); return joinPoint.proceed() } }
把这里换成
@AndroidAopMatchClassMethod( targetClassName = "android.view.View.OnClickListener", methodName = ["onClick"], type = MatchType.EXTENDS )
就可以了 所以我想是不是不支持Toast。
然后我看有个AndroidAop.setOnToastListener
,试了一下,onToast方法也没有执行。
在Hook内部类时没有生效
@AndroidAopReplaceClass("android.provider.Settings$Secure")
public class SettingsSecureHook {
// invoke-static {v0, v1}, Landroid/provider/Settings$Secure;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
@AndroidAopReplaceMethod("java.lang.String getString(android.content.ContentResolver, java.lang.String)")
public static String getString(ContentResolver resolver, String name) {
Log.d("tag", "getString: " + name);
return "";
}
@AndroidAopReplaceMethod("java.lang.String getString(android.content.ContentResolver, java.lang.String, int)")
public static String getStringForUser(ContentResolver resolver, String name, int userHandle) {
Log.d("tag", "getStringForUser: " + name);
return "";
}
}
// 生成的class
@AopClass
public final class `SettingsSystemHook$$AndroidAopClass` {
@AopReplaceMethod(
targetClassName = "android.provider.Settings${'$'}System",
invokeClassName = "im.weshine.compliance.SettingsSystemHook",
)
public final fun aopConfigMethod() {
}
}
调用的代码
String androidId = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
Log.d("tag", "androidid = "+androidId);
过滤tag后只有调用的日志,没有被hook的日志。我在hook WifiInfo的getIpAddress和getMacAddress是成功的,只有hook内部类时没有成功。
@AndroidAopReplaceClass("android.net.wifi.WifiInfo")
object WifiInfoDelegate {
@AndroidAopReplaceMethod("int getIpAddress()")
@JvmStatic
fun getIpAddress(info: WifiInfo) = 0
@AndroidAopReplaceMethod("java.lang.String getMacAddress()")
@JvmStatic
fun getMacAddress(info: WifiInfo) = "02:00:00:00:00:00"
}
1.4.7
使用 AndroidAopPointCut 不生效, 自定义注解和注解处理类在 library 中, 在应用层的方法上标注 @clickEvent(), 最终 ClickAop 类的 invoke 方法没有回调
@AndroidAopPointCut(ClickAop::class)
@target(AnnotationTarget.FUNCTION)
@retention(AnnotationRetention.RUNTIME)
annotation class ClickEvent(val clickName: String, val clickInfo: String)
class ClickAop: BasePointCut {
override fun invoke(joinPoint: ProceedJoinPoint, anno: ClickEvent): Any? {
ClickTrack.trackClickEvent(anno.clickName)
return joinPoint.proceed()
}
}
无
1.4.7
升级版本时候出现错误,回退使用1.6.2可以使用
plugins {
id 'com.android.application' version '8.2.1' apply false
id 'com.android.library' version '8.2.1' apply false
id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
id "io.github.FlyJingFish.AndroidAop.android-aop" version "1.6.8"
id 'com.google.devtools.ksp' version '1.8.0-1.0.9' apply false
}
app中的依赖:
//aop begin
implementation 'io.github.FlyJingFish.AndroidAop:android-aop-core:1.6.8'
implementation 'io.github.FlyJingFish.AndroidAop:android-aop-annotation:1.6.8'
ksp 'io.github.FlyJingFish.AndroidAop:android-aop-ksp:1.6.8'
//aop end
CONFIGURE FAILED in 428ms
1.6.8 当前最新
三方库:
public class LocaleTransform {
public static Locale getLanguage(int language) {
}
}
如果我要修改三方库的 " java.util.Locale getLanguage(int) " 方法, 需要怎么操作? 修改后自己的逻辑代码写在哪儿?
我没看懂文档的描述.
描述一下大概怎么回事
duplicate entry: module-info.class,通常情况下你需要先重启Android Studio,然后clean一下项目即可,如果还有问题请到Github联系作者
配置完成一直是这个错误,我全部清理过,还是提示这个
你的代码
已经按照首页配置配置成功
java为17版本
错误日志
Merge jar error entry:[META-INF/versions/9/module-info.class], error message:java.lang.NullPointerException: Parameter specified as non-null is null: method com.flyjingfish.android_aop_plugin.beans.ClassSuperInfo., parameter superName
Merge jar error entry:[META-INF/versions/9/module-info.class], error message:java.lang.NullPointerException: Parameter specified as non-null is null: method com.flyjingfish.android_aop_plugin.beans.ClassSuperInfo., parameter superName
Merge jar error entry:[META-INF/versions/9/module-info.class], error message:java.lang.NullPointerException: Parameter specified as non-null is null: method com.flyjingfish.android_aop_plugin.beans.ClassSuperInfo., parameter superName
Merge jar error entry:[module-info.class], error message:java.lang.NullPointerException: Parameter specified as non-null is null: method com.flyjingfish.android_aop_plugin.beans.ClassSuperInfo., parameter superName
Merge jar error entry:[module-info.class], error message:java.lang.NullPointerException: Parameter specified as non-null is null: method com.flyjingfish.android_aop_plugin.beans.ClassSuperInfo., parameter superName
Merge jar error entry:[module-info.class], error message:java.lang.NullPointerException: Parameter specified as non-null is null: method com.flyjingfish.android_aop_plugin.beans.ClassSuperInfo., parameter superName
Merge jar error entry:[META-INF/versions/9/module-info.class], error message:java.lang.NullPointerException: Parameter specified as non-null is null: method com.flyjingfish.android_aop_plugin.beans.ClassSuperInfo., parameter superName
Merge jar error entry:[META-INF/versions/9/module-info.class], error message:java.lang.NullPointerException: Parameter specified as non-null is null: method com.flyjingfish.android_aop_plugin.beans.ClassSuperInfo., parameter superName
详细日志
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:debugAssembleAndroidAopTask'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:149)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:147)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:338)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:325)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:318)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:304)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: java.lang.RuntimeException: Merge jar error entry:[module-info.class], error message:java.util.zip.ZipException: duplicate entry: module-info.class,通常情况下你需要先重启Android Studio,然后clean一下项目即可,如果还有问题请到Github联系作者
at com.flyjingfish.android_aop_plugin.AssembleAndroidAopTask.wovenIntoCode(AssembleAndroidAopTask.kt:336)
at com.flyjingfish.android_aop_plugin.AssembleAndroidAopTask.scanFile(AssembleAndroidAopTask.kt:71)
at com.flyjingfish.android_aop_plugin.AssembleAndroidAopTask.taskAction(AssembleAndroidAopTask.kt:61)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193)
at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:166)
at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:93)
at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:57)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:54)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:54)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:28)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.executeDelegateBroadcastingChanges(CaptureStateAfterExecutionStep.java:100)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:72)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:50)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:166)
at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:70)
at org.gradle.internal.Either$Right.fold(Either.java:175)
at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:68)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:46)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:91)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:55)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:37)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:76)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:37)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:94)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:49)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:71)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:45)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNonEmptySources(SkipEmptyWorkStep.java:177)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:81)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:53)
at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:75)
at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:41)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:32)
at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:287)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:21)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:42)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:31)
at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:146)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:338)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:325)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:318)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:304)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
库的版本号:
1.2.1
我在使用AndroidAopMatchClassMethod时,发现其方法名methodName参数是必选项,这样就无法对匹配类的所有方法做处理,希望能解惑。比如我要统计,onCreate 方法中引用的init1、init2等方法的耗时,用起来很不方便
例如使用什么功能时会这样
引入插件之后,android{} 方法块报错
Internal error occurred while analyzing this expression: AssertionError: Number of arguments should not be less than number of parameters, but: parameters=5, args=4
并不影响编译流程,可以正常注入切面使用,就是出现这个报错一片红很难受,而且android{}代码块里的代码提示和补全会失效,十分影响开发效率。不确定具体是怎么回事,我创了个新的空白项目测试只引入AndroidAOP一样会出现一样的报错,可以排除是依赖导致的问题,我推测可能是AGP的问题,但也不确定,实在束手无策了,想问问有没有什么办法能解决。
把错误日志贴出来
Internal error occurred while analyzing this expression: AssertionError: Number of arguments should not be less than number of parameters, but: parameters=5, args=4
说明库版本号
如果可以的话,告诉我作者你的版本配置,我看能不能调成一样的,看看是不是哪个东西的版本问题。
比如想hook 主工程、子工程、三方库中 所有的buttonClick事件 或者 textView的setText方法,用这个能做吗? (并不需要真正hook系统方法,应该是通过调用的地方hook入口实现,类似aspectj)
例如使用什么功能时会这样
把你的出现错误的代码关键部分贴出来
把错误日志贴出来
说明库版本号
kotlin版本1.9.0
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.