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 NativeElectron,在移动端 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

选择Linux(64位)即可

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 分别搜索 DartFlutter 并单击安装按钮进行安装,下载过程需要访问Google 网站,如果下载无法成功,建议科学上网后重试。

Dart开发插件

Flutter开发插件

4. 安装 Android SDK

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

android SDK下载

下载完成后,请配置环境变量

# 文件路径 /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 aapt2file aapt 可以发现 aapt2 和 aapt 的架构平台都是 X86_64,网上有人已经遇到相同的问题,解决方法是将编译后的 ARM64 版本替换 Android SDK安装路径下的对应版本 aapt2aapt,如果项目已经编译过,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 的具体输出的错误信息
在这里插入图片描述
复制一遍以上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

ARM64 Android NDK下载

总结

通过以上配置和排错过程,我们发现主要影响 Flutter 工程在 ARM64 环境的编译因素是 Android 相关环境的依赖不支持 ARM64 平台,因此替换所有报错的组件为相同 ARM64 版本,问题即可解决。编译 Flutter IOS版本不存在这些问题,因为 IOS 版本的Flutter 项目编译,必须在 IOS 系统下进行,还需要 IOS 开发者账号才能开发调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/959310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯

目录 简述 什么是高通滤波? 高通滤波的概念 应用场景 索贝尔算子 算子公式 实现代码 特点 沙尔算子 算子公式 实现代码 特点 拉普拉斯算子 算子公式 实现代码 特点 高通滤波器的对比与应用场景 相关阅读 OpenCV:图像滤波、卷积与卷积核…

VS企业版和专业版的区别

网上查询vs分析dump文件,查找托管内存泄露,需要使用“调试托管内存”功能,当前安装的vs2022 专用版找不到这个选项,vs2015是ok的,比较版本发现2022是专业版,2015是企业版。网上搜索专业版和企业版差异如下&…

ESP8266 NodeMCU与WS2812灯带:实现多种花样变换

在现代电子创意项目中,LED灯带的应用已经变得极为广泛。通过结合ESP8266 NodeMCU的强大处理能力和FastLED库的高效功能,我们可以轻松实现多达100种灯带变换效果。本文将详细介绍如何使用Arduino IDE编程,实现从基础到高级的灯光效果&#xff…

技术 · 创作 · 生活 | 我的 2024 全面复盘

目录 🌟2024年度总结:回顾、成长与突破🌟🚀 一、技术成长与突破 🚀🔗 1. 深入区块链与智能合约🔍 2. 探索新兴技术 ✍️ 二、创作与博客历程 ✍️📖 1. 内容创作的演变🏆…

嵌入式MCU面试笔记2

目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道,通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…

LeetCode --- 433周赛

题目列表 3427. 变长子数组求和 3428. 最多 K 个元素的子序列的最值之和 3429. 粉刷房子 IV 3430. 最多 K 个元素的子数组的最值之和 一、变长子数组求和 题意要求我们能快速算出 n u m s [ s t a r t . . . i ] nums[start...i] nums[start...i] 这段区间和,其中…

EasyNVR免费版已发布!EasyNVR接入海康NVR大华NVR宇视NVR天地伟业NVR接入各种IPC摄像机工业监控家庭监控

EasyNVR不用多说了,驰名已久!之前一直是收费的,不管多少个摄像机接入都是收费的,这就导致,很多个人用户,或者说是家庭用户,家里就那么两三个摄像机,想通过EasyNVR接入NAS系统&#x…

任务一:Android逆向

首先我使用了一个叫objection的东西。 列出了他所有的活动界面,列出来之后在慢慢筛选。 然后用了一个命令,就是可以跳到这个活动界面的命令。 我就确定了这个活动界面的位置,然后我就采取了objection的另一种栈追踪。 追踪到了这个地方。 先打印出具有特征参数的值,在…

黑龙江锅包肉:酸甜香酥的东北经典

黑龙江锅包肉:酸甜香酥的东北经典 黑龙江锅包肉,作为东北菜的代表之一,尤其在黑龙江省哈尔滨市享有极高的声誉。这道美食不仅承载着丰富的历史文化内涵,更以其鲜明的地域特色,成为了黑龙江省乃至整个东北地区的标志性菜肴。 历史渊源 锅包肉的历史可以追溯到清朝光绪年间,其…

[JavaScript] ES6及以后版本的新特性

文章目录 箭头函数(Arrow Functions)为什么需要箭头函数?箭头函数的完整语法箭头函数中的 this实用场景 解构赋值(Destructuring Assignment)为什么需要解构赋值?数组解构赋值的完整用法对象解构赋值的完整…

ipad和macbook同步zotero文献附件失败的解决办法

背景:我所有的文献及其附件pdf都是在台式机(windows系统),想要把这些文献同步到云上,然后再从云上同步到平板和其他笔记本电脑比如macbook。文献同步虽已成功,但文献附件都无法打开。 平板报错如下&#xf…

element tbas增加下拉框

使用Tabs 标签页的label插槽,嵌入Dropdown 下拉菜单,实现Tabs 标签页增加下拉切换功能 Tabs 标签页 tab-click"事件"(这个事件当中到拥有下拉框的tab里时,可以存一下Dropdown 第一个菜单的id,实现点击到拥有…

环境变量配置与问题解决

目录 方法 配置了还是运行不了想要的东西 解决方案 为什么 解决方案 方法 方法一:此电脑右击-属性-相关链接-高级系统设置-环境变量(N)-系统变量里面找到Path-三个确定】 方法二:winr cmd 黑框输入sysdm.cpl,后面…

【C++】详细讲解继承(下)

本篇来继续说说继承。上篇可移步至【C】详细讲解继承(上) 1.继承与友元 友元关系不能继承 ,也就是说基类友元不能访问派⽣类私有和保护成员。 class Student;//前置声明class Same //基类 { public:friend void Fun(const Same& p, con…

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动,联想电脑设置u盘启动的方法有两种,一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是,一种是uefi引导,一种是传统的leacy引导,所以需要注意制…

算法|牛客网华为机试53-62C++

牛客网华为机试 上篇:算法|牛客网华为机试41-52C 文章目录 HJ53 杨辉三角的变形HJ54 表达式求值HJ55 挑7HJ56 完全数计算HJ57 高精度整数加法HJ58 输入n个整数,输出其中最小的k个HJ59 找出字符串中第一个只出现一次的字符HJ60 查找组成一个偶数最接近的两…

消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)

1、TCP和UDP概述 TCP(传输控制协议,Transmission Control Protocol)和UDP(用户数据报协议,User Datagram Protocol)都算是最底层的通信协议,它们位于OSI模型的传输层。*传输层的主要职责是确保…

springboot基于Spring Boot的智慧养老服务系统的设计与实现

系统介绍: 智慧养老服务系统是一种运用现代科技手段,整合各类养老资源,为老年人提供全方位、个性化服务的综合性平台。该系统通过智能化设备、大数据分析、云计算等技术,实现对老年人健康状况、生活需求的实时监控与精准匹配&…

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法,步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一.软硬…

python实现http文件服务器访问下载

//1.py import http.server import socketserver import os import threading import sys# 获取当前脚本所在的目录 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 设置服务器的端口 PORT 8000# 自定义Handler,将根目录设置为脚本所在目录 class MyHTT…