首页
/ Flutter 仓库深度解析:flutter_analyzer_plugin 自定义静态分析插件的配置、规则体系与规则开发实战

Flutter 仓库深度解析:flutter_analyzer_plugin 自定义静态分析插件的配置、规则体系与规则开发实战

2026-09-06 20:11:02作者:霍妲思

本篇围绕 Flutter 仓库中的 dev/flutter_analyzer_plugin/README.md 展开,系统介绍 flutter_analyzer_plugin 这个自定义 Dart Analysis Server 插件的定位与配置方式、其 12 条内置静态分析规则的完整规格与设计动机,以及如何基于 package:analyzer 的 AnalysisRule API 从零实现、注册、测试一条新规则。读完本文,你能够在 IDE(VS Code、Android Studio)与 flutter analyze CLI 中获得实时、原生的 Flutter 仓库专属静态诊断,并具备为该插件新增自定义规则并编写单元测试的完整能力。

一、插件定位与整体架构

dev/flutter_analyzer_plugin 是一个专门为 flutter/flutter 仓库定制的 Dart Analysis Server 插件,提供面向该仓库的自定义静态分析规则与 lint。它的核心价值在于:替代过去基于正则表达式和手工 AST 遍历的脚本检查(原先位于 dev/bots/analyze.dart 中的验证逻辑),将这些检查升级为原生的、实时的分析器诊断,直接集成到开发者的 IDE 和 flutter analyze 命令行工具中。

从源码结构看,插件由三部分组成(见 dev/flutter_analyzer_plugin/lib/main.dart):

插件的依赖约束(见 dev/flutter_analyzer_plugin/pubspec.yaml):运行需要 Dart SDK ^3.7.0,依赖 analysis_server_plugin 与固定版本 analyzer: 14.3.0;测试侧依赖 analyzer_testingtest_reflective_loader

分析配置文件的层级结构

Flutter 仓库的 analysis_options.yaml 采用三级层次结构,插件配置位于该层次的最外层:

  • 基础选项文件 analysis_options_common.yaml:定义跨仓库、跨子树共享的基线 lint 规则与分析器设置;
  • analysis_options.yaml:仓库根目录入口,包含公共基线选项并配置仓库级分析器行为与排除项;
  • 子包 analysis_options.yamlpackages/flutter/libpackages/flutter/testpackages/flutter_toolsdev/ 等包和目录各自 include 父级选项,并通过 plugins: 块按相应的相对目录深度加载 flutter_analyzer_plugin

例如 dev/analysis_options.yaml 以深度 1 的路径加载插件,同时通过 dependency_overrides 固定了 analysis_server_plugin: ^0.3.22

include: ../analysis_options.yaml

plugins:
  flutter_analyzer_plugin:
    path: flutter_analyzer_plugin
  dependency_overrides:
    analysis_server_plugin: ^0.3.22

二、插件配置:加载、激活与多仓路径解析

加载插件

要在某个包或目录的 analysis_options.yaml 中加载 flutter_analyzer_plugin,在 plugins: 段落下添加插件条目:

plugins:
  flutter_analyzer_plugin:
    path: ../../dev/flutter_analyzer_plugin

Monorepo 路径解析(目录深度对照表)

分析器要求所有引用 flutter_analyzer_pluginanalysis_options.yaml 解析到磁盘上完全相同的规范目录路径,相对路径必须正确反映目录嵌套深度:

包 / 目录深度 示例 配置的插件路径
深度 1 dev/ path: flutter_analyzer_plugin
深度 2 packages/flutter_tools/packages/flutter_test/ path: ../../dev/flutter_analyzer_plugin
深度 3 packages/flutter/lib/packages/flutter/test/ path: ../../../dev/flutter_analyzer_plugin

仓库中确实存在深度 2 与深度 3 的实例:packages/flutter_tools/analysis_options.yamlpackages/flutter/lib/analysis_options.yamlpackages/flutter/test/analysis_options.yaml 等,均可作为真实参照。

规则激活与显式退出(Opt-Out)

README 指出:所有在 flutter_analyzer_plugin 中注册的 warning 与 error 规则,在插件加载后默认启用。包或目录可以通过 diagnostics: 段显式退出(或重新启用)特定规则:

