Git Product home page Git Product logo

beike_aspectd's Introduction

Language: English | 中文简体

Beike_AspectD

This is a fork of AspectD.

Beike_AspectD is an aop framework for dart. AspectD has provide developers call/execute/inject grammer to manipulate the dart code. Besides that, Beike_AspectD also provides

  • ✅ Support add grammer to add function to classes.
  • ✅ Support field get grammer to exchange the field get call.
  • ✅ Support null-safety(null-safety/2.5.3 branch).
  • ✅ Support flutter web.

What can we use Beike_AspectD for?

Beike has used Beike_AspectD in many packages.

  • Event tracking.
  • Json to model.
  • Performance monitoring.
  • Flutter framework bug fixing.

Installation

1. Apply flutter_tools.patch.

cd ...path/to/flutter
git apply path-for-beike_aspectd-package/inner/flutter_tools.patch
rm bin/cache/flutter_tools.stamp

Next time when you build your project, flutter tools will build automatically.

2. Add Beike_AspectD to your yaml.

dependencies:
   beike_aspectd:
     git:
         url: https://github.com/LianjiaTech/Beike_AspectD.git
         ref: 3.10.5

3. Add aop_config.yaml to your flutter project.

Add a file named aop_config.yaml to your flutter project's root directory(the same directory as pubspec.yaml).

You can copy the file from the example of Beike_AspectD. The content of the file are as follow

flutter_tools_hook:
  - project_name: 'beike_aspectd'
    exec_path: 'bin/starter.snapshot'

Flutter_tools will check the file to find if Beike_AspectD is enabled. And it will get the starter.snapshot to process the dill file.

4. Write your hook file and import the file.

hook_example.dart(aop implementation)

import 'package:beike_aspectd/aspectd.dart';

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

 //实例方法
 @Call("package:example/main.dart", "_MyHomePageState",
     "-_incrementCounter")
 @pragma("vm:entry-point")
 void _incrementCounter4(PointCut pointcut) {
   print('call instance method2!');
   pointcut.proceed();
 }
}

As hook_example.dart is not used in your project, we should import it in the project, or it will be tree shaked while compiling.

For example, we can import the file in main.dart.

// ignore: unused_import
import 'package:example/hook_example.dart';

Tutorial

In addition to the 3 ways(call/execute/inject) to do AOP programming AspectD provide us, Beike_AspectD also provide add/field get manipulation.

add

Add a method to a class, support class name regex, support super class filter.

  @Add("package:.+\\.dart", ".*", isRegex: true)
  @pragma("vm:entry-point")
  dynamic getBasicInfo(PointCut pointCut) {
    return pointCut?.sourceInfos ?? {};
  }

Code above add getBasicInfo() method to all the classes, you can use your own regex and superCls parameter to filter classes. We can call the function using the following code.

    dynamic self = someinstance;
    Map info = self.getBasicInfo(PointCut.pointCut());

field get

Every callsites of the a field will be manipulated.

 @pragma("vm:entry-point")
 @FieldGet('package:example/main.dart', 'MyApp', 'field', false)
 static String exchange2(PointCut pointCut) {
    return 'Beike_Aspectd';
}

Suppose MyApp class has a property called field, by using the the above code, when calling the property field, it will always return string 'Beike_Aspectd'.

Compatibility

Currently Beike_Aspectd support flutter 1.22.4 ,2.2.2, 2.5.3, 2.10.4 and 3.0.0.

Q&A

  • How to know if my code is hooked successfully?
    1. First you need to download the dart-sdk and checkout to the corresponding revision of flutter. The revision of dart can be found at path_to_flutter/bin/cache/dart-sdk/revision.
    2. Run the following command.
    path_to_flutter/bin/cache/dart-sdk/bin/dart  path_to_dart/pkg/vm/bin/dump_kernel.dart path_to_your_project/.dart_tool/flutter_build/***/app.dill output_path/out.dill.txt
    1. Open output_path/out.dill.txt file, check if your code is hook.

