Skip to content

Commit 5ad6d6a

Browse files
committed
fix bug mixin not work
fix bug dispatchEvent inject not work
1 parent 9df26ed commit 5ad6d6a

File tree

6 files changed

+55
-44
lines changed

6 files changed

+55
-44
lines changed

README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ dart --deterministic --no-sound-null-safety --packages=rebased_package_config.js
3333
## 编译aot dill
3434
dart run frontend_server.dart.snapshot --sdk-root /Users/lixin/Documents/flutter_macos_stable/bin/cache/artifacts/engine/common/flutter_patched_sdk/ --target=flutter --aot --tfa --no-print-incremental-dependencies -Dflutter.inspector.structuredErrors=true -DFLUTTER_WEB_AUTO_DETECT=true -Ddart.vm.profile=false -Ddart.vm.product=false --enable-asserts --track-widget-creation --packages /Users/lixin/Documents/FlutterWorkspace/aspect_frontend_server/example/.dart_tool/package_config.json --output-dill app.dill --depfile /Users/lixin/Documents/FlutterWorkspace/aspect_frontend_server/example/.dart_tool/flutter_build/1f083b7beecc20d87dfa8f7e4ca58986/kernel_snapshot.d package:example/main.dart
3535

36-
37-
3836
## 编译运行时dill
3937
dart run frontend_server.dart.snapshot --sdk-root /Users/lixin/Documents/flutter_macos_stable/bin/cache/artifacts/engine/common/flutter_patched_sdk/ --target=flutter --no-print-incremental-dependencies -Dflutter.inspector.structuredErrors=true -DFLUTTER_WEB_AUTO_DETECT=true -Ddart.vm.profile=false -Ddart.vm.product=false --enable-asserts --track-widget-creation --packages /Users/lixin/Documents/FlutterWorkspace/aspect_frontend_server/example/.dart_tool/package_config.json --output-dill app.dill --depfile /Users/lixin/Documents/FlutterWorkspace/aspect_frontend_server/example/.dart_tool/flutter_build/1f083b7beecc20d87dfa8f7e4ca58986/kernel_snapshot.d package:example/main.dart
4038

@@ -44,7 +42,6 @@ dart run frontend_server.dart.snapshot --sdk-root /Users/lixin/Documents/flutter
4442
## dill 文件注入成功检测
4543
dart run dump_kernel.dart.snapshot app.dill injected.out.dill.txt
4644

47-
dart /Users/lixin/Documents/FlutterWorkspace/dart_sdk/sdk/pkg/vm/bin/dump_kernel.dart example/.dart_tool/flutter_build/1f083b7beecc20d87dfa8f7e4ca58986/app.dill injected.out.dill.txt
4845

4946
# 替换flutter中的frontend_server.dart.snapshot
5047
1.将新编译的frontend_server.dart.snapshot覆盖 flutter_macos_stable/bin/cache/artifacts/engine/darwin-x64/frontend_server.dart.snapshot

analysis_options.yaml

Lines changed: 0 additions & 4 deletions
This file was deleted.

example/lib/inject.dart

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter/foundation.dart';
2+
import 'package:flutter/gestures.dart';
23

