ARM64平台Flutter环境搭建
ARM64平台Flutter环境搭建
- Flutter简介
- 问题背景
- 搭建步骤
- 1. 安装ARM64 Android Studio
- 2. 安装Oracle的JDK
- 3. 安装 Dart和 Flutter 开发插件
- 4. 安装 Android SDK
- 5. 安装 Flutter SDK
- 6. 同意 Android 条款
- 7. 运行 Flutter 示例项目
- 8. 修正 aapt2 报错
- 9. 修正 CMake 报错
- 10. 修正 NDK 工具链报错
- 总结
Flutter简介
Flutter 是跨平台的UI开发框架,基于 Google 的 Dart 语言开发,底层依赖交叉编译工具链将编写好的dart代码转换成 Javascript(WEB端)、Java/Kotlin(Anndroid端)、Object-C/Swift(IOS端), 这样 Flutter 框架站在巨人的肩膀上就完成了一次编写,多端适配的华丽转身。为了突出自身的优势,相比现有的基于 Chromium 浏览器内核的多端UI框架 React Native 和 Electron,在移动端 Flutter 底层基于 Dart 编译型语言直接调用 skia 渲染引擎,没有 JavaScript 语言解释的性能开销,在数据量大的 UI 交互表现上会更为出色,同时打包后的体积相比前面两者也会小一些。
问题背景
Flutter 程序交叉编译成 Android 程序,除了本身依赖 Flutter SDK 外,还依赖 Android Studio集成开发环境及其相关依赖,但是Google官方并没有推出 ARM64平台版本的 Android Studio, 我们只能借助网上的资源自力更生,不断填坑。
搭建步骤
1. 安装ARM64 Android Studio
Android Studio 本身是基于Java开发的集成开发环境(IDE), 没有ARM64版本的,我们就下载官方的 Linux X64版本的,链接如下,选择 Linux(64位) 当前版本是 2024.2.2.13

2. 安装Oracle的JDK
2024.2.2.13 版本的 Android Studio 依赖 Oracle 的 JDK,国产系统自带的JDK一般都比较旧,使用 OpenJDK 理论上也可行,但交叉编译 Android 程序的时候会有其他错误,为此下载一个较新版本的 Oracle JDK很有必要。这里推荐下载 21.0.5, 我安装在 /usr/local/jdk-21.0.5 这个目录下, 同时配置环境变量如下,配置完成后记得 source /etc/profile, 让环境变量生效。
# 文件路径 /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk-21.0.5
export PATH=$JAVA_HOME/bin:$PATH
3. 安装 Dart和 Flutter 开发插件
Oracle JDK 安装好后,解压 Android Studio 压缩包后,进入目录执行命令 ./bin/studio.sh 从命令行启动 Android Studio, 依次单击 File > Settings > Plulgins, 在Marketplace 分别搜索 Dart 和 Flutter 并单击安装按钮进行安装,下载过程需要访问Google 网站,如果下载无法成功,建议科学上网后重试。


4. 安装 Android SDK
既然 Flutter 框架开发的程序最终需要打包成APK程序安装到 Android 手机上,自然编译打包过程中离不开 Android SDK,请结合自己手上的 Android 真机的 Android 版本,下载对应版本的 Android SDK 到指定路径 (比如我的保存位置为 /home/greatwall/android_sdk),请确保上述路径的访问和写入权限,Android Studio 对应的下载位置在 File > Settings > Languages & Frameworks, 文件比较大,请不要中途断开网络。

下载完成后,请配置环境变量
# 文件路径 /etc/profile.d/android.sh, 路径请根据自身情况调整,命令行输入 source /etc/profile 让其立即生效
export ANDROID_STUDIO_HOME=/home/greatwall/work/flutter/android_studio/
export ANDROID_HOME=/home/greatwall/android_sdk
export PATH=$PATH:$ANDROID_STUDIO_HOME/bin
5. 安装 Flutter SDK
Flutter 官方也没有推出ARM64版本的 SDK, 不过GitHub已经有牛人完成适配并开源,下载链接如下:
https://github.com/zhzhzhy/Flutter-SDK-ARM64/tags
请根据自己需要,下载一个较新的版本即可;下载完成后,将压缩包解压到 /usr/local/flutter, 并配置环境变量并让其生效:
# 文件路径 /etc/profile.d/flutter.sh,命令行输入 source /etc/profile 让其立即生效
export FLUTTER_HOME=/usr/local/flutter
export PATH=$PATH:$FLUTTER_HOME/bin
6. 同意 Android 条款
运行命令 flutter doctor --android-licenses 按照提示一路输入 y,同意所有 Android 使用条款,否则后续 Flutter 项目编译会报错。
7. 运行 Flutter 示例项目
使用命令 flutter run -v, 并观察输出日志,检查是否有错误
8. 修正 aapt2 报错
aapt2 是 Android SDK自带的资源编译和打包工具,Andio Studio 安装的默认是 X86_64 平台的 aapt2,Flutter 项目编译打包的时候会报错,通过命令 file aapt2 和 file aapt 可以发现 aapt2 和 aapt 的架构平台都是 X86_64,网上有人已经遇到相同的问题,解决方法是将编译后的 ARM64 版本替换 Android SDK安装路径下的对应版本 aapt2 和 aapt,如果项目已经编译过,gradle 缓存中的 aapt2 也要一并替换,否则编译依旧会报错。通过命令 sudo find / -name aapt2 找到所有的 aapt2, 确保他们都是合法的 ARM64 可执行文件。
9. 修正 CMake 报错
CMake 也是 Android SDK自带的编译工具,但只有 X86_64 版本,方式也是找到同版本的 ARM64 版本 CMAKE 替换 Android SDK 中的 X86_64 版本,GitHub 上 CMake 二进制包下载链接如下: https://github.com/Kitware/CMake/releases, 下载成功后 请将 CMake 中 bin 子目录的所有文件和 share/cmake-3.22 子目录中的文件一并替换,大家可以自行根据 Flutter 编译错误提示找到缺失的文件进行替换。

