{"id":32429400,"url":"https://github.com/mellowco/test_flutter_demo","last_synced_at":"2026-06-18T16:31:16.473Z","repository":{"id":264512876,"uuid":"613171202","full_name":"MellowCo/test_flutter_demo","owner":"MellowCo","description":" flutter 开发 打包流程","archived":false,"fork":false,"pushed_at":"2023-03-13T03:22:09.000Z","size":2552,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-25T20:52:32.470Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MellowCo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-13T03:14:45.000Z","updated_at":"2024-10-08T03:43:48.000Z","dependencies_parsed_at":"2024-11-24T20:17:12.930Z","dependency_job_id":"1ee40ea5-fef0-4d2a-b3da-388eb2a63a48","html_url":"https://github.com/MellowCo/test_flutter_demo","commit_stats":null,"previous_names":["mellowco/test_flutter_demo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MellowCo/test_flutter_demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MellowCo%2Ftest_flutter_demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MellowCo%2Ftest_flutter_demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MellowCo%2Ftest_flutter_demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MellowCo%2Ftest_flutter_demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MellowCo","download_url":"https://codeload.github.com/MellowCo/test_flutter_demo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MellowCo%2Ftest_flutter_demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34499403,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2025-10-25T20:52:09.513Z","updated_at":"2026-06-18T16:31:16.451Z","avatar_url":"https://github.com/MellowCo.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Flutter 简介\r\n\r\nFlutter 是 Google 推出并开源的移动应用开发框架，主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App，一套代码同时运行在  iOS、Android、Web、Windows、macOS、Linux。\r\n\r\n### 主流的跨端框架\r\n\r\n| 技术类型              | UI渲染方式      | 框架代表       |\r\n| --------------------- | --------------- | -------------- |\r\n| H5 + 原生             | WebView渲染     | uniapp，海马汇 |\r\n| JavaScript + 原生渲染 | 原生控件渲染    | RN、Weex       |\r\n| 自绘UI + 原生         | 调用系统API渲染 | Flutter        |\r\n\r\n\r\n\r\n---\r\n\r\n### H5 + 原生\r\n\r\nH5代码是运行在 WebView 中，而 WebView 实质上就是一个浏览器内核，其 JavaScript 依然运行在一个权限受限的沙箱中，所以对于大多数系统能力都没有访问权限，如无法访问文件系统、不能使用蓝牙等。\r\n\r\n混合应用的优点是动态内容是 H5，Web 技术栈，社区及资源丰富，缺点是性能体验不佳，对于复杂用户界面或动画，WebView 有时会不堪重任。\r\n\r\n\r\n\r\n---\r\n\r\n### JavaScript + 原生渲染\r\n\r\nReact中虚拟 DOM 最终会映射为浏览器 DOM 树，而 RN 中虚拟 DOM会通过 JavaScriptCore 映射为原生控件。\r\n\r\nJavaScriptCore 是一个JavaScript解释器，它在React Native中主要有两个作用：\r\n\r\n1. 为 JavaScript 提供运行环境。\r\n2. 是 JavaScript 与原生应用之间通信的桥梁，作用和 JsBridge 一样，事实上，在 iOS 中，很多 JsBridge 的实现都是基于 JavaScriptCore 。\r\n\r\n而 RN 中将虚拟 DOM 映射为原生控件的过程主要分两步：\r\n\r\n1. 布局消息传递； 将虚拟 DOM 布局信息传递给原生；\r\n2. 原生根据布局信息通过对应的原生控件渲染；\r\n\r\n主要优点如下：\t\r\n\r\n1. 采用 Web 开发技术栈，社区庞大、上手快、开发成本相对较低。\r\n2. 原生渲染，性能相比 H5 提高很多。\r\n3. 动态化较好，支持热更新。\r\n\r\n不足：\r\n\r\n1. 渲染时需要 JavaScript 和原生之间通信，在有些场景如拖动可能会因为通信频繁导致卡顿。\r\n2. JavaScript 为脚本语言，执行时需要解释执行 （这种执行方式通常称为 JIT，即 Just In Time，指在执行时实时生成机器码），执行效率和编译类语言（编译类语言的执行方式为 AOT ，即 Ahead Of Time，指在代码执行前已经将源码进行了预处理，这种预处理通常情况下是将源码编译为机器码或某种中间码）仍有差距。\r\n3. 由于渲染依赖原生控件，不同平台的控件需要单独维护，并且当系统更新时，社区控件可能会滞后；除此之外，其控件系统也会受到原生UI系统限制，例如，在 Android 中，手势冲突消歧规则是固定的，这在使用不同人写的控件嵌套时，手势冲突问题将会变得非常棘手。这就会导致，如果需要自定义原生渲染组件时，开发和维护成本过高。\r\n\r\n\r\n\r\n---\r\n\r\n### 自绘UI + 原生\r\n\r\n1. Flutter 使用自己的渲染引擎来绘制 UI ,不需要像 RN 那样要在 JavaScript 和 Native 之间通信，解决卡顿的问题\r\n2. **基于 JIT 的快速开发周期**：Flutter 在开发阶段采用，采用 JIT 模式，这样就避免了每次改动都要进行编译，极大的节省了开发时间；**基于 AOT 的发布包**: Flutter 在发布时可以通过 AOT 生成高效的机器码以保证应用性能。而 JavaScript 则不具有这个能力。\r\n3. Flutter 与用于构建移动应用程序的其他大多数框架不同，因为 Flutter 既不使用 WebView，也不使用操作系统的原生控件。 相反，Flutter 使用自己的高性能渲染引擎来绘制 Widget（组件）。这样不仅可以保证在 Android 和iOS 上 UI 的一致性，也可以避免对原生控件依赖而带来的限制及高昂的维护成本。\r\n\r\n\r\n\r\n---\r\n\r\n## 开发环境\r\n\r\n1. #### flutter sdk\r\n\r\n\u003e [sdk下载地址](https://flutter.cn/docs/get-started/install/windows)，并设置环境变量\r\n\u003e\r\n\u003e 运行 `flutter --version`,查看版本号\r\n\r\n2. android环境\r\n\r\n\u003e 安装 [Android Studio](https://developer.android.google.cn/studio/)，通过其安装最新的Android SDK、Android SDK平台工具和Android SDK构建工具\r\n\r\n3. ##### flutter doctor\r\n\r\n\u003e 可以使用 `flutter doctor` 命令检查你的环境并在命令行窗口中显示报告。\r\n\r\n```shell\r\n❯ flutter doctor\r\n\r\nFlutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!\r\nDoctor summary (to see all details, run flutter doctor -v):\r\n[✓] Flutter (Channel stable, 3.7.3, on Microsoft Windows [版本 10.0.22621.1265], locale zh-CN)\r\n[✗] Windows Version (Unable to confirm if installed Windows version is 10 or greater)\r\n[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)\r\n[✓] Chrome - develop for the web\r\n[✓] Visual Studio - develop for Windows (Visual Studio 生成工具 2019 16.11.11)\r\n[!] Android Studio (version 2020.3)\r\n    ✗ Unable to determine bundled Java version.\r\n[!] Android Studio (version 2022.1)\r\n    ✗ Unable to find bundled Java version.\r\n[✓] Connected device (3 available)\r\n[✓] HTTP Host Availability\r\n\r\n! Doctor found issues in 3 categories.\r\n```\r\n\r\n4. 开发ide\r\n\r\n\u003e `android studio` 和 `vscode` 安装 `Flutter` 和 `Dart` 2个插件\r\n\r\n\r\n\r\n---\r\n\r\n## dart 语言\r\n\r\n\u003e [Dart语言简介](https://book.flutterchina.club/chapter1/dart.html#_1-4-1-变量声明)\r\n\r\n\r\n\r\n---\r\n\r\n## flutter 应用\r\n\r\n\u003e 新建项目\r\n\r\n```shell\r\nflutter create --platforms ios,android --org com.licl -t app -i swift -a java demo\r\n```\r\n\r\n\r\n\u003e 整个 `flutter` 项目的启动方法\r\n```dart\r\nvoid main() {\r\n  runApp(const MyApp());\r\n}\r\n```\r\n\r\n### Scaffold\r\n\r\n`Scaffold` 是一个路由页的骨架，包含导航栏、抽屉菜单(Drawer)以及底部 Tab 导航菜单等，用于快速创建一个页面。\r\n\r\n| bottomNavigationBar  | 底部导航   |\r\n| -------------------- | ---------- |\r\n| floatingActionButton | 浮动按钮   |\r\n| body                 | 页面主体   |\r\n| appBar               | 顶部导航栏 |\r\n\r\n\r\n#### 浮动按钮\r\n\r\n```dart\r\nclass _MyHomePageState extends State\u003cMyHomePage\u003e {\r\n  int _counter = 0;\r\n\r\n  void _incrementCounter() {\r\n    setState(() {\r\n      _counter++;\r\n    });\r\n  }\r\n\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return Scaffold(\r\n      // 浮动按钮\r\n      floatingActionButton: FloatingActionButton(\r\n        // 点击事件\r\n        onPressed: _incrementCounter,\r\n        // 提示\r\n        tooltip: 'Increment',\r\n        // 图标\r\n        child: const Icon(Icons.add),\r\n      ),\r\n    );\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n\r\n\r\n\r\n#### 导航栏\r\n\r\n```dart\r\nclass _MyHomePageState extends State\u003cMyHomePage\u003e {\r\n\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return Scaffold(\r\n      // 顶部导航栏\r\n      appBar: AppBar(\r\n        // 标题\r\n        title: Text(widget.title),\r\n        //导航栏右侧菜单\r\n        actions: \u003cWidget\u003e[\r\n          IconButton(\r\n              icon: const Icon(Icons.share),\r\n              onPressed: () {\r\n                print(\"点击了分享\");\r\n              }),\r\n        ],\r\n      ),\r\n    );\r\n  }\r\n}\r\n```\r\n\r\n\r\n\r\n---\r\n\r\n#### 底部导航\r\n\r\n```dart\r\nclass _MyHomePageState extends State\u003cMyHomePage\u003e {\r\n  // 当前选中的底部导航栏索引\r\n  int _selectedIndex = 1;\r\n\r\n  // 底部导航栏点击事件\r\n  void _onItemTapped(int index) {\r\n    setState(() {\r\n      _selectedIndex = index;\r\n    });\r\n  }\r\n\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return Scaffold(\r\n      // 底部导航\r\n      bottomNavigationBar: BottomNavigationBar(\r\n        items: const \u003cBottomNavigationBarItem\u003e[\r\n          BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),\r\n          BottomNavigationBarItem(\r\n              icon: Icon(Icons.business), label: 'Business'),\r\n          BottomNavigationBarItem(icon: Icon(Icons.school), label: 'School'),\r\n        ],\r\n        currentIndex: _selectedIndex,\r\n        fixedColor: Colors.blue,\r\n        onTap: _onItemTapped,\r\n      ),\r\n    );\r\n  }\r\n}\r\n```\r\n\r\n\r\n\r\n---\r\n\r\n\r\n#### 抽屉菜单\r\n\r\n```dart\r\nclass MyDrawer extends StatelessWidget {\r\n  const MyDrawer({\r\n    Key? key,\r\n  }) : super(key: key);\r\n\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return Drawer(\r\n      child: MediaQuery.removePadding(\r\n        context: context,\r\n        removeTop: true,\r\n        child: Column(\r\n          crossAxisAlignment: CrossAxisAlignment.start,\r\n          children: \u003cWidget\u003e[\r\n            Expanded(\r\n              child: ListView(\r\n                children: const \u003cWidget\u003e[\r\n                  ListTile(\r\n                    leading: Icon(Icons.add),\r\n                    title: Text('Add account'),\r\n                  ),\r\n                  ListTile(\r\n                    leading: Icon(Icons.settings),\r\n                    title: Text('Manage accounts'),\r\n                  ),\r\n                ],\r\n              ),\r\n            ),\r\n          ],\r\n        ),\r\n      ),\r\n    );\r\n  }\r\n}\r\n\r\n\r\nclass _MyHomePageState extends State\u003cMyHomePage\u003e {\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return Scaffold(\r\n      // 抽屉菜单\r\n      drawer: const MyDrawer(),\r\n    );\r\n  }\r\n}\r\n```\r\n\r\n\r\n\r\n---\r\n\r\n### 路由跳转\r\n\r\n1. 新建`NewRoute`,`lib/pages/new-route.dart `\r\n\r\n```dart\r\nimport 'package:flutter/material.dart';\r\n\r\nclass NewRoute extends StatelessWidget {\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return Scaffold(\r\n      appBar: AppBar(\r\n        title: Text(\"New route\"),\r\n      ),\r\n      body: Center(\r\n        child: Text(\"This is new route\"),\r\n      ),\r\n    );\r\n  }\r\n}\r\n```\r\n\r\n2. `main.dart` 路由跳转\r\n\r\n```dart\r\nimport 'package:demo/pages/new-route.dart';\r\n\r\nElevatedButton(\r\n    onPressed: () {\r\n        Navigator.push(\r\n            context,\r\n            MaterialPageRoute(builder: (context) {\r\n                return const NewRoute();\r\n            }),\r\n        );\r\n    },\r\n    child: const Text(\"new page\")\r\n),\r\n```\r\n\r\n\r\n\r\n---\r\n\r\n### 路由传参\r\n\r\n\u003e 在 `class` 中新增 `id` 属性\r\n\r\n```dart\r\nimport 'package:flutter/material.dart';\r\n\r\nclass NewRoute extends StatelessWidget {\r\n  const NewRoute({super.key, required this.id});\r\n\r\n  final String id;\r\n\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return Scaffold(\r\n        appBar: AppBar(\r\n          title: const Text(\"New route\"),\r\n        ),\r\n        body: Center(\r\n          child: Column(\r\n            mainAxisAlignment: MainAxisAlignment.center,\r\n            children: \u003cWidget\u003e[\r\n              const Text(\"This is new route\"),\r\n              Text(\"id: $id\"),\r\n            ],\r\n          ),\r\n        ));\r\n  }\r\n}\r\n```\r\n\r\n\u003e 实例化时，传入 `id`\r\n\r\n```dart\r\nElevatedButton(\r\n    child: const Text(\"router\"),\r\n    onPressed: () {\r\n        Navigator.push(\r\n            context,\r\n            MaterialPageRoute(builder: (context) {\r\n                return const NewRoute(id: \"123\");\r\n            }),\r\n        );\r\n    },\r\n),\r\n```\r\n\r\n\r\n\r\n---\r\n\r\n### 常用组件\r\n\r\n[给 Web 开发者的 Flutter 指南](https://flutter.cn/docs/get-started/flutter-for/web-devs#styling-and-aligning-text)\r\n\r\n\r\n\r\n---\r\n\r\n### 调用sdk\r\n\r\nFlutter 本质上只是一个 UI 框架，运行在宿主平台之上，Flutter 本身是无法提供一些系统能力，比如使用蓝牙、相机、GPS等，\r\n\r\n因此要在 Flutter 中调用这些能力就必须需要编写对应插件和原生平台进行通信，\r\n\r\n[flutter官方插件](https://github.com/flutter/plugins)\r\n\r\n[flutter插件仓库](https://pub.flutter-io.cn/)\r\n\r\n\r\n\r\n1. 添加插件\r\n\r\n\u003e 在 `pubspec.yaml` 中,添加插件包\r\n\r\n```yaml\r\ndependencies:\r\n\t  image_picker: ^0.8.6+2\r\n```\r\n\r\n2. 导入并使用\r\n\r\n```dart\r\nimport 'package:image_picker/image_picker.dart';\r\n\r\nfinal ImagePicker _picker = ImagePicker();\r\n// Pick an image\r\nfinal XFile? image = await _picker.pickImage(source: ImageSource.gallery);\r\n```\r\n\r\n\r\n\r\n---\r\n\r\n## 开发调试\r\n\r\n\u003e vscode 按 `F1` 打开命令窗口，输入  `open devtools`\r\n\r\n\u003cimg src=\"assets/image-20230303114713201.png\" alt=\"image-20230303114713201\" style=\"zoom:50%;\" /\u003e\r\n\r\n\r\n\r\n\u003e 选择 `web browser`\r\n\r\n\u003cimg src=\"assets/image-20230303114820007.png\" alt=\"image-20230303114820007\" style=\"zoom:50%;\" /\u003e\r\n\r\n\u003e 调试窗口\r\n\r\n\u003cimg src=\"assets/image-20230303130643970.png\" alt=\"image-20230303130643970\" style=\"zoom: 33%;\" /\u003e\r\n\r\n\r\n\r\n\u003e [flutter inspecter](https://flutter.cn/docs/development/tools/devtools/inspector): 用于可视化和查看 widget 树\r\n\r\n\u003cimg src=\"assets/image-20230303135134353.png\" alt=\"image-20230303135134353\" style=\"zoom: 33%;\" /\u003e\r\n\r\n\r\n\r\n\u003e Network\r\n\r\n\u003cimg src=\"assets/network-screen.png\" alt=\"Screenshot of the network screen\" style=\"zoom: 50%;\" /\u003e\r\n\r\n\r\n\r\n\u003e Logging: 日志视图展示 Dart 运行时和应用框架（比如 Flutter）的事件，以及应用级日志。\r\n\u003e\r\n\u003e - Dart 运行时的垃圾回收事件\r\n\u003e - Flutter 框架事件，比如创建帧的事件\r\n\u003e - 应用的 `stdout` 和 `stderr` 输出\r\n\u003e - 应用的自定义日志事件\r\n\r\n\u003cimg src=\"assets/image-20230303135611123.png\" alt=\"image-20230303135611123\" style=\"zoom: 33%;\" /\u003e\r\n\r\n\r\n\r\n\u003e App Size： 导入 `apk体积文件`，生成可视化\r\n\r\n\u003cimg src=\"assets/app_size_analysis.png\" alt=\"Screenshot of app size analysis\" style=\"zoom: 50%;\" /\u003e\r\n\r\n---\r\n\r\n### 性能调试\r\n\r\n\u003e 开启 `profile`,`Performance`,`CPU Profiler`,`Memory`调试时需要用到 \r\n\u003e\r\n\u003e profile模式，需要真机，不支持模拟器，非性能调优，可忽略\r\n\r\n* .vscode/launch.json\r\n\r\n```json\r\n    {\r\n      \"name\": \"sdk_demo (profile mode)\",\r\n      \"request\": \"launch\",\r\n      \"type\": \"dart\",\r\n      \"flutterMode\": \"profile\"\r\n    },\r\n```\r\n\r\n\u003e 加入测试代码\r\n\r\n```dart\r\n  void testFor() {\r\n    for (var i = 0; i \u003c 1000; i++) {\r\n      print(\"for: $i\");\r\n    }\r\n  }\r\n\r\n@override\r\nWidget build(BuildContext context) {\r\n    testFor();\r\n```\r\n\r\n\u003e 为了方便排查 可以设置过滤 勾选这三个项目，剩下的就是你自己的函数\r\n\r\n\u003cimg src=\"assets/image-20230303145634432.png\" alt=\"image-20230303145634432\" style=\"zoom:33%;\" /\u003e\r\n\r\n### Performance\r\n\r\n\u003e 页面渲染的流畅度\r\n\r\n\u003cimg src=\"assets/image-20230303151851871.png\" alt=\"image-20230303151851871\" style=\"zoom: 50%;\" /\u003e\r\n\r\n\r\n\r\n---\r\n\r\n### CPU Profiler\r\n\r\n\u003e 用于检查代码的执行时间(即调用此方法整个的生命周期时长)\r\n\r\n\u003cimg src=\"assets/image-20230303152216747.png\" alt=\"image-20230303152216747\" style=\"zoom: 50%;\" /\u003e\r\n\r\n\r\n\r\n---\r\n\r\n### Memory\r\n\r\n\u003e 内存视图提供了应用程序内存分配的详细信息，以及用于检测和调试特定问题的工具。\r\n\r\n\u003cimg src=\"assets/image-20230313103629765.png\" alt=\"image-20230313103629765\" style=\"zoom:50%;\" /\u003e\r\n\r\n\r\n\r\n---\r\n\r\n## 打包\r\n\r\n### 创建安卓密钥证书\r\n\r\n\u003e keytool -genkey -v -keystore test-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias test\r\n\r\n![image-20230313090000278](assets/image-20230313090000278.png)\r\n\r\n\r\n\r\n---\r\n\r\n### 配置密钥证书\r\n\r\n* 创建一个配置文件 `android/key.properties`\r\n\r\n```properties\r\nstorePassword=\u003c证书密码\u003e\r\nkeyPassword=\u003c证书密码\u003e\r\nkeyAlias=test\r\nstoreFile=\u003c密钥证书地址\u003e\r\n```\r\n\r\n* `android/app/build.gradle`: 加载`key.properties`,把以下代码，加在 `android` 代码块前\r\n\r\n```java\r\ndef keystoreProperties = new Properties()\r\ndef keystorePropertiesFile = rootProject.file('key.properties')\r\nif (keystorePropertiesFile.exists()) {\r\n     keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\r\n}\r\n\r\nandroid {\r\n    ...\r\n}\r\n```\r\n\r\n* 修改 `buildTypes` 代码块\r\n\r\n```java\r\nbuildTypes {\r\n    release {\r\n        // TODO: Add your own signing config for the release build.\r\n        // Signing with the debug keys for now, so `flutter run --release` works.\r\n        signingConfig signingConfigs.debug\r\n    }\r\n}\r\n```\r\n\r\n\u003e 修改为\r\n\r\n```java\r\nsigningConfigs {\r\n    release {\r\n        keyAlias keystoreProperties['keyAlias']\r\n            keyPassword keystoreProperties['keyPassword']\r\n            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null\r\n            storePassword keystoreProperties['storePassword']\r\n    }\r\n}\r\nbuildTypes {\r\n    release {\r\n        signingConfig signingConfigs.release\r\n    }\r\n}\r\n```\r\n\r\n\r\n\r\n---\r\n\r\n### 打包\r\n\r\n\u003e 运行 `flutter build`\r\n\r\n```shell\r\nflutter build apk\r\n```\r\n\r\n\u003cimg src=\"assets/image-20230313093919677.png\" alt=\"image-20230313093919677\" style=\"zoom:50%;\" /\u003e\r\n\r\n\u003e 三种打包模式： `debug`、`profile`、`release`\r\n\r\n```shell\r\nflutter build apk --debug\r\n```\r\n\r\n\u003e 修改打包参数`versionName`,`versionCode`\r\n\u003e\r\n\u003e 在`pubspec.yaml`,找到`version`,`1.0.0+1`,加号左侧为`versionName(1.0.0)`,加号右侧为`versionCode(1)`\r\n\r\n* pubspec.yaml\r\n\r\n```yaml\r\nversion: 2.0.0+20230313\r\n```\r\n\r\n* 对应的`local.properties`\r\n\r\n```properties\r\nflutter.versionName=2.0.0\r\nflutter.versionCode=20230313\r\n```\r\n\r\n\u003e 生成 `apk` 体积文件\r\n\r\n```shell\r\nflutter build apk --analyze-size --target-platform=android-arm64\r\n```\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmellowco%2Ftest_flutter_demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmellowco%2Ftest_flutter_demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmellowco%2Ftest_flutter_demo/lists"}