34
//普通方法拦截
45
@pragma("aopd:aspect")
@@ -183,24 +184,25 @@ class Inject {
183184
"isRegex": false
184185
})
185186
//必须是static,不然不起作用
186-
static void hookHitTest(
187+
static dynamic dispatchEvent(
187188
Object target,
188189
String functionName,
189190
List<dynamic> positionalParams,
190191
Map<String, dynamic> namedParams,
191192
Function proceed) {
192-
debugPrint('hookHitTest - start');
193-
Function.apply(proceed, positionalParams, _transToNamedParams(namedParams));
194-
debugPrint('hookHitTest - end');
193+
PointerEvent event = positionalParams[0];
194+
debugPrint('dispatchEvent - start ${event.kind.name}');
195+
return Function.apply(
196+
proceed, positionalParams, _transToNamedParams(namedParams));
195197
}
196198

197199
//Mixin里方法拦截的例子
198200
@pragma('vm:entry-point')
199201
@pragma("aopd:inject", {
200202
"importUri": "package:example/main.dart",
201-
"clsName": r"__.+MixinHomePageState",
203+
"clsName": "Test6Mixin",
202204
"methodName": "-_test6",
203-
"isRegex": true
205+
"isRegex": false
204206
})
205207
//必须是static,不然不起作用
206208
static void _injectTest6(
@@ -300,9 +302,9 @@ class Inject {
300302
@pragma('vm:entry-point')
301303
@pragma("aopd:inject", {
302304
"importUri": "package:example/test_mixin.dart",
303-
"clsName": r"_?&BaseController.*&MixinBaseController",
305+
"clsName": "MixinBaseController",
304306
"methodName": "-testMixin",
305-
"isRegex": true
307+
"isRegex": false
306308
})
307309
//必须是static,不然不起作用
308310
static dynamic testMixin(
@@ -311,7 +313,7 @@ class Inject {
311313
List<dynamic> positionalParams,
312314
Map<String, dynamic> namedParams,
313315
Function proceed) async {
314-
debugPrint("[Inject] testMixin start: ${namedParams["packageName"]}");
316+
debugPrint("[Inject] testMixin start");
315317

316318
return Function.apply(
317319
proceed, positionalParams, _transToNamedParams(namedParams));

example/lib/main.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ extension ExtensionHomePageState on MyHomePageState {
102102
}
103103
}
104104

105-
mixin MixinHomePageState {
105+
mixin Test6Mixin {
106106
void _test6(int key1, String key2, {String key3 = 'namedkey6'}) {
107107
total++;
108108
debugPrint("$total _test6 $key1 $key2 $key3");
@@ -144,7 +144,7 @@ class RepositoryImpl extends BaseRepository {
144144
}
145145

146146
class MyHomePageState extends State<MyHomePage>
147-
with MixinHomePageState, MixinHomePageState2 {
147+
with Test6Mixin, MixinHomePageState2 {
148148
int _counter = 0;
149149

150150
final BaseRepository repository = RepositoryImpl();
@@ -175,7 +175,7 @@ class MyHomePageState extends State<MyHomePage>
175175
// _test3(_counter, "positional3");
176176
// await _test4(_counter, "positional4");
177177
// await _test5(_counter, "positional5");
178-
// _test6(_counter, "positional6");
178+
_test6(_counter, "positional6");
179179
_test7(_counter, "positional7");
180180
// await repository.getAppVersion(packageName: "packageName");
181181
// await repository.getAppVersion2(packageName: "packageName2");

frontend_server.dart.snapshot

1.63 KB
Binary file not shown.

lib/method_transformer.dart

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -206,48 +206,40 @@ class _MethodExecuteVisitor extends RecursiveVisitor<void> {
206206

207207
@override
208208
void visitLibrary(Library library) {
209-
String importUri = library.importUri.toString();
210-
211-
bool matches = false;
212-
int aopItemInfoListLen = _aopItemList.length;
213-
for (int i = 0; i < aopItemInfoListLen && !matches; i++) {
214-
MethodItem aopItem = _aopItemList[i];
215-
if ((aopItem.isRegex && RegExp(aopItem.importUri).hasMatch(importUri)) ||
216-
(!aopItem.isRegex && importUri == aopItem.importUri)) {
217-
matches = true;
218-
break;
219-
}
220-
}
221-
if (matches) {
222-
library.visitChildren(this);
223-
}
209+
library.visitChildren(this);
224210
}
225211

226212
@override
227213
void visitClass(Class node) {
228214
String clsName = node.name;
229215

230216
Library originalLibrary = node.enclosingLibrary;
217+
231218
if (node.isAnonymousMixin && node.isEliminatedMixin) {
232-
print(
233-
"[MethodAopTransformer] ${node.name} isAnonymousMixin:${originalLibrary.importUri.toString()}}");
219+
if (node.implementedTypes.isNotEmpty) {
220+
originalLibrary =
221+
node.implementedTypes.first.classNode.enclosingLibrary;
222+
clsName = node.implementedTypes.first.classNode.name;
223+
}
224+
//print(
225+
// "[MethodAopTransformer] visitClass isAnonymousMixin ${node.name} ${originalLibrary.importUri.toString()}}");
234226
}
235227
bool matches = false;
236228
int aopItemInfoListLen = _aopItemList.length;
237229
for (int i = 0; i < aopItemInfoListLen && !matches; i++) {
238230
MethodItem aopItem = _aopItemList[i];
239231

240-
if ((aopItem.isRegex && RegExp(aopItem.clsName).hasMatch(clsName)) ||
241-
(!aopItem.isRegex && clsName == aopItem.clsName) &&
242-
originalLibrary.importUri.toString() == aopItem.importUri) {
232+
if (((aopItem.isRegex && RegExp(aopItem.clsName).hasMatch(clsName)) ||
233+
(!aopItem.isRegex && clsName == aopItem.clsName)) &&
234+
originalLibrary.importUri.toString() == aopItem.importUri) {
243235
matches = true;
244236
break;
245237
}
246238
}
247239

248240
if (matches) {
249241
print(
250-
"[MethodAopTransformer] visitClass match ${node.parent.runtimeType.toString()} ${node.name}");
242+
"[MethodAopTransformer] visitClass match ${originalLibrary.importUri} ${node.name}");
251243
node.visitChildren(this);
252244
}
253245
}
@@ -283,7 +275,7 @@ class _MethodExecuteVisitor extends RecursiveVisitor<void> {
283275
if (node.parent is Class) {
284276
needCompareClass = true;
285277
originalClass = node.parent as Class;
286-
originalLibrary = originalClass.enclosingLibrary;
278+
originalLibrary = node.enclosingLibrary;
287279
}
288280

289281
String? clsName = null;
@@ -293,6 +285,20 @@ class _MethodExecuteVisitor extends RecursiveVisitor<void> {
293285
importUri = originalLibrary?.importUri.toString();
294286
}
295287

288+
if (needCompareClass &&
289+
originalClass != null &&
290+
originalClass.isAnonymousMixin &&
291+
originalClass.isEliminatedMixin) {
292+
if (originalClass.implementedTypes.isNotEmpty) {
293+
clsName = originalClass.implementedTypes.first.classNode.name;
294+
importUri = originalClass
295+
.implementedTypes.first.classNode.enclosingLibrary.importUri
296+
.toString();
297+
//print(
298+
// "[MethodAopTransformer] visitProcedure isAnonymousMixin so transform it clasName[${originalClass.name} to $clsName] importUri[${originalLibrary?.importUri.toString()} to $importUri]");
299+
}
300+
}
301+
296302
MethodItem? matchedAopItem = null;
297303
int aopItemInfoListLen = _aopItemList.length;
298304
for (int i = 0; i < aopItemInfoListLen && matchedAopItem == null; i++) {
@@ -316,7 +322,17 @@ class _MethodExecuteVisitor extends RecursiveVisitor<void> {
316322
}
317323
}
318324
if (matchedAopItem == null) {
325+
if ((originalClass?.isAnonymousMixin ?? false) &&
326+
(originalClass?.isEliminatedMixin ?? false)) {
327+
//print(
328+
// "[MethodAopTransformer] visitProcedure isAnonymousMixin so transform it clasName[${originalClass?.name} to $clsName] importUri[${originalLibrary?.importUri.toString()} to $importUri]");
329+
//print(
330+
// "[MethodAopTransformer] visitProcedure notMatch ${originalLibrary?.importUri.toString()}|${originalClass?.name}|$procedureName");
331+
}
319332
return;
333+
} else {
334+
print(
335+
"[MethodAopTransformer] visitProcedure match ${originalLibrary?.importUri.toString()}|${originalClass?.name}|$procedureName");
320336
}
321337

322338
try {
@@ -329,20 +345,20 @@ class _MethodExecuteVisitor extends RecursiveVisitor<void> {
329345
node.parent?.parent as Library, matchedAopItem, node);
330346
} else {
331347
print(
332-
"[MethodAopTransformer] error ${node.parent.runtimeType.toString()} ${node.name.text}");
348+
"[MethodAopTransformer] visitProcedure error ${node.parent.runtimeType.toString()} ${node.name.text}");
333349
}
334350
} else {
335351
if (node.parent != null) {
336352
transformInstanceMethodProcedure(
337353
node.parent?.parent as Library, matchedAopItem, node);
338354
} else {
339355
print(
340-
"[MethodAopTransformer] error node.parent == null ${node.name.text}");
356+
"[MethodAopTransformer] visitProcedure error node.parent == null ${node.name.text}");
341357
}
342358
}
343359
} catch (error, stack) {
344360
print(
345-
"[MethodAopTransformer] ${error.toString()} \n ${stack.toString()}");
361+
"[MethodAopTransformer] visitProcedure ${error.toString()} \n ${stack.toString()}");
346362
}
347363
}
348364

0 commit comments

Comments
 (0)