Skip to content

Commit ae2f16a

Browse files
authored
[infra] Add docs/ top level dir for explaining general interop concepts (#2705)
1 parent 10ab702 commit ae2f16a

File tree

4 files changed

+121
-0
lines changed

4 files changed

+121
-0
lines changed

.github/pr-title-checker-config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"prefixes": [
44
"[code_assets] ",
55
"[data_assets] ",
6+
"[doc] ",
67
"[ffi] ",
78
"[ffigen] ",
89
"[hooks_runner] ",

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
This repository is home to Dart packages related to FFI and native assets
66
building and bundling.
77

8+
## Documentation
9+
10+
See the [doc](doc/) directory for more documentation.
11+
812
## Packages
913

1014
| Package | Description | Issues | Version |

doc/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Documentation
2+
3+
## Documentation applicable to all interop
4+
5+
- [3 Layers in Dart Interop](interop-layers.md)
6+
7+
## Guides
8+
9+
- [C interop using dart:ffi](https://dart.dev/interop/c-interop) and the related
10+
pages about interop with other languages.
11+
- [Flutter platform integration and native
12+
interop](https://docs.flutter.dev/platform-integration) and the nested pages
13+
related to binding to native code.
14+
- [Build and link hooks](https://dart.dev/tools/hooks).
15+
16+
## Libraries and Packages
17+
18+
- [dart:ffi API reference](https://api.dart.dev/stable/dart-ffi/dart-ffi-library.html)
19+
- Each package in this repository contains its own documentation in its respective `README.md` file.

doc/interop-layers.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# 3 Layers in Dart Interop
2+
3+
Dart native interop can be structured into three layers:
4+
* Low level interop
5+
* Dart-y API
6+
* SDK-tailoring
7+
8+
## Layer 1: Low level interop
9+
10+
The goal of this layer is to provide a no-compromise, high-performance layer to
11+
make non-Dart APIs and libraries accessible from Dart. This layer is designed to
12+
be unopinionated, allowing threading, data transfer, and isolate life cycle to
13+
be built upon it. The APIs provided and generated are very thin Dart wrappers
14+
around the native APIs. They favor zero-cost abstractions such as [extension types][extension-types].
15+
While using this layer directly offers the most possibilities, it can lead to
16+
writing creole[^1] and presents footguns regarding memory management, threading, and
17+
the [isolate and VM life cycle][isolate-lifecycle].
18+
19+
**Technologies in this layer:**
20+
* Low-level SDK libraries for calling native code, such as [`dart:ffi`][dart-ffi] and
21+
[`dart:js_interop`][dart-js-interop].
22+
* Code generators such as [FFIgen][ffigen], [JNIgen][jnigen], and [web_generator][web-generator].
23+
24+
**Design principles for tech in this layer:**
25+
* Performance comes first, usability second.
26+
* It is either implemented as a compiler backend or as a code generator built on
27+
top of one.
28+
* Zero-configuration should be used if possible. The generator technologies do
29+
not know how their code will be used, so it's preferable to generate code that
30+
permits multiple usage patterns.
31+
32+
## Layer 2: Dart-y API
33+
34+
The objective of this layer is to offer a Dart-y API that bridges the impedance
35+
mismatch between Dart and the target language. Technologies in this layer are
36+
opinionated and may make domain-specific choices about value conversions
37+
(shallow or deep), concurrency models, etc.. They might sacrifice performance
38+
for improved usability and may provide adapters for implementing Dart types such
39+
as `Map` and `List`.
40+
41+
**Technologies in this layer:**
42+
* Hand-written Dart wrappers around a layer 1 API for C libraries, such as
43+
[SQLite3][sqlite3].
44+
* [Pigeon][pigeon], which decides on a full serialization and concurrency model.
45+
46+
**Design principles for tech in this layer:**
47+
* APIs should have the feel of Dart APIs. No layer 1 types should be exposed,
48+
and [Effective Dart][effective-dart] guidelines should be followed.
49+
* Users should not need to worry about the underlying native code. [Native
50+
finalizers][native-finalizers] should be used to free resources.
51+
* APIs should be structured to work with Dart's threading and isolate life
52+
cycle.
53+
* This layer is typically hand-crafted or built with a generator that has a high
54+
degree of configuration fidelity.
55+
* If different platforms offer non-identical feature sets, the preference is to
56+
publish platform-specific Dart APIs as packages and then build a
57+
platform-agnostic package on top of them.
58+
59+
## Layer 3: SDK-tailoring (optional)
60+
61+
This layer's purpose is to provide integration with specific SDKs built on Dart.
62+
This layer is optional. If a solution can be provided as a layer 2 solution, it
63+
should be, as this makes it reusable across multiple SDKs.
64+
65+
**Technologies in this layer:**
66+
* [Flutter Plugin API][flutter-plugin-api]: Provides access to Flutter-defined elements such as [App
67+
lifecycle][app-lifecycle], [Android Context][android-context], etc.
68+
* [Flutter Plugins][flutter-plugins]: These can, for example, hide the Android Context from the API
69+
they expose to a Dart developer.
70+
71+
## Cross-layer design principles
72+
73+
Layer 2 solutions have the option to provide "native escape hatches" to layer 1.
74+
This allows layer 1 to give immediate access to new OS APIs while layer 2 is
75+
being updated.
76+
77+
[^1]: A "creole" language, in this context, refers to code that is technically
78+
Dart but is written using the objects and patterns of the underlying native
79+
language (e.g., Objective-C). This creates a "mixed" language with its own
80+
learning curve and challenges, particularly around memory management and
81+
concurrency.
82+
83+
[android-context]: https://developer.android.com/reference/android/content/Context
84+
[app-lifecycle]: https://api.flutter.dev/flutter/widgets/AppLifecycleListener-class.html
85+
[dart-ffi]: https://api.dart.dev/dart-ffi/
86+
[dart-js-interop]: https://api.dart.dev/dart-js_interop/
87+
[effective-dart]: https://dart.dev/guides/language/effective-dart
88+
[extension-types]: https://dart.dev/language/extension-types
89+
[ffigen]: ../pkgs/ffigen/
90+
[flutter-plugin-api]: https://docs.flutter.dev/packages-and-plugins/developing-packages
91+
[flutter-plugins]: https://docs.flutter.dev/packages-and-plugins/using-packages
92+
[isolate-lifecycle]: https://dart.dev/language/concurrency
93+
[jnigen]: ../pkgs/jnigen/
94+
[native-finalizers]: https://api.dart.dev/dart-ffi/NativeFinalizer-class.html
95+
[pigeon]: https://pub.dev/packages/pigeon
96+
[sqlite3]: https://pub.dev/packages/sqlite3
97+
[web-generator]: https://github.com/dart-lang/web/tree/main/web_generator

0 commit comments

Comments
 (0)