sy007 / debounceplugin Goto Github PK
View Code? Open in Web Editor NEWAndroid点击事件防抖动插件
License: Apache License 2.0
Android点击事件防抖动插件
License: Apache License 2.0
如题。DroidAssist目前不支持AGP8
建议可以增加方法注解,实现白名单和黑名单效果。
例如:@CheckViewOnClick :把指定的方法加入防抖策略。场景为:在xml声明的点击事件方法。
@UncheckViewOnClick :把指定的方法排除防抖策略,场景为:购物车点击加号增加商品数量。
可以参考这个项目 https://github.com/leavesCZY/ASM_Transform
毕竟字节码插桩是要花费编译时间的,开发模式下能关闭最好。
类似这个错误:didi/DRouter#52
`Execution failed for task ':app:enterpriseKoreaDebugDebounceModifyClasses'.
SHA-256 digest error for org/bouncycastle/asn1/cmc/CertificationRequest$1.class
Run with --info or --debug option to get more log output.
Run with --scan to get full insights.
`
Execution failed for task ':app:transformClassesWithDebounceTransformForProDebug'.
java.lang.IllegalArgumentException (no error message)
Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithDebounceTransformForProDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
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.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.lang.IllegalArgumentException
at org.objectweb.asm.ClassReader.(ClassReader.java:160)
at org.objectweb.asm.ClassReader.(ClassReader.java:143)
at org.objectweb.asm.ClassReader.(ClassReader.java:418)
at com.sunyuan.click.debounce.utils.SpecifiedInterfaceImplChecked.getClassReader(SpecifiedInterfaceImplChecked.java:84)
at com.sunyuan.click.debounce.utils.SpecifiedInterfaceImplChecked.collectImplTargetInterfaces(SpecifiedInterfaceImplChecked.java:36)
at com.sunyuan.click.debounce.utils.SpecifiedInterfaceImplChecked.collectImplTargetInterfaces(SpecifiedInterfaceImplChecked.java:41)
at com.sunyuan.click.debounce.utils.SpecifiedInterfaceImplChecked.collectImplTargetInterfaces(SpecifiedInterfaceImplChecked.java:41)
at CollectNeedHookMethodInformationVisitor.visitEnd(CollectNeedHookMethodInformationVisitor.kt:29)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:702)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
at com.sunyuan.click.debounce.DebounceTransform.modifyClass(DebounceTransform.kt:199)
at com.sunyuan.click.debounce.DebounceTransform$transformJar$modifiedJar$1.process(DebounceTransform.kt:167)
at com.sunyuan.click.debounce.utils.JarUtil.modifyJarFile(JarUtil.java:35)
at com.sunyuan.click.debounce.DebounceTransform.transformJar(DebounceTransform.kt:161)
at com.sunyuan.click.debounce.DebounceTransform.transform(DebounceTransform.kt:91)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:106)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskInputsTaskAction.doExecute(IncrementalTaskInputsTaskAction.java:47)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:569)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$0(ExecuteStep.java:32)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:32)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
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.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.lang.ClassCastException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at com.sunyuan.click.debounce.utils.TransformKt.transform(Transform.kt:41)
at com.sunyuan.click.debounce.DebounceTransform.transformDirInput(DebounceTransform.kt:132)
at com.sunyuan.click.debounce.DebounceTransform.access$transformDirInput(DebounceTransform.kt:26)
at com.sunyuan.click.debounce.DebounceTransform$transform$1$2$1.invoke(DebounceTransform.kt:73)
at com.sunyuan.click.debounce.DebounceTransform$transform$1$2$1.invoke(DebounceTransform.kt:72)
at com.sunyuan.click.debounce.utils.Worker.submit$lambda-1(Worker.kt:32)
Caused by: java.lang.ClassCastException
version:2.0.1
com.android.tools.build:gradle:7.3.1
kotlin:1.7.20
gradle:7.4
compileSdkVersion 33
debounce {
proxyClassName = "com.example.mall.ClickMethodProxy"
generateReport = true
excludes = [
"androidx//*",
"android//",
"com/google/android/**/",
"**/_ViewBinding.class"]
}
现象:运行后闪退,找不到com.google.firebase.provider.FirebaseInitProvider【设置debounceEnable=false则正常运行】
报错信息:
java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/~~XkrZDXP0CmTz7-niYR_Idg==/com.xueke.mall-Ww7FFuVcbWhnB5KKSiENmw==/base.apk"],nativeLibraryDirectories=[/data/app/~~XkrZDXP0CmTz7-niYR_Idg==/com.xueke.mall-Ww7FFuVcbWhnB5KKSiENmw==/lib/arm64, /system/lib64, /system/system_ext/lib64]]
at android.app.ActivityThread.installProvider(ActivityThread.java:7633)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:7106)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6977)
at android.app.ActivityThread.access$1500(ActivityThread.java:258)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1983)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:8060)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/~~XkrZDXP0CmTz7-niYR_Idg==/com.xueke.mall-Ww7FFuVcbWhnB5KKSiENmw==/base.apk"],nativeLibraryDirectories=[/data/app/~~XkrZDXP0CmTz7-niYR_Idg==/com.xueke.mall-Ww7FFuVcbWhnB5KKSiENmw==/lib/arm64, /system/lib64, /system/system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.AppComponentFactory.instantiateProvider(AppComponentFactory.java:147)
at androidx.core.app.CoreComponentFactory.instantiateProvider(CoreComponentFactory.java:67)
at android.app.ActivityThread.installProvider(ActivityThread.java:7617)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:7106)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6977)
at android.app.ActivityThread.access$1500(ActivityThread.java:258)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1983)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:8060)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
编译过程很多这个异常
Duplicated jar entry:.transforms/ac4c027c42e96d584d95340c0be9eecf/transformed/classes.jar!/com/
AGP8.1.1
GRADLE 8.0-bin
version:1.2.0
com.android.tools.build:gradle:7.2.2
kotlin:1.6.20
gradle:7.3.3
compileSdkVersion 33
buildToolsVersion '30.0.3'
debounce {
isDebug = true
checkTime = 5000
generateReport = true
}
现象:点击第一个按钮后,再点击第二个按钮,在配置时间内第二个按钮不会响应;
java.lang.NoSuchFieldError: No instance field $$bounceChecker of type Lcom/sunyuan/debounce/lib/BounceChecker; in class Lim
用的是默认的配置 “io.github.sy007:debounce-lib:1.0.1”
Modifier.clickable {
// some code
}
这种Compose 中的点击事件好像不支持?
CheckBox设置点击(选中)事件之后,时间间隔内连续点击的时候,事件方法体会按照设置的时间间隔间隔执行,但是每次点击依旧会改变CheckBox的选中状态,导致方法体执行时拿到的CheckBox状态与界面显示的CheckBox实际效果不同。
你好,我集成到项目里build以后提示我:
Execution failed for task ':app:transformClassesWithDebounceTransformForDevDebug'.
java.lang.IllegalArgumentException: Unsupported api 589824
依赖库版本:2.1.2
项目gradle版本:4.2.2
版本:2.0.3
android gradle:7.2.2
gradle:7.3.3-bin
gradle配置:
debounce {
generateReport = true
// proxyClassName = "com.example.utils.DebounceProxy"
proxyClassName = "com.example.utils.ClickMethodProxy"
excludes = [
"androidx/**/*", //排除官方组件插桩
"android/**/*", //排除官方组件插桩
"com/google/android/**/*", //排除官方组件插桩
]
}
使用kotlin(结果不能生效,生成的报告:modified 0 classes and 0 methods):
@InterfaceMethodProxy(
ownerType = View.OnClickListener::class,
methodName = "onClick",
parameterTypes = [View::class],
returnType = Unit::class
)
fun onClickProxy(param: MethodHookParam): Boolean {
/**
* [View.OnClickListener.onClick]只有一个参数View,所以直接取
*/
if (param.args[0] is CheckBox) {
return false
}
val view = param.args[0] as View
val isBounce = checker.checkView(param.owner, param.methodName, view, CHECK_TIME)
return isBounce
}
使用java(结果可以生效,生成报告:modified 90 classes and 138 methods):
@InterfaceMethodProxy(
ownerType = View.OnClickListener.class,
methodName = "onClick",
parameterTypes = {View.class},
returnType = void.class)
public boolean onClickProxy(MethodHookParam param) {
/**
* {@link View.OnClickListener#onClick(View)}只有一个参数View,所以直接取
*/
if (param.args[0] instanceof CheckBox) {
return false;
}
View view = (View) param.args[0];
boolean isBounce = checker.checkView(param.owner, param.methodName, view, CHECK_TIME);
return isBounce;
}
只在library中依赖没有生效
debounce {
isDebug =true //是否在gradle构建日志和logcat中输出log
checkTime = 300 //防抖的阈值毫秒(基于单个控件)
generateReport = true
}
配置如上
运行时发现防抖不生效,且没有防抖日志
配置:
version:2.0.1
com.android.tools.build:gradle:7.2.2
kotlin:1.6.10
gradle:7.3.3
debounce {
//配置自定义hook类
proxyClassName = "com.me.ClickMethodProxy"
//输出修改报告
generateReport = false
includes =[
"com/me/**/*" //
]
//排除哪些目录或文件的插桩(目录或文件黑名单)
excludes = ["androidx/**/*", //排除官方组件插桩
"android/**/*", //排除官方组件插桩
"com/google/android/**/*", //排除官方组件插桩
"butterknife/internal/DebouncingOnClickListener.class",//排除ButterKnife处理,ButterKnife事件防抖由proxyClassName中的配置保证
"**/*_ViewBinding*.class"]
}
问题描述:
构建时提示错误
Task :app:transformClassesWithDebounceTransformForBoth78Debug FAILED
Execution optimizations have been disabled for task ':app:transformClassesWithDebounceTransformForBoth78Debug' to ensure correctness due to the following reasons:
Execution failed for task ':app:transformClassesWithDebounceTransformForBoth78Debug'.
java.lang.ArrayIndexOutOfBoundsException: Index 3699 out of bounds for length 3699
Run with --info or --debug option to get more log output.
Run with --scan to get full insights.
目前的防抖维度单个控件来控制的.
增加全局控件防抖的功能,即点击A控件再点击B控件,依然有防抖效果
希望可以增加相关配置,可以由使用者自由选择防抖维度
Execution optimizations have been disabled for task ':app:transformClassesWithDebounceTransformForDebug' to ensure correctness due to the following reasons:
如果升级到AGP8.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.