{"id":19528953,"url":"https://github.com/lianjiatech/beike_aspectd","last_synced_at":"2025-04-26T11:33:56.852Z","repository":{"id":41607750,"uuid":"430539219","full_name":"LianjiaTech/Beike_AspectD","owner":"LianjiaTech","description":"Flutter AOP framework. Now compatible with Flutter v3.10.5","archived":false,"fork":false,"pushed_at":"2023-08-03T02:06:09.000Z","size":240953,"stargazers_count":144,"open_issues_count":21,"forks_count":20,"subscribers_count":21,"default_branch":"3.10.5","last_synced_at":"2024-08-03T09:07:40.326Z","etag":null,"topics":["aop","aspect","dart","flutter","hook","ios"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LianjiaTech.png","metadata":{"files":{"readme":"README-CN.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-11-22T02:37:26.000Z","updated_at":"2024-07-16T07:02:50.000Z","dependencies_parsed_at":"2024-01-14T16:26:33.322Z","dependency_job_id":null,"html_url":"https://github.com/LianjiaTech/Beike_AspectD","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LianjiaTech%2FBeike_AspectD","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LianjiaTech%2FBeike_AspectD/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LianjiaTech%2FBeike_AspectD/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LianjiaTech%2FBeike_AspectD/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LianjiaTech","download_url":"https://codeload.github.com/LianjiaTech/Beike_AspectD/tar.gz/refs/heads/3.10.5","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224033097,"owners_count":17244534,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aop","aspect","dart","flutter","hook","ios"],"created_at":"2024-11-11T01:21:13.250Z","updated_at":"2024-11-11T01:21:14.400Z","avatar_url":"https://github.com/LianjiaTech.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"Language:  中文简体 | [English](README.md)\n\n# Beike_AspectD\nThis is a fork of [AspectD](https://github.com/XianyuTech/aspectd).\n\nBeike_AspectD是一个dart面向切面库。闲鱼的AspectD为开发者提供了call/execute/inject三种方式对代码进行操作。除此之外，Beike_AspectD还提供了：\n\n- ✅  Add语法支持为class添加方法；\n- ✅  FieldGet语法支持更换变量获取；\n- ✅  支持空安全。（null-safety下的分支）\n- ✅  支持Flutter for Web；\n- ✅  其他的一些问题修复.\n\n# Beike_AspectD有哪些应用场景?\n贝壳已经在一些库中使用Beike_AspectD.\n- 埋点库\n- Json模型转换\n- 性能监控\n- Flutter框架问题修复等\n\n# 安装\n\n## 1. Apply flutter_tools.patch.\n```shell\ncd ...path/to/flutter\ngit apply path-for-beike_aspectd-package/inner/flutter_tools.patch\nrm bin/cache/flutter_tools.stamp\n```\n当下次编译你的Flutter工程时，flutter tools就会重新build。\n\n## 2. 添加Beike_AspectD依赖.\n```dart\ndependencies:\n  beike_aspectd:\n    git:\n        url: https://github.com/LianjiaTech/Beike_AspectD.git\n        ref: 3.10.5\n```\n\n## 3. 将aop_config.yaml添加到你的工程.\n在你的工程根目录下添加一个aop_config.yaml文件(和pubspec.yaml同一级).\n\n你也可以复制Beike_AspectD工程中example目录下的这个文件.\naop_config.yaml的内容如下\n```dart\nflutter_tools_hook:\n  - project_name: 'beike_aspectd'\n    exec_path: 'bin/starter.snapshot'\n```\n我们修改过的Flutter_tools将会检查这个文件来判断Beike_AspectD是否生效。\n\n## 4. 添加hook代码.\nhook_example.dart(aop implementation)\n\n```dart\nimport 'package:beike_aspectd/aspectd.dart';\n\n@Aspect()\n@pragma(\"vm:entry-point\")\nclass CallDemo {\n  @pragma(\"vm:entry-point\")\n  CallDemo();\n\n //实例方法\n @Call(\"package:example/main.dart\", \"_MyHomePageState\",\n     \"-_incrementCounter\")\n @pragma(\"vm:entry-point\")\n void _incrementCounter4(PointCut pointcut) {\n   print('call instance method2!');\n   pointcut.proceed();\n }\n}\n```\n由于hook_example.dart没有在项目中使用，我们应该在工程中引用这个文件，以免被编译器tree shake优化掉。\n\n比如，我们可以在 main.dart引用.\n```dart\n// ignore: unused_import\nimport 'package:example/hook_example.dart';\n```\n\n# 使用\n\n除了支持AspectD支持的call/execute/inject三种方式外，Beike_AspectD还提供了add/field get两种操作。\n\n## add\n为一个类添加方法，支持正则匹配，支持对父类进行筛选.\n```dart\n  @Add(\"package:.+\\\\.dart\", \".*\", isRegex: true)\n  @pragma(\"vm:entry-point\")\n  dynamic getBasicInfo(PointCut pointCut) {\n    return pointCut?.sourceInfos ?? {};\n  }\n```\n\n上面的代码为所有的类添加了getBasicInfo()这个方法，你也可以增加正则表达式或者父类参数来过滤需要添加方法的类。\n\n可以通过以下代码调用添加的方法。\n```dart\n    dynamic instance = someinstance;\n    Map info = instance.getBasicInfo(PointCut.pointCut());\n```\n\n## field get\nField get可以被用来替换对于某个属性的调用.\n\n```dart\n @pragma(\"vm:entry-point\")\n @FieldGet('package:example/main.dart', 'MyApp', 'field', false)\n static String exchange(PointCut pointCut) {\n    return 'Beike_Aspect';\n}\n```\n比如，MyApp有个属性field，通过上面代码，调用MyApp中field属性的地方都会返回字符串'Beike_AspectD'。\n\n## 版本支持\n目前Beike_AspectD已经支持Flutter 1.22.4，2.2.2,2.5.3, 2.10.4 和 3.0.0.\n\n## 如何调试\n见[调试](doc/如何调试.md)\n\n## 常见问题\n- 如何知道我的hook代码是否生效?\n  1. 首先需要下载Flutter对于的dart sdk。Dart sdk的revision可以在path_to_flutter/bin/cache/dart-sdk/revision文件中找到。\n  2. 执行下面脚本：\n    ```dart\n    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\n    ```\n  3. 打开 output_path/out.dill.txt文件, 找到你hook的方法，确认是否被替换.\n\n# 联系\n\n如果你有任何问题，可以提一个issue。或者联系xiaopeng015@ke.com。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flianjiatech%2Fbeike_aspectd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flianjiatech%2Fbeike_aspectd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flianjiatech%2Fbeike_aspectd/lists"}