plugins:
  flutter_analyzer_plugin:
    path: ../../dev/flutter_analyzer_plugin
    diagnostics:
      # 如有必要可退出特定规则
      no_stopwatches: false
      avoid_future_catch_error: false

仓库中已有三处真实使用了 diagnostics: 段做按包开关:packages/flutter/lib/analysis_options.yamlpackages/flutter/test/analysis_options.yamlpackages/flutter_tools/analysis_options.yaml

main.dart 的源码注释看,注册入口还区分了两类规则的适用面:一类是"仓库级 warning 规则(从 dev/bots/analyze.dart 的验证逻辑迁移而来)",通过 registerWarningRule 注册;另一类是"包级 lint 规则(通过 analysis_options.yamldiagnostics: 段按需开启)",通过 registerLintRule 注册。理解这一区分有助于正确判断某条规则在哪个目录范围内生效。

源码级细节:只读区域的统一豁免

值得注意的一个实现细节是:仓库内所有规则实际都继承自 FlutterAnalysisRule(而非直接继承 AnalysisRule)。该基类在 flutter_analysis_rule.dart 中覆写了 registerNodeProcessors,在文件路径命中"只读区域"时直接跳过注册——即 Material 和 Cupertino 的实现与测试目录/material//cupertino/src/materialtest/material 等)对所有 Flutter 自定义规则免疫;同时通过 /home/test 前缀识别 package:analyzer_testing 的内存测试文件,避免误判。这意味着新增规则时应覆写的是 registerCustomNodeProcessors,让基类统一处理豁免逻辑。

三、规则参考总表

