XianyuTech / aspectd

AOP for Flutter(Dart)
MIT License
1.1k stars 123 forks source link

Execute 对非自定义类无效 #109

Closed Dokay closed 3 years ago

Dokay commented 3 years ago

想对GestureDetector 构造函数进行hook发现无效,demo里的MyApp等自己自定义类可以Hook成功,试了1.22.4和2.0.0均如此;

完整的测试代码: `// 正常Hook,有log输出 @Aspect() @pragma("vm:entry-point") class InjectDemo44 { @pragma("vm:entry-point") InjectDemo44();

@Execute("package:example/main.dart", "MyApp", "-build") @pragma("vm:entry-point") dynamic myAppBuild(PointCut pointcut) { print( '[KWLM81]Before:${pointcut.target}-${pointcut.function}-${pointcut.namedParams}-${pointcut.positionalParams}'); final dynamic obj = pointcut.proceed(); return obj; } }

// 以下方法没有Hook成功,即没有Log输出 @Aspect() @pragma("vm:entry-point") class InjectDemo55 { @pragma("vm:entry-point") InjectDemo55(); @Execute("package:example/main.dart", "MyApp", "+MyApp") @pragma("vm:entry-point") static dynamic myAppConstruct(PointCut pointcut) { print( '[KWLM82]Before:${pointcut.target}-${pointcut.function}-${pointcut.namedParams}-${pointcut.positionalParams}'); final dynamic obj = pointcut.proceed(); return obj; } }

@Aspect() @pragma("vm:entry-point") class InjectDemo66 { @pragma("vm:entry-point") InjectDemo66(); // ReadMe中的写法 @Execute("package:flutter/src/material/app.dart", "MaterialApp", "-build") @pragma("vm:entry-point") dynamic myMaterialAppBuild(PointCut pointcut) { print( '[KWLM91]Before:${pointcut.target}-${pointcut.function}-${pointcut.namedParams}-${pointcut.positionalParams}'); final dynamic obj = pointcut.proceed(); return obj; } }

@Aspect() @pragma("vm:entry-point") class InjectDemo77 { @pragma("vm:entry-point") InjectDemo77();

@Execute("package:flutter/lib/src/material/app.dart", "MaterialApp", "+MaterialApp") @pragma("vm:entry-point") static dynamic myMaterialAppConstruct(PointCut pointcut) { print( '[KWLM92]Before:${pointcut.target}-${pointcut.function}-${pointcut.namedParams}-${pointcut.positionalParams}'); final dynamic obj = pointcut.proceed(); return obj; } }

@Aspect() @pragma("vm:entry-point") class InjectDemo88 { @pragma("vm:entry-point") InjectDemo88(); @Execute("package:flutter/lib/src/widgets/gesture_detector.dart", "GestureDetector", "+GestureDetector") @pragma("vm:entry-point") static dynamic myGestureDetectorConstruct(PointCut pointcut) { dynamic obj = pointcut.proceed(); print( '[KWLM93]:${pointcut.sourceInfos}:${pointcut.target}:${pointcut.function}!'); return obj; } }`

flutter doctor, 1.22.4 Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel unknown, 1.22.4, on macOS 11.2.3 20D91 darwin-x64, locale zh-Hans-CN) [✗] Android toolchain - develop for Android devices ✗ Unable to locate Android SDK. Install Android Studio from: https://developer.android.com/studio/index.html On first launch it will assist you in installing the Android SDK components. (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions). If the Android SDK has been installed to a custom location, set ANDROID_SDK_ROOT to that location. You may also want to add it to your PATH environment variable.

[✓] Xcode - develop for iOS and macOS (Xcode 12.2) [!] Android Studio (not installed) [✓] VS Code (version 1.55.0) [✓] Connected device (1 available)

flutter doctor, 2.0.0 Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 2.0.0, on macOS 11.2.3 20D91 darwin-x64, locale zh-Hans-CN) [✗] Android toolchain - develop for Android devices ✗ Unable to locate Android SDK. Install Android Studio from: https://developer.android.com/studio/index.html On first launch it will assist you in installing the Android SDK components. (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions). If the Android SDK has been installed to a custom location, please use flutter config --android-sdk to update to that location.

[✓] Xcode - develop for iOS and macOS [✓] Chrome - develop for the web [!] Android Studio (not installed) [✓] VS Code (version 1.55.0) [✓] Connected device (2 available)

! Doctor found issues in 2 categories.

kangwang1988 commented 3 years ago

这里有几点我明确下。

  1. Constructor无法使用execute来处理,因为execute site的逻辑是,构造一个新的函数,在这个新的函数中,去调用老的函数,以及aop的代码。但是对于constructor,其并不存在return的逻辑。
  2. 这个case可以通过call的方式去解决,但是即便是call,你写的aop代码也是有问题的,importuri,这部分需要同标准化的importUri一致,在这个case下,如下:
Screen Shot 2021-04-10 at 3 05 16 PM

@Dokay