比如在我电脑上出现如下报错,可以手动执行一遍命令查看 CMake 的具体输出的错误信息

复制一遍以上CMake相关错误提示,手动执行一遍命令如下:
/home/greatwall/android_sdk/cmake/3.22.1/bin/cmake -H/usr/local/flutter/packages/flutter_tools/gradle/src/main/groovy \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DCMAKE_SYSTEM_VERSION=21 \
-DANDROID_PLATFORM=android-21 \
-DANDROID_ABI=arm64-v8a \
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
-DANDROID_NDK=/home/greatwall/android_sdk/ndk/26.3.11579264 \
-DCMAKE_ANDROID_NDK=/home/greatwall/android_sdk/ndk/26.3.11579264 \
-DCMAKE_TOOLCHAIN_FILE=/home/greatwall/android_sdk/ndk/android-ndk-r27b/build/cmake/android.toolchain.cmake \
-DCMAKE_MAKE_PROGRAM=/home/greatwall/android_sdk/cmake/3.22.1/bin/ninja \
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/greatwall/work/flutter/irich/build/app/intermediates/cxx/Debug/3w6x2q1f/obj/arm64-v8a \
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/home/greatwall/work/flutter/irich/build/app/intermediates/cxx/Debug/3w6x2q1f/obj/arm64-v8a \
-DCMAKE_BUILD_TYPE=Debug \
-B/home/greatwall/work/flutter/irich/android/app/.cxx/Debug/3w6x2q1f/arm64-v8a -GNinja -Wno-dev --no-warn-unused-cli
10. 修正 NDK 工具链报错
修正 CMake 错误后,你会发现还是编译不过,那是因为 Android Studio 自带的 NDK 也只支持 X86_64 版本,需要重新编译ARM64 版本的 NDK 才行, 而且 NDK 的版本要和 Flutter 项目中指定的保持一致。Github 上相关移植 NDK 的链接可供参考:
https://github.com/lzhiyong/termux-ndk/releases/tag/android-ndk