规则名 严重级别 默认 作用域 概述
avoid_future_catch_error ERROR 启用 全局 禁止在 Future 上调用 .catchError / .onError(应使用 try/catch)。
no_double_clamp ERROR 启用 全局 禁止 double.clamp / num.clamp(应使用 clampDouble)。
no_stopwatches ERROR 启用 全局 禁止直接实例化 Stopwatch(应使用 clock.stopwatch())。
deprecation_syntax ERROR 启用 全局 强制 @Deprecated 注解使用标准多行格式。
no_runtimetype_in_tostring ERROR 启用 全局 禁止在 toString() 中调用 runtimeType.toString()
no_sync_async_star ERROR 启用 全局 禁止无解释性注释的 sync*async* 方法。
no_bad_imports_in_flutter ERROR 启用 packages/flutter/lib/src/ 强制分层依赖、禁止循环导入,禁止在 foundation 之外导入 meta。
protect_public_state_subtypes ERROR 启用 packages/flutter 要求公开 State 类中被覆写的生命周期方法标注 @protected
render_box_intrinsics ERROR 启用 packages/flutter/lib/src/rendering/ 禁止直接调用 compute* 固有尺寸方法(应使用 get*)。
null_initialized_debug_expensive_fields ERROR 启用 packages/flutter 要求 @_debugOnly 字段通过 kDebugMode ? <value> : null; 条件初始化。
skip_test_comments ERROR 启用 测试文件 要求被跳过的测试附带理由注释(如 // [intended] 或 issue 链接)。
integration_test_timeouts ERROR 启用 test_driver/ 文件 要求 test_driver/ 下的集成测试设置 timeout: Timeout.none

以下逐条给出完整规格。

通用与全局规则

avoid_future_catch_error

  • 严重级别ERROR作用域:全局(插件启用范围内的所有 Dart 文件)
  • 说明:禁止在 Future 实例上调用 .catchError().onError()
  • 动机Future.catchErrorFuture.onError 不具备类型安全性,可能绕过强类型检查或返回意外的 dynamic 类型,引入隐蔽的运行时缺陷。应使用标准的异步 try/catch 块配合 await,或将 onError 直接传入 Future.then()
  • 参考:Dart SDK Issue #51248
// BAD:
future.catchError((Object error) {
  handleError(error);
});

// GOOD:
try {
  await future;
} catch (error) {
  handleError(error);
}

no_double_clamp

  • 严重级别ERROR作用域:全局
  • 说明:禁止直接调用或 tear-off double.clamp()num.clamp()
  • 动机:在 web 与 VM 运行时上,对数字调用 double.clamp 会产生装箱/拆箱开销;num.clamp 的 tear-off 还会丢失整数类型提升。使用 dart:uipackage:flutter/foundation.dart 中的 clampDouble(val, min, max) 可避免运行时开销并保留原生浮点性能。
  • 参考:Flutter PR #103559、Flutter Issue #103917
// BAD:
final double clamped = value.clamp(0.0, 1.0);

// GOOD:
final double clamped = clampDouble(value, 0.0, 1.0);

从实现看,no_double_clamp.dart 通过 SimpleAstVisitorvisitSimpleIdentifier 同时覆盖方法调用与 tear-off(PropertyAccess/PrefixedIdentifier 形式)两种命中形态。

no_stopwatches

  • 严重级别ERROR作用域:全局
  • 说明:禁止直接实例化 Stopwatch(),或调用任何返回 Stopwatch 的函数。
  • 动机:直接使用 Stopwatch 依赖宿主机系统时钟,在单元测试与 widget 测试中会与 FakeAsync 失去同步,导致非确定性的测试抖动。代码应改用 package:clockclock.stopwatch()(它在测试期间会与 FakeAsync 绑定),或使用 dart:developer 的 timeline 事件做性能剖析。
  • 内联豁免:标准分析器忽略注释(// ignore: no_stopwatches)或遗留内联指令 // flutter_ignore: stopwatch (see analyze.dart)
// BAD:
final Stopwatch stopwatch = Stopwatch()..start();

// GOOD:
final Stopwatch stopwatch = clock.stopwatch()..start();

源码印证(no_stopwatches.dart):该规则注册了两个访问器——addConstructorNameaddSimpleIdentifier,分别拦截构造调用点与"返回 Stopwatch 的外部函数/构造 tear-off"引用;_implementsStopwatch 通过递归检查 allSupertypes 并配合 Map<ClassElement, bool> 缓存识别 Stopwatch 的子类(因此连外部包的 MyStopwatch 也会被拦截);遗留豁免注释则用正则 // flutter_ignore: .*stopwatch .*\(see analyze\.dart\) 匹配节点行尾文本。其测试 no_stopwatches_test.dart 还通过 PackageConfigFileBuildertest/package_mixins/external_stopwatches_mixin.dart 构造了"外部包"场景来验证跨库识别。

deprecation_syntax

  • 严重级别ERROR作用域:全局(所有库声明与公开 API)
  • 说明:强制 @Deprecated 注解采用标准多行字符串格式。
  • 动机:统一弃用消息格式,确保所有被弃用 API 都提供可执行的迁移指引、标明确切的弃用版本,并链接到 Flutter 弃用政策。
  • 内联豁免// ignore: deprecation_syntax// flutter_ignore: deprecation_syntax (see analyze.dart)
// BAD:
@Deprecated('Use newMethod instead')
void oldMethod() {}

// GOOD:
@Deprecated(
  'Use newMethod instead. '
  'This feature was deprecated after v3.18.0-0.1.pre.'
)
void oldMethod() {}

no_runtimetype_in_tostring

  • 严重级别ERROR作用域:全局(所有 toString() 实现)
  • 说明:禁止在 toString() 中求值 runtimeType.toString() 或插值 $runtimeType
  • 动机:调用 runtimeType.toString() 会阻碍编译器 tree-shaking 与死代码消除,在 release 构建中泄漏混淆后的符号名,并产生不必要的字符串分配开销。若确需类名反射用于调试诊断,必须包裹在 assert() 内或以 kDebugMode 守护。
// BAD:
@override
String toString() => '$runtimeType(value: $value)';

// GOOD:
@override
String toString() => 'MyClass(value: $value)';

// GOOD (Debug-only):
@override
String toString() {
  String? header;
  assert(() {
    header = '$runtimeType';
    return true;
  }());
  return '${header ?? 'MyClass'}(value: $value)';
}

no_sync_async_star

  • 严重级别ERROR作用域:全局(所有函数、方法与闭包)
  • 说明:禁止使用 sync*async* 生成器函数,除非附带解释性注释。
  • 动机:生成器函数在 Dart 中引入较重的状态机与迭代器分配,通常标准循环、集合或 StreamController 性能更好。确有必要使用生成器时,必须用注释说明理由。
  • 参考:Flutter 风格指南中的 "Avoid sync*/async*" 一节(docs/contributing/Style-guide-for-Flutter-repo.md)。
// BAD:
Iterable<int> countTo(int n) sync* {
  for (int i = 0; i < n; i++) yield i;
}

// GOOD:
// Uses sync* to lazily evaluate large datasets on demand.
Iterable<int> countTo(int n) sync* {
  for (int i = 0; i < n; i++) yield i;
}

框架与架构规则

no_bad_imports_in_flutter

  • 严重级别ERROR作用域packages/flutter/lib/src/
  • 说明:强制 Flutter 分层依赖体系,禁止循环或递归导入,强制 lib/*.dartlib/src/*/ 之间的一致性,并禁止在 foundation 之外导入 package:meta/meta.dart
  • 动机:Flutter 遵循严格的分层架构: foundation -> animation -> painting -> gestures -> rendering -> widgets -> material / cupertino 低层绝不允许导入高层;循环的分层导入以及绕过 foundation 的直接 package:meta 导入(必须经 foundation 再导出)都会破坏模块性与包封装。
// BAD (in packages/flutter/lib/src/painting/):
import 'package:flutter/src/widgets/basic.dart'; // Upward layer import
import 'package:meta/meta.dart'; // Meta imported outside foundation

// GOOD (in packages/flutter/lib/src/painting/):
import 'package:flutter/foundation.dart';

protect_public_state_subtypes

  • 严重级别ERROR作用域packages/flutter(继承 State 的类)
  • 说明:要求公开类中继承 State 后覆写的生命周期方法标注 @protected
  • 动机:公开 State 子类中被覆写的生命周期方法(initStatebuilddisposesetStatedidUpdateWidgetdidChangeDependenciesactivatedeactivatereassembledebugFillProperties)会成为公共接口的一部分。添加 @protected 可阻止外部消费者直接调用内部生命周期逻辑。
// BAD:
class MyPublicWidgetState extends State<MyPublicWidget> {
  @override
  void initState() {
    super.initState();
  }
}

// GOOD:
class MyPublicWidgetState extends State<MyPublicWidget> {
  @override
  @protected
  void initState() {
    super.initState();
  }
}

render_box_intrinsics

  • 严重级别ERROR作用域packages/flutter/lib/src/rendering/RenderBox 子类)
  • 说明:禁止在 RenderBox 子类中直接调用固有尺寸计算(compute*)方法,要求改调对应的带缓存的 get* 方法。
  • 动机compute* 方法执行的是原始的、无缓存的几何求值。直接调用会绕过 RenderBox 的固有尺寸缓存,可能导致布局重算时间指数级增长(O(2N)O(2^N) 量级的布局遍次)。
无缓存方法(禁止) 带缓存替代(要求)
computeDryBaseline getDryBaseline
computeDryLayout getDryLayout
computeDistanceToActualBaseline getDistanceToBaselinegetDistanceToActualBaseline
computeMaxIntrinsicHeight getMaxIntrinsicHeight
computeMinIntrinsicHeight getMinIntrinsicHeight
computeMaxIntrinsicWidth getMaxIntrinsicWidth
computeMinIntrinsicWidth getMinIntrinsicWidth
// BAD (inside a RenderBox subclass):
final double width = child.computeMinIntrinsicWidth(height);

// GOOD:
final double width = child.getMinIntrinsicWidth(height);

null_initialized_debug_expensive_fields

  • 严重级别ERROR作用域packages/flutter
  • 说明:要求所有标注 @_debugOnly 的字段都通过 kDebugMode ? <value> : null; 条件初始化。
  • 动机:昂贵的诊断对象与调试追踪器不应在 profile 与 release 构建中分配堆内存或执行昂贵的初始化逻辑。以 kDebugMode ? <value> : null 初始化可让编译器与 tree-shaker 在 release 构建中同时消除该字段及其初始化器。
// BAD:
@_debugOnly
List<StackTrace> _creationStackTraces = <StackTrace>[];

// GOOD:
@_debugOnly
List<StackTrace>? _creationStackTraces = kDebugMode ? <StackTrace>[] : null;

测试规则

skip_test_comments

  • 严重级别ERROR作用域:仓库所有测试文件(*_test.dart
  • 说明:要求所有被跳过的测试(test(..., skip: ...))都包含行内理由注释,解释跳过原因。
  • 动机:测试不应被静默跳过、也不应无限期搁置而无跟踪。每个 skip: 参数必须提供有意标记(如 // [intended])或引用活跃的 GitHub 跟踪 issue 链接。
// BAD:
test('flaky network test', () {}, skip: true);

// GOOD:
test('flaky network test', () {}, skip: true); // https://github.com/flutter/flutter/issues/<issue-number>

// GOOD:
test('platform specific test', () {},
  // [intended] Not supported on Windows.
  skip: !Platform.isLinux,
);

integration_test_timeouts

  • 严重级别ERROR作用域test_driver/ 下的集成测试套件
  • 说明:要求 test_driver/ 下的集成测试显式设置 timeout: Timeout.none
  • 动机:宿主驱动的集成测试与 devicelab 测试涉及应用启动、模拟器交互与金截图比对,常常超出 30 秒的标准单元测试超时。显式指定 timeout: Timeout.none 可防止高负载 CI 测试机上的误报超时失败。
// BAD (in test_driver/app_test.dart):
void main() {
  test('starts app', () async {
    ...
  });
}

// GOOD (in test_driver/app_test.dart):
void main() {
  test('starts app', () async {
    ...
  }, timeout: Timeout.none);
}

四、编写与测试自定义规则

1. 实现一条 AnalysisRule

自定义规则基于 package:analyzer/analysis_rule/analysis_rule.dartAnalysisRule。README 给出的骨架如下:

  1. 将新规则放入 dev/flutter_analyzer_plugin/lib/src/rules/<rule_name>.dart
  2. 定义 LintCode,指明诊断名、消息、修正建议与 DiagnosticSeverity
  3. 实现 registerNodeProcessors,把 AST 访问器挂到感兴趣的节点类型上。
import 'package:analyzer/analysis_rule/analysis_rule.dart';
import 'package:analyzer/analysis_rule/rule_context.dart';
import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/error/error.dart';

class MyCustomRule extends AnalysisRule {
  MyCustomRule()
    : super(
        name: code.name,
        description: 'Verify adherence to Flutter repository practices.',
      );

  static const LintCode code = LintCode(
    'my_custom_rule',
    'Explanation of why the pattern is disallowed.',
    correctionMessage: 'Recommended fix or alternatives.',
    severity: DiagnosticSeverity.ERROR,
  );

  @override
  DiagnosticCode get diagnosticCode => code;

  @override
  void registerNodeProcessors(RuleVisitorRegistry registry, RuleContext context) {
    final visitor = _Visitor(this, context);
    registry.addMethodInvocation(this, visitor);
  }
}

class _Visitor extends SimpleAstVisitor<void> {
  _Visitor(this.rule, this.context);

  final AnalysisRule rule;
  final RuleContext context;

  @override
  void visitMethodInvocation(MethodInvocation node) {
    if (/* condition */ false) {
      rule.reportAtNode(node);
    }
  }
}

结合仓库现状的一个实践要点:现有规则普遍改为继承 FlutterAnalysisRule 并覆写 registerCustomNodeProcessors,从而自动获得 Material/Cupertino 只读区域豁免;新增规则时建议沿用这一模式,保持与既有 16 个规则文件的风格一致。

2. 注册规则

dev/flutter_analyzer_plugin/lib/main.dart 中注册规则。骨架如下:

import 'package:analysis_server_plugin/plugin.dart';
import 'package:analysis_server_plugin/registry.dart';
import 'src/rules/my_custom_rule.dart';

class FlutterAnalyzerPlugin extends Plugin {
  @override
  void register(PluginRegistry registry) {
    registry
      ..registerWarningRule(MyCustomRule());
  }

  @override
  String get name => 'flutter/flutter analyzer plugin';
}

实际仓库中的 register() 方法区分 registerWarningRule(仓库级规则)与 registerLintRule(包级、可通过 diagnostics: 开关的规则)两种注册方式,新规则应按其适用面选择其一。

3. 编写单元测试

规则必须使用 package:analyzer_testing 编写反射式测试:

  1. dev/flutter_analyzer_plugin/test/<rule_name>_test.dart 创建测试文件;
  2. 继承 AnalysisRuleTest 并为测试类添加 @reflectiveTest 注解;
  3. setUp() 中通过 Registry.ruleRegistry.registerWarningRule(...) 注册规则,并用 assertDiagnostics() 定义用例。
import 'package:analyzer/src/lint/registry.dart';
import 'package:analyzer_testing/analysis_rule/analysis_rule.dart';
import 'package:flutter_analyzer_plugin/src/rules/my_custom_rule.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

@reflectiveTest
class MyCustomRuleTest extends AnalysisRuleTest {
  @override
  void setUp() {
    // Registers the custom AnalysisRule with the test registry prior to running tests.
    Registry.ruleRegistry.registerWarningRule(MyCustomRule());
    super.setUp();
  }

  @override
  String get analysisRule => MyCustomRule.code.name;

  Future<void> test_disallowedPattern() async {
    await assertDiagnostics(
      '''
void test() {
  badFunction();
}
''',
      <ExpectedDiagnostic>[
        lint(16, 13),
      ],
    );
  }

  Future<void> test_allowedPattern() async {
    await assertNoDiagnostics(
      '''
void test() {
  goodFunction();
}
''',
    );
  }
}

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(MyCustomRuleTest);
  });
}