Contact

If you have any question, please feel free to file a issue.

beike_aspectd's People

Contributors

soloxiao 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

beike_aspectd's Issues

如何支持Flutter2.8.1

没有分支或tag对应2.8.1,对于Flutter2.8.1想要使用插桩库的话要如何定制?

嵌套函数hook会报错---Null check operator used on a null value

class TextRightImageModel {
  String showName;

  String rightIcon;

  Widget showCardWidget(BuildContext context) {
    return Container(
      padding: const EdgeInsets.only(left: 4.0, right: 4.0),
      alignment: Alignment.center,
      child: wrapTextLimit(context, const Text("")),
    );
  }

  Widget wrapTextLimit(BuildContext str, Widget widget) {
    return widget;
  }

}

我的业务代码是上面这个,然后通过以下代码去hook,编译的时候一定会报错

 @Call(
      'package:test/test.dart', 'TextRightImageModel', '-.*',
      isRegex: true)
  @pragma("vm:entry-point")
  dynamic _aop_Two(PointCut pointcut) {
    return pointcut.proceed();
  }

flutter 环境:2.5.3

demo中_incrementCounter没有打印出东西,是不是就标识没hook成功啊

@call("package:example/main.dart", "_MyHomePageState", "-_incrementCounter")
@pragma("vm:entry-point")
void _incrementCounter4(PointCut pointcut) {
// Fluttertoast.showToast(
// msg: "This is a toast message!",
// toastLength: Toast.LENGTH_SHORT,
// gravity: ToastGravity.BOTTOM,
// timeInSecForIosWeb: 1,
// backgroundColor: Colors.grey,
// textColor: Colors.white,
// fontSize: 16.0);
print('[beike_aspectd]: call instance method2!');
pointcut.proceed();
}

这个方法点击的时候没有触发print,是不是就标识没hook成功啊

是否可支持空安全

项目中引入了 3.3.2 版本的 beike_aspectd
在pub get后, 在运行时,报错提示 beike_aspect 不支持空安全?能否支持下?
image

覆写的协议方法hook无效

正则表达式的方式,hook了某个state的实例方法, 主动调用的实例方法hook没问题, 覆写的协议方法不能进hook的方法里。 麻烦看下
image
image

Flutter3.0.0版本没有生成aspectd.dart文件

在Flutter3.0环境下执行:
cd ...path/to/flutter/packages/flutter_tools/
git apply --3way path-for-beike_aspectd-package/inner/flutter_tools.patch
rm ../../bin/cache/flutter_tools.stamp
之后没有反应,flutter_tools/bin目录下没有aspectd.dart文件。
执行第二步apply之后本地没有任何代码变化,git status是clean的。
image

3.0.5分支下混合开发模式安卓,debug模式正常,release模式触发点击事件后报错

I/flutter: type '_OneByteString' is not a subtype of type 'int' of 'index' I/flutter: #0 PointCut.aop_stub_26 (package:beike_aspectd/src/plugins/aop/annotation/pointcut.dart) I/flutter: #1 PointCut.proceed (package:beike_aspectd/src/plugins/aop/annotation/pointcut.dart) I/flutter: #2 ClickAopHook.hookInvokeCallback (package:tdx_flutter/aop/hook_entry_points.dart:36) I/flutter: #3 new _GrowableList._literal2 (dart:core-patch/growable_array.dart) I/flutter: #4 DragGestureRecognizer._checkDown (package:flutter/src/gestures/monodrag.dart) I/flutter: #5 DragGestureRecognizer.addAllowedPointer (package:flutter/src/gestures/monodrag.dart:276)

Flutter版本,3.0.5
混合开发模式是否需要自己编译引擎?

flutter2.10.5使用2.10.4分支出现null safety