总结
通过以上配置和排错过程,我们发现主要影响 Flutter 工程在 ARM64 环境的编译因素是 Android 相关环境的依赖不支持 ARM64 平台,因此替换所有报错的组件为相同 ARM64 版本,问题即可解决。编译 Flutter IOS版本不存在这些问题,因为 IOS 版本的Flutter 项目编译,必须在 IOS 系统下进行,还需要 IOS 开发者账号才能开发调试。
相关文章:
ARM64平台Flutter环境搭建
ARM64平台Flutter环境搭建 Flutter简介问题背景搭建步骤1. 安装ARM64 Android Studio2. 安装Oracle的JDK3. 安装 Dart和 Flutter 开发插件4. 安装 Android SDK5. 安装 Flutter SDK6. 同意 Android 条款7. 运行 Flutter 示例项目8. 修正 aapt2 报错9. 修正 CMake 报错10. 修正 N…...
Maven运行任何命令都报错“Internal error: java.lang.ArrayIndexOutOfBoundsException”
今天遇到一个奇怪的问题,在maven工程下运行任何mvn命令都报“Internal error: java.lang.ArrayIndexOutOfBoundsException”错误,具体错误如下: $ mvn install [INFO] Scanning for projects... [ERROR] Internal error: java.lang.ArrayInd…...
doris: MAP数据类型
MAP<K, V> 表示由K, V类型元素组成的 map,不能作为 key 列使用。 目前支持在 Duplicate,Unique 模型的表中使用。 K, V 支持的类型有: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DECIMALV3, DAT…...
Gurobi基础语法之 LinExpr 类
优化问题中普遍出现的一种类型的约束就是线性约束,线性约束形如,Gurobi 中设计了一个 LinExpr 类来创建线性表达式。 当 i 的取值范围较小的时候,可以直接将这个线性表达式写出来,作为 addConstr 的参数,以此方便的建立…...
《Java核心技术 卷II》日期和时间API的时间线
日期和时间API Java1.0的Date类过于简单,大部分被弃用。 Java1.1引入Calendar类,但没有处理诸如闰秒之类的问题。 Java 8引入java.time.API,修正过去缺陷。 时间线 1967年,铯133原子的特性推导出了秒的精确定义。之后由原子钟网络…...
文献阅读 250128-Tropical forests are approaching critical temperature thresholds
Tropical forests are approaching critical temperature thresholds 来自 <Tropical forests are approaching critical temperature thresholds | Nature> 热带森林正在接近临界温度阈值 ## Abstract: The critical temperature beyond which photosynthetic machinery…...
Deepseek的RL算法GRPO解读
在本文中,我们将深入探讨Deepseek采用的策略优化方法GRPO,并顺带介绍一些强化学习(Reinforcement Learning, RL)的基础知识,包括PPO等关键概念。 策略函数(policy) 在强化学习中, a…...
Linux 如何使用fdisk进行磁盘相关的操作
简介 fdisk 命令是 Linux 中用于管理磁盘分区的强大文本实用程序。它可以创建、删除、调整大小和修改硬盘上的分区。 基本语法 fdisk [options] <device> <device>:要管理的磁盘,例如 /dev/sda、/dev/nvme0n1 或 /dev/vda 示例用法 列…...
智能客服系统:结合 AI 模型与数据库实现对话与知识检索
智能客服系统在现代企业中起着至关重要的作用。通过结合 生成式 AI 模型 和 向量数据库,可以构建一个能够高效回答用户问题、支持知识检索并实现对话连续性的智能客服系统。 本文将详细讲解如何设计并实现一个基于 Spring AI 的智能客服系统。 1. 系统架构设计 智…...
网易Android开发面试题200道及参考答案 (下)
说明原码、反码、补码的概念 原码:是一种简单的机器数表示法。对于有符号数,最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值。比如,对于 8 位二进制数,+5 的原码是 00000101,-5 的原码是 10000101。原码的优点是直观,容易理解,但在进行加减法运算时,…...
《哈佛家训》
《哈佛家训》是一本以教育为主题的书籍,旨在通过一系列富有哲理的故事和案例,传递积极的人生观、价值观和教育理念。虽然它并非直接由哈佛大学官方出版,但其内容深受读者喜爱,尤其是在家庭教育和个人成长领域。 以下是《哈佛家训…...
为AI聊天工具添加一个知识系统 之76 详细设计之17 正则表达式 之4 正则表达式模板
Q712、三“化” (使用三种不同的定义方法:规定定义法 -线性回归/内涵定义法--一阶迭代/外延定义法--单调递归) 整体形成 一个双人零和 的局面 <Class()外延式, Type()内涵式> Method()规定式。给出 问题“law 是什么”的三种答案&#…...
面试被问的一些问题汇总(持续更新)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
WS2812 梳理和颜色表示方法的对比:RGB和HSV
WS2812 WS2812是一种可编程的LED灯,具有RGB显示效果,可显示的颜色数量为2^24。 常用颜色表示方法 表示方法: RGB 表示 加法混色原理:RGB 颜色模型基于加法混色原理,将红(Red)、绿(…...
JAVA实战开源项目:蜗牛兼职平台(Vue+SpringBoot) 附源码
本文项目编号 T 034 ,文末自助获取源码 \color{red}{T034,文末自助获取源码} T034,文末自助获取源码 目录 一、系统介绍1.1 平台架构1.2 管理后台1.3 用户网页端1.4 技术特点 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景…...
C++:多继承习题3
题目内容: 声明一个时间类Time,时间类中有3个私有数据成员(Hour,Minute,Second)和两个公有成员函数(SetTime和PrintTime)。要求: (1) SetTime根据传递的3个参数为对象设置时间; &a…...
【云安全】云原生-K8S-搭建/安装/部署
一、准备3台虚拟机 务必保证3台是同样的操作系统! 1、我这里原有1台centos7,为了节省资源和效率,打算通过“创建链接克隆”2台出来 2、克隆之前,先看一下是否存在k8s相关组件,或者docker相关组件 3、卸载原有的docker …...
06-AD向导自动创建P封装(以STM32-LQFP48格式为例)
自动向导创建封装 自动向导创建封装STM32-LQFP48Pin封装1.选则4排-LCC或者QUAD格式2.计算焊盘相定位长度3.设置默认引脚位置(芯片逆时针)4.特殊情况下:加额外的标记 其他问题测量距离:Ctrl M测量 && Ctrl C清除如何区分一脚和其他脚?芯片引脚是逆时针看的? 自动向导…...
linux监控脚本+自动触发邮件发送
linux脚本 需求: CPU 负载:使用 uptime 命令,我们可以清楚地了解系统的 CPU 负载情况。这个命令会显示系统在过去 1 分钟、5 分钟和 15 分钟的平均负载。高负载可能意味着系统正在处理大量的任务,可能会导致性能下降或服务响应延迟…...
【漫话机器学习系列】066.贪心算法(Greedy Algorithms)
贪心算法(Greedy Algorithms) 贪心算法是一种逐步构建解决方案的算法,每一步都选择当前状态下最优的局部选项(即“贪心选择”),以期望最终获得全局最优解。贪心算法常用于解决最优化问题。 核心思想 贪心选…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