从真实测试(如 no_stopwatches_test.dart)看,若规则需要识别"外部包"类型(例如返回 Stopwatch 的外部库),还会借助 PackageConfigFileBuildertest/package_mixins/ 下的 mixin 构造虚拟包配置;这些 mixin(external_stopwatches_mixin.dartmeta_mixin.dartwidgets_mixin.dart)正是为跨包场景准备的公共设施。

4. 运行单元测试

由于测试使用了 test_reflective_loader(依赖 dart:mirrors),测试必须用独立 Dart VM SDK 执行,而不能使用 flutter test

# 1. 解析插件依赖
cd dev/flutter_analyzer_plugin
../../bin/flutter pub get

# 2. 使用 Dart SDK 运行单元测试
../../bin/cache/dart-sdk/bin/dart test test/my_custom_rule_test.dart

5. 最佳实践与迁移建议

  • 按文件路径过滤:通过 context.currentUnit!.file.path 获取当前文件路径,而不是依赖 declaredElement(后者在 AST 节点注册期间可能尚未填充)。
  • 检查泛型基类:判断某个类是否继承泛型基类(如 State<T>)时,应缓存 InterfaceElementsuperType.element)而非 DartType,这样才能让子类型检查在不同类型实参(State<WidgetA>State<WidgetB>)下依然成立。no_stopwatches.dart 中对 Stopwatch 子类的递归判断配合 Map<ClassElement, bool> 缓存,正是这一模式的实例。
  • 验证编译:提交插件改动前,确认插件能干净编译并通过分析:
bin/cache/dart-sdk/bin/dart analyze --fatal-infos dev/flutter_analyzer_plugin

五、小结:从脚本检查到实时诊断

flutter_analyzer_plugin 把 Flutter 仓库多年沉淀在 CI 脚本里的架构约束(分层导入、State 生命周期保护、渲染层缓存纪律)与性能/测试卫生约定(禁用 Stopwatch 直建、clampDouble、跳过测试理由等)统一收敛到 Dart Analysis Server 插件体系中。对仓库贡献者而言,掌握 plugins:/diagnostics: 配置与目录深度解析,可以在本地 IDE 中获得与 CI 一致的错误级诊断;对希望扩展检查逻辑的开发者,FlutterAnalysisRule 基类 + analyzer_testing 反射式测试框架提供了从规则实现、注册到单元测试验证的完整闭环,且全部测试均可在 dev/flutter_analyzer_plugin/test/ 目录下逐条对照参考。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
898
5.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
921
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.8 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
391