: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/lib/aspectd.dart:1
// @Dart=2.8
^^^^^^^^^^^^
: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/aop/aop.dart:1
// @Dart=2.8
^^^^^^^^^^^^
: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/annotation/call.dart:1
// @Dart=2.8
^^^^^^^^^^^^
: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/annotation/execute.dart:1
// @Dart=2.8
^^^^^^^^^^^^
: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/annotation/inject.dart:1
// @Dart=2.8
^^^^^^^^^^^^
: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/annotation/pointcut.dart:1
// @Dart=2.8
^^^^^^^^^^^^
: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/beike_annotation/add.dart:1
// @Dart=2.8
^^^^^^^^^^^^
: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/beike_annotation/field_get.dart:1
// @Dart=2.8
^^^^^^^^^^^^
: Error: A library can't opt out of null safety by default, when using sound null safety.
../…/annotation/annotation_info.dart:1
// @Dart=2.8
^^^^^^^^^^^^
Error: Cannot run with sound null safety, because the following dependencies
don't support null safety:
- package:beike_aspectd
For solutions, see https://dart.dev/go/unsound-null-safety
Failed to package /Users/xx/Desktop/xx/xxxx.
Command PhaseScriptExecution failed with a nonzero exit code
note: Using new build system
note: Planning

在3.3.10 使用 flutter packages pub run build_runner 没有响应

mingdeMac-mini:commApp ziv$ flutter packages pub run build_runner build --delete-conflicting-outputs -v
packages pub run build_runner build --delete-conflicting-outputs -v
[ +86 ms] executing: sysctl hw.optional.arm64
[ +14 ms] Exit code 1 from: sysctl hw.optional.arm64
[ ] sysctl: unknown oid 'hw.optional.arm64'
[ +6 ms] executing: [/Library/Development/flutter/] git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +10 ms] Exit code 0 from: git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +1 ms] 135454af32477f815a7525073027a3ff9eff1bfd
[ +1 ms] executing: [/Library/Development/flutter/] git tag --points-at 135454af32477f815a7525073027a3ff9eff1bfd
[ +34 ms] Exit code 0 from: git tag --points-at 135454af32477f815a7525073027a3ff9eff1bfd
[ ] 3.3.10
[ +52 ms] executing: [/Library/Development/flutter/] git rev-parse --abbrev-ref --symbolic @{upstream}
[ +8 ms] Exit code 0 from: git rev-parse --abbrev-ref --symbolic @{upstream}
[ ] origin/stable
[ ] executing: [/Library/Development/flutter/] git ls-remote --get-url origin
[ +5 ms] Exit code 0 from: git ls-remote --get-url origin
[ ] https://github.com/flutter/flutter.git
[ +50 ms] executing: [/Library/Development/flutter/] git rev-parse --abbrev-ref HEAD
[ +6 ms] Exit code 0 from: git rev-parse --abbrev-ref HEAD
[ ] stable
[ +6 ms] executing: sw_vers -productName
[ +19 ms] Exit code 0 from: sw_vers -productName
[ ] macOS
[ ] executing: sw_vers -productVersion
[ +20 ms] Exit code 0 from: sw_vers -productVersion
[ ] 12.4
[ ] executing: sw_vers -buildVersion
[ +19 ms] Exit code 0 from: sw_vers -buildVersion
[ ] 21F79
[ ] executing: uname -m
[ +9 ms] Exit code 0 from: uname -m
[ ] x86_64
[ +61 ms] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[ +5 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ +64 ms] Artifact Instance of 'MaterialFonts' is not required, skipping update.
[ ] Artifact Instance of 'GradleWrapper' is not required, skipping update.
[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterWebSdk' is not required, skipping update.
[ ] Artifact Instance of 'FlutterSdk' is not required, skipping update.
[ ] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerDebugSymbols' is not required, skipping update.
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IosUsbArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FontSubsetArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'PubDependencies' is not required, skipping update.
[ +88 ms] Using /Library/Development/flutter/.pub-cache for the pub cache.
[ ] executing: /Library/Development/flutter/bin/cache/dart-sdk/bin/dart __deprecated_pub run build_runner build --delete-conflicting-outputs -v

就一直卡在这边不继续执行

修改flutter_tool后执行项目出错,Can't load Kernel binary: Invalid kernel binary format version.

重新构建flutter_tools的信息为
Flutter 3.0.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision f1875d570e (9 weeks ago) • 2022-07-13 11:24:16 -0700
Engine • revision e85ea0e79c
Tools • Dart 2.17.6 • DevTools 2.12.2

但是执行项目代码失败
Can't load Kernel binary: Invalid kernel binary format version.
the Dart compiler exited unexpectedly.
the Dart compiler exited unexpectedly.

是哪里版本不一致吗

Hook构造方法报错

工程里example,hook构造方法的时候,报错提示:type 'Constructor' is not a subtype of type 'Procedure'

3.10.5版本按照步骤引用成功,但运行工程时报错

Unhandled exception:
Crash when compiling:
Null check operator used on a null value

#0 AopAddImplTransformer._filterAopItemInfo (file:///Users/solo/Project/beike_aspectd_opensource/inner/transformer/plugins/aop/beike_transformer/aop_addimpl_transformer.dart:181:50)
#1 AopAddImplTransformer.visitClass (file:///Users/solo/Project/beike_aspectd_opensource/inner/transformer/plugins/aop/beike_transformer/aop_addimpl_transformer.dart:25:32)
#2 Class.accept (package:kernel/ast.dart:1481:38)
#3 visitList (package:kernel/ast.dart:15225:14)
#4 Library.visitChildren (package:kernel/ast.dart:598:5)
#5 AopAddImplTransformer.visitLibrary (file:///Users/solo/Project/beike_aspectd_opensource/inner/transformer/plugins/aop/beike_transformer/aop_addimpl_transformer.dart:17:10)
#6 AopWrapperTransformer.transform (file:///Users/solo/Project/beike_aspectd_opensource/inner/transformer/plugins/aop/aop_transformer_wrapper.dart:138:31)
#7 FlutterTarget.performPreConstantEvaluationTransformations (package:vm/target/flutter.dart:72:40)
#8 KernelTarget.runBuildTransformations (package:front_end/src/fasta/kernel/kernel_target.dart:1518:19)
#9 KernelTarget.buildComponent. (package:front_end/src/fasta/kernel/kernel_target.dart:638:7)

#10 withCrashReporting (package:front_end/src/fasta/crash.dart:136:12)

#11 IncrementalCompiler.computeDelta. (package:front_end/src/fasta/incremental_compiler.dart:413:23)

#12 IncrementalCompiler.compile (package:vm/incremental_compiler.dart:75:50)

#13 FrontendCompiler.compile (package:frontend_server/frontend_server.dart:595:11)

#14 listenAndCompile. (package:frontend_server/frontend_server.dart:1308:11)

the Dart compiler exited unexpectedly.
the Dart compiler exited unexpectedly.

我看着错误,感觉是切片的代码没有针对空安全做好适配。或是我配置的问题?

部分aop方法在2.5.3生效,在最新的3.10.5不生效

@call('package:flutter/src/gestures/binding.dart', 'GestureBinding', '-handlePointerEvent')
方法在Beike_AspectID 的2.5.3(flutter SDK也是2.5.3)生效
在Beike_AspectID 的3.10.5(flutter SDK也是3.10.5)不生效
在flutter的两个SDK中handlePointerEvent方法以及路径并未改变,麻烦楼主帮忙看下这个问题那?

静态方法用execute报错

3.0.0分支,hook静态方法,比如demo里的

@Execute("package:example/receiver_test.dart", "Receiver", "+tap") @pragma("vm:entry-point") static dynamic tap(PointCut pointcut) { print('[beike_aspectd]: Execute static method!'); pointcut.proceed(); }

报错:

Unhandled exception:
[ ] Crash when compiling null,
[ ] at character offset null:
[ ] NoSuchMethodError: The getter 'nonNullable' was called on null.
[ ] Receiver: null
[ ] Tried calling: nonNullable
[ ] #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:38:5)
[ ] #1 Procedure.getterType (package:kernel/ast.dart:3204:59)
[ ] #2 AopUtils.insertProceedBranch

cupertino_icons: ^0.1.2

cupertino_icons: ^0.1.2
Because every version of beike_aspectd from git depends on cupertino_icons ^0.1.2 and every version of downloader from git depends on cupertino_icons ^1.0.2,

example _incrementCounter 换个调用方式 aop 不生效

example工程 代码如果这样写,_incrementCounter是直接作为参数传递 , aop就不生效

      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 

_incrementCounter 放到匿名函数里面调用就生效

      floatingActionButton: FloatingActionButton(
        onPressed: (){
          _incrementCounter();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 

如何知道hook代码生效,执行readMe命令后抛异常?

命令代码如下:

bb@zy Beike_AspectD % /Users/bb/AndroidStudio/flutter/flutter-3.3.2/bin/cache/dart-sdk/bin/dart /Users/bb/AndroidStudio/flutter/dart-sdk-
3.3.2/sdk/pkg/vm/bin/dump_kernel.dart /Users/bb/projects/Beike_AspectD/example/.dart_tool/flutter_build/14e763fd83cbcb6a9f88b13f691f4550/app.dill /Users/bb/projects/Beike_AspectD/example/build/app/outputs/out.dill.txt
Error: Couldn't resolve the package 'kernel' in 'package:kernel/kernel.dart'.
Error: Couldn't resolve the package 'kernel' in 'package:kernel/binary/ast_from_binary.dart'.
Error: Couldn't resolve the package 'vm' in 'package:vm/metadata/direct_call.dart'.
Error: Couldn't resolve the package 'vm' in 'package:vm/metadata/inferred_type.dart'.
Error: Couldn't resolve the package 'vm' in 'package:vm/metadata/procedure_attributes.dart'.
Error: Couldn't resolve the package 'vm' in 'package:vm/metadata/table_selector.dart'.
Error: Couldn't resolve the package 'vm' in 'package:vm/metadata/unboxing_info.dart'.
Error: Couldn't resolve the package 'vm' in 'package:vm/metadata/unreachable.dart'.
Error: Couldn't resolve the package 'vm' in 'package:vm/metadata/call_site_attributes.dart'.
Error: Couldn't resolve the package 'vm' in 'package:vm/metadata/loading_units.dart'.

执行git apply --3way后没有生成aspectd.dart文件

下载了demo工程后按照readme.md配置后,把demo跑起来,解析发现dill文件里面并没有add的插桩代码。检查发现在执行这部git apply --3way /Users/xxxx/tools/aspected/Beike_AspectD/inner/flutter_tools.patch 的时候,并没有在flutter sdk的packages/flutter_tools/lib/src中生成aspectd.dart文件。

和我这里的操作有关么?

版本配置:
Flutter 2.5.3
Dart 2.14.4

我最开始是执行这个,有提示这个错误
`
cd /Users/xxxx/tools/aspected/flutter/packages/flutter_tools
git apply --3way /Users/xxxx/tools/aspected/Beike_AspectD/inner/flutter_tools.patch

error: packages/flutter_tools/lib/src/build_system/targets/common.dart: does not match index
error: packages/flutter_tools/lib/src/build_system/targets/web.dart: does not match index
error: packages/flutter_tools/lib/src/commands/build_bundle.dart: does not match index
error: packages/flutter_tools/lib/src/compile.dart: does not match index
error: packages/flutter_tools/lib/src/web/chrome.dart: does not match index
`

我在这个目录执行这命令是没有错误,但是aspectd.dart没有生成
pwd /Users/xxxx/tools/aspected/flutter/packages/flutter_tools/bin git apply --3way /Users/xxxx/tools/aspected/Beike_AspectD/inner/flutter_tools.patch

泛型会报错

  T testGenericType<T>(Map<T, dynamic> param) {
    return null;
  }

如果去切泛型函数的话,就会抛出这个错误

[+2599 ms] [+2561 ms] Unhandled exception:
[        ]            Invalid argument(s): Type parameter TypeParameter(T) is not indexed
[        ]            #0      TypeParameterIndexer.[] (package:kernel/binary/ast_to_binary.dart:2871:8)
[        ]            #1      BinaryPrinter.visitTypeParameterType (package:kernel/binary/ast_to_binary.dart:2397:38)
[        ]            #2      TypeParameterType.accept (package:kernel/ast.dart:11472:42)
[        ]            #3      BinaryPrinter.writeNode (package:kernel/binary/ast_to_binary.dart:420:10)
[        ]            #4      BinaryPrinter.writeNodeList (package:kernel/binary/ast_to_binary.dart:331:7)
[        ]            #5      BinaryPrinter.visitInterfaceType (package:kernel/binary/ast_to_binary.dart:2295:7)
[        ]            #6      InterfaceType.accept (package:kernel/ast.dart:10703:42)
[        ]            #7      BinaryPrinter.writeNode (package:kernel/binary/ast_to_binary.dart:420:

frontend_server.dart.snapshot文件如何生成?

想定制一些自己的hook规则,请问如何生成frontend_server.dart.snapshot?
目前看,应该是贝壳先生成好了frontend_server.dart.snapshot后在flutter_tools编译的时候直接替换的,但是根据gen_frontend_server_snapshot.sh脚本无法生成snapshot,package_config.json中指明的third_party找不到。

如何获取函数的入参

目前我想到的方法是获取PointCut.proceed()方法的返回值,当前对应的方法也要改成返回想要的结果,但是这样感觉不太友好,请问框架是支持获取函数入参么?我已经打印过PointCut的所有成员变量了,都没有和入参匹配的

运行项目后修改代码再次运行出现Unhandled exception,需要执行flutter clean清理缓存才可以恢复

WX20220802-195451@2x

Unhandled exception: root::package:beike_aspectd/src/plugins/aop/annotation/pointcut.dart::PointCut::@methods::aop_stub_0 is already bound to Reference to package:beike_aspectd/src/plugins/aop/annotation/pointcut.dart::PointCut::@methods::aop_stub_0 with node PointCut.aop_stub_0 (Procedure:114447), trying to bind to Reference to PointCut.aop_stub_0 with node PointCut.aop_stub_0 (Procedure:4371882) package:beike_aspectd/…/annotation/pointcut.dart:1 #0 CanonicalName.bindTo (package:kernel/canonical_name.dart:236:7) #1 Class.computeCanonicalNames (package:kernel/ast.dart:1284:51) #2 Library.computeCanonicalNames (package:kernel/ast.dart:509:14) #3 Component.computeCanonicalNamesForLibrary (package:kernel/ast.dart:13669:13) #4 Component.computeCanonicalNames (package:kernel/ast.dart:13631:7) #5 sortComponent (package:vm/kernel_front_end.dart:702:13) #6 FrontendCompiler.writeDillFile (package:frontend_server/frontend_server.dart:696:5) #7 FrontendCompiler.compile (package:frontend_server/frontend_server.dart:576:13) #8 listenAndCompile. (package:frontend_server/frontend_server.dart:1154:11)

2
the Dart compiler exited unexpectedly.

3.3.10 下debug模式下编译错误

[+8622 ms] Unhandled exception:
[ ] root::package:beike_aspectd/src/plugins/aop/annotation/pointcut.dart::PointCut::@methods::aop_stub_0 is already bound to Reference to
package:beike_aspectd/src/plugins/aop/annotation/pointcut.dart::PointCut::@methods::aop_stub_0 with node PointCut.aop_stub_0 (Procedure:75096), trying to bind
to
Reference to PointCut.aop_stub_0 with node PointCut.aop_stub_0 (Procedure:2431202)
[ ] #0 CanonicalName.bindTo (package:kernel/canonical_name.dart:237:7)
[ ] #1 Procedure.bindCanonicalNames (package:kernel/ast.dart:3038:40)
[ ] #2 Class.ensureCanonicalNames (package:kernel/ast.dart:1270:21)
[ ] #3 Library.ensureCanonicalNames (package:kernel/ast.dart:514:18)
[ ] #4 Component.computeCanonicalNamesForLibrary (package:kernel/ast.dart:14028:13)
[ ] #5 Component.computeCanonicalNames (package:kernel/ast.dart:13991:7)
[ ] #6 sortComponent (package:vm/kernel_front_end.dart:738:13)
[ ] #7 FrontendCompiler.writeDillFile (package:frontend_server/frontend_server.dart:736:5)
[ ] #8 FrontendCompiler.compile (package:frontend_server/frontend_server.dart:615:13)
[ ]
[ ] #9 listenAndCompile. (package:frontend_server/frontend_server.dart:1210:11)
[ ]
[ +80 ms] the Dart compiler exited unexpectedly.
[ ]
#0 throwToolExit (package:flutter_tools/src/base/common.dart:10:3)
#1 DefaultResidentCompiler._compile. (package:flutter_tools/src/compile.dart:835:13)
#2 _rootRun (dart:async/zone.dart:1383:47)
#3 _CustomZone.run (dart:async/zone.dart:1293:19)
#4 _CustomZone.runGuarded (dart:async/zone.dart:1201:7)
#5 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#6 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#7 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#8 _SinkTransformerStreamSubscription._close (dart:async/stream_transformers.dart:87:11)
#9 _EventSinkWrapper.close (dart:async/stream_transformers.dart:21:11)
#10 _StringAdapterSink.close (dart:convert/string_conversion.dart:251:11)
#11 _LineSplitterSink.close (dart:convert/line_splitter.dart:154:11)
#12 _SinkTransformerStreamSubscription._handleDone (dart:async/stream_transformers.dart:132:24)
#13 _rootRun (dart:async/zone.dart:1383:47)
#14 _CustomZone.run (dart:async/zone.dart:1293:19)
#15 _CustomZone.runGuarded (dart:async/zone.dart:1201:7)
#16 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#17 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#18 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#19 _SinkTransformerStreamSubscription._close (dart:async/stream_transformers.dart:87:11)
#20 _EventSinkWrapper.close (dart:async/stream_transformers.dart:21:11)
#21 _StringAdapterSink.close (dart:convert/string_conversion.dart:251:11)
#22 _Utf8ConversionSink.close (dart:convert/string_conversion.dart:305:20)
#23 _ConverterStreamEventSink.close (dart:convert/chunked_conversion.dart:81:18)
#24 _SinkTransformerStreamSubscription._handleDone (dart:async/stream_transformers.dart:132:24)
#25 _rootRun (dart:async/zone.dart:1383:47)
#26 _CustomZone.run (dart:async/zone.dart:1293:19)
#27 _CustomZone.runGuarded (dart:async/zone.dart:1201:7)
#28 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#29 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#30 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#31 _SyncStreamControllerDispatch._sendDone (dart:async/stream_controller.dart:782:19)
#32 _StreamController._closeUnchecked (dart:async/stream_controller.dart:637:7)
#33 _StreamController.close (dart:async/stream_controller.dart:630:5)
#34 _Socket._onData (dart:io-patch/socket_patch.dart:2331:21)
#35 _rootRunUnary (dart:async/zone.dart:1407:13)
#36 _CustomZone.runUnary (dart:async/zone.dart:1300:19)
#37 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1209:7)
#38 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#39 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#40 _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#41 _StreamController._add (dart:async/stream_controller.dart:648:7)
#42 _StreamController.add (dart:async/stream_controller.dart:596:5)
#43 new _RawSocket. (dart:io-patch/socket_patch.dart:1856:35)
#44 _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1315:18)
#45 _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
#46 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
#47 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:122:13)
#48 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:193:5)

[ +6 ms] ensureAnalyticsSent: 1ms
[ +1 ms] Running shutdown hooks
[ ] Shutdown hooks complete
[ +1 ms] the Dart compiler exited unexpectedly.
[ ]
#0 throwToolExit (package:flutter_tools/src/base/common.dart:10:3)
#1 DefaultResidentCompiler._compile. (package:flutter_tools/src/compile.dart:835:13)
#2 _rootRun (dart:async/zone.dart:1383:47)
#3 _CustomZone.run (dart:async/zone.dart:1293:19)
#4 _CustomZone.runGuarded (dart:async/zone.dart:1201:7)
#5 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#6 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#7 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#8 _SinkTransformerStreamSubscription._close (dart:async/stream_transformers.dart:87:11)
#9 _EventSinkWrapper.close (dart:async/stream_transformers.dart:21:11)
#10 _StringAdapterSink.close (dart:convert/string_conversion.dart:251:11)
#11 _LineSplitterSink.close (dart:convert/line_splitter.dart:154:11)
#12 _SinkTransformerStreamSubscription._handleDone (dart:async/stream_transformers.dart:132:24)
#13 _rootRun (dart:async/zone.dart:1383:47)
#14 _CustomZone.run (dart:async/zone.dart:1293:19)
#15 _CustomZone.runGuarded (dart:async/zone.dart:1201:7)
#16 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#17 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#18 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#19 _SinkTransformerStreamSubscription._close (dart:async/stream_transformers.dart:87:11)
#20 _EventSinkWrapper.close (dart:async/stream_transformers.dart:21:11)
#21 _StringAdapterSink.close (dart:convert/string_conversion.dart:251:11)
#22 _Utf8ConversionSink.close (dart:convert/string_conversion.dart:305:20)
#23 _ConverterStreamEventSink.close (dart:convert/chunked_conversion.dart:81:18)
#24 _SinkTransformerStreamSubscription._handleDone (dart:async/stream_transformers.dart:132:24)
#25 _rootRun (dart:async/zone.dart:1383:47)
#26 _CustomZone.run (dart:async/zone.dart:1293:19)
#27 _CustomZone.runGuarded (dart:async/zone.dart:1201:7)
#28 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#29 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#30 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#31 _SyncStreamControllerDispatch._sendDone (dart:async/stream_controller.dart:782:19)
#32 _StreamController._closeUnchecked (dart:async/stream_controller.dart:637:7)
#33 _StreamController.close (dart:async/stream_controller.dart:630:5)
#34 _Socket._onData (dart:io-patch/socket_patch.dart:2331:21)
#35 _rootRunUnary (dart:async/zone.dart:1407:13)
#36 _CustomZone.runUnary (dart:async/zone.dart:1300:19)
#37 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1209:7)
#38 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#39 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#40 _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#41 _StreamController._add (dart:async/stream_controller.dart:648:7)
#42 _StreamController.add (dart:async/stream_controller.dart:596:5)
#43 new _RawSocket. (dart:io-patch/socket_patch.dart:1856:35)
#44 _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1315:18)
#45 _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
#46 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
#47 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:122:13)
#48 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:193:5)

[ +3 ms] ensureAnalyticsSent: 0ms
[ ] Running shutdown hooks
[ ] Shutdown hooks complete
[ ] exiting with code 1
mingdeMac-mini:flutter_study ziv$

按着调试文档步骤调试无法生成frontend_server参数

按着调试文档调试流程调试,在调试Flutter_tools时获取不到frontend_server参数。想问一下我的配置参数是否错误。 在Dart Command Line App中我的Working directory 选择的是Beike_AspectD/example文件,想问一下是不是这个选择的不对导致的。希望得到解答。
image

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.