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 開發者賬號才能開發調試。