From 185c70ca6dca7795988c8ae5117eaddfcd6d41a5 Mon Sep 17 00:00:00 2001
From: Andri Joos <andri@joos.io>
Date: Wed, 1 Jan 2025 01:38:06 +0100
Subject: [PATCH] wip: add arm64 support

---
 .gclient           | 13 ++++++++++++
 .vscode/tasks.json |  5 ++++-
 Dockerfile         | 33 +++++++++++++++++++++++++++++--
 build_engine.sh    | 23 ++++++++++++++++++++++
 test_engine.sh     | 49 ++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 120 insertions(+), 3 deletions(-)
 create mode 100644 .gclient
 create mode 100644 build_engine.sh
 create mode 100644 test_engine.sh

diff --git a/.gclient b/.gclient
new file mode 100644
index 0000000..1487903
--- /dev/null
+++ b/.gclient
@@ -0,0 +1,13 @@
+solutions = [
+    {
+        "custom_deps": {},
+        "deps_file": "DEPS",
+        "managed": False,
+        "name": "src/flutter",
+        "safesync_url": "",
+        "url": "https://github.com/flutter/engine.git",
+        "custom_vars": {
+            "download_emsdk": True,
+        },
+    },
+]
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 387bad9..17776d2 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -12,7 +12,10 @@
                 "--build-arg",
                 "FLUTTER_VERSION=${input:flutterVersion}",
                 "--platform",
-                "linux/amd64",
+                "linux/arm64",
+                "--tag",
+                "andrijoos/flutter:${input:flutterVersion}-dev",
+                "--load",
                 ".",
             ],
         },
diff --git a/Dockerfile b/Dockerfile
index accb667..834b2d0 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -17,8 +17,35 @@ RUN apt update \
 
 RUN mkdir -p ${FLUTTER_DIR}
 
-RUN wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz -O ${FLUTTER_DOWNLOAD_FILE} \
-    && tar -xf ${FLUTTER_DOWNLOAD_FILE} --strip-components=1 --directory $FLUTTER_DIR;
+ENV PATH="$PATH:/opt/depot_tools"
+
+# Use precompiled binaries
+RUN if [ "$(uname -m)" = "x86_64" ]; then \
+    wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz -O ${FLUTTER_DOWNLOAD_FILE} \
+    && tar -xf ${FLUTTER_DOWNLOAD_FILE} --strip-components=1 --directory $FLUTTER_DIR; \
+    fi
+
+COPY .gclient /engine
+
+# RUN if [ "$(uname -m)" = "aarch64" ]; then \
+#     git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /opt/depot_tools \
+#     && git clone --depth 1 https://github.com/flutter/engine.git engine \
+#     && cd engine \
+#     && gclient config https://github.com/flutter/engine.git \
+#     # && git pull upstream master \
+#     && gclient sync \
+#     && ./flutter/tools/gn --target-os=linux --linux-cpu=arm64 \
+#     && ninja -C out/linux_release_arm64; \
+#     fi
+
+# RUN ls out && exit 1
+
+# apt update && apt install -y git wget python3 xz-utils pkg-config
+# PATH="$PATH:/opt/depot_tools" && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /opt/depot_tools
+# git clone --depth 1 https://github.com/flutter/engine.git engine
+# # cd engine && fetch flutter
+# cd engine && cp /app/.gclient . && gclient sync
+# ./src/flutter/tools/gn --android --android-cpu arm64
 
 # There is no official flutter arm64 release, so we must use the github repo
 # Flutter on arch currently has warnings because channel and repository source are not set
@@ -73,5 +100,7 @@ RUN dart --disable-analytics \
     --no-enable-fuchsia \
     && flutter precache --universal
 
+# On arm64, set flutter config local engine
+
 # Test flutter
 # RUN flutter doctor --verbose && exit 1
diff --git a/build_engine.sh b/build_engine.sh
new file mode 100644
index 0000000..4378549
--- /dev/null
+++ b/build_engine.sh
@@ -0,0 +1,23 @@
+# Currently, only android and linux are supported.
+# https://github.com/flutter/engine/blob/main/docs/contributing/Compiling-the-engine.md
+
+# todo: release/profile, linux, maybe copy only flutter.jar?
+
+apt update && apt install -y git wget python3 xz-utils pkg-config openjdk-17-jdk
+PATH="$PATH:/opt/depot_tools" && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /opt/depot_tools
+git clone --depth 1 https://github.com/flutter/engine.git /engine
+cp .gclient /engine
+cd /engine
+rm pubspec.yaml
+gclient sync
+
+cd src
+flutter/tools/gn --unoptimized --runtime-mode=debug
+ninja -C out/host_debug_unopt
+
+flutter/tools/gn --android --android-cpu arm64 --unoptimized --runtime-mode=debug
+# flutter/tools/gn --android --android-cpu arm64 --runtime-mode=profile
+# flutter/tools/gn --android --android-cpu arm64 --runtime-mode=release
+ninja -C out/android_debug_unopt_arm64
+# ninja -C out/android_profile_arm64
+# ninja -C out/android_release_arm64
diff --git a/test_engine.sh b/test_engine.sh
new file mode 100644
index 0000000..185023e
--- /dev/null
+++ b/test_engine.sh
@@ -0,0 +1,49 @@
+# When running on docker, run `docker run --rm --privileged multiarch/qemu-user-static --reset -p yes` to enable emulation
+
+apt update
+apt install -y wget xz-utils git curl unzip
+
+# FLUTTER_VERSION="3.27.1"
+# FLUTTER_DOWNLOAD_FILE="flutter.zip"
+# wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz -O ${FLUTTER_DOWNLOAD_FILE}
+# mkdir -p /flutter
+# tar -xf ${FLUTTER_DOWNLOAD_FILE} --strip-components=1 --directory /flutter
+
+FLUTTER_DIR=/opt/flutter
+FLUTTER_VERSION=3.27.1
+git clone --depth 1 https://github.com/flutter/flutter.git ${FLUTTER_DIR}
+cd ${FLUTTER_DIR}
+git fetch origin tag ${FLUTTER_VERSION}
+git checkout tags/${FLUTTER_VERSION}
+PATH="${PATH}:${FLUTTER_DIR}/bin"
+cd /
+
+flutter precache --universal
+
+# # Test android
+apt install -y openjdk-17-jdk
+
+export ANDROID_HOME="/opt/android"
+CMDLINETOOLS_DIR="$ANDROID_HOME/cmdline-tools/latest"
+CMDLINETOOLS_VERSION="11076708"
+CMDLINETOOLS_ZIP="/tmp/cmdline-tools.zip"
+wget "https://dl.google.com/android/repository/commandlinetools-linux-${CMDLINETOOLS_VERSION}_latest.zip" -O $CMDLINETOOLS_ZIP
+unzip -q $CMDLINETOOLS_ZIP -d /tmp
+mkdir -p ${CMDLINETOOLS_DIR}
+mv /tmp/cmdline-tools/* $CMDLINETOOLS_DIR
+PATH="${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools"
+yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses
+yes "y" | flutter doctor --android-licenses
+
+flutter precache --universal --android
+flutter config --local-engine-src-path /out/engine/src/ --local-engine /out/engine/src/out/android_debug_unopt_arm64/ --local-engine-host /out/engine/src/out/host_debug_unopt/
+flutter config --enable-android
+flutter create --project-name android_test -t app --platforms android android_test
+cd android_test/android
+./gradlew wrapper --gradle-version=8.1
+cd ..
+flutter pub get
+flutter build appbundle --debug --target-platform android-arm64
+# # flutter build appbundle --profile --target-platform android-arm,android-arm64,android-x64
+# # flutter build appbundle --release --target-platform android-arm,android-arm64,android-x64
+# cd ..
-- 
GitLab