diff --git a/.github/workflows/build_android_apk.yaml b/.github/workflows/build_android_apk.yaml new file mode 100644 index 0000000000..ffad7a8c70 --- /dev/null +++ b/.github/workflows/build_android_apk.yaml @@ -0,0 +1,99 @@ +name: Build AppFlowy Release APK + +on: workflow_dispatch + +env: + FLUTTER_VERSION: "3.13.9" + RUST_TOOLCHAIN: "1.70" + +jobs: + build: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + include: + - os: ubuntu-latest + target: aarch64-linux-android + runs-on: ${{ matrix.os }} + + steps: + # the following step is required to avoid running out of space + - name: Maximize build space + if: matrix.os == 'ubuntu-latest' + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + + - name: Checkout source code + uses: actions/checkout@v2 + + - name: Install Rust toolchain + id: rust_toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} + target: ${{ matrix.target }} + override: true + profile: minimal + + - name: Install flutter + id: flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + + - uses: nttld/setup-ndk@v1 + id: setup-ndk + with: + ndk-version: "r24" + add-to-path: true + + - uses: Swatinem/rust-cache@v2 + with: + prefix-key: ${{ matrix.os }} + workspaces: | + frontend/rust-lib + + - uses: davidB/rust-cargo-make@v1 + with: + version: "0.36.6" + + - name: Install prerequisites + working-directory: frontend + run: | + rustup target install aarch64-linux-android + rustup target install x86_64-linux-android + cargo install --force duckscript_cli + cargo install cargo-ndk + if [ "$RUNNER_OS" == "Linux" ]; then + sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub + sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list + sudo apt-get update + sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev + sudo apt-get install keybinder-3.0 libnotify-dev + sudo apt-get install gcc-multilib + elif [ "$RUNNER_OS" == "Windows" ]; then + vcpkg integrate install + elif [ "$RUNNER_OS" == "macOS" ]; then + echo 'do nothing' + fi + cargo make appflowy-flutter-deps-tools + shell: bash + + - name: Build AppFlowy + working-directory: frontend + env: + ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} + run: | + cargo make --profile production-android appflowy-android + + - name: Upload APK + uses: actions/upload-artifact@v2 + with: + name: app-arm64-v8a-release.apk + path: frontend/appflowy_flutter/build/app/outputs/flutter-apk/ diff --git a/frontend/Makefile.toml b/frontend/Makefile.toml index a7a8354410..86223bbadd 100644 --- a/frontend/Makefile.toml +++ b/frontend/Makefile.toml @@ -201,6 +201,7 @@ TARGET_OS = "android" CRATE_TYPE = "cdylib" FLUTTER_OUTPUT_DIR = "Debug" LIB_EXT = "so" +PRODUCT_EXT = "apk" FLUTTER_DESKTOP_FEATURES = "dart,rev-sqlite,openssl_vendored" [env.production-android] @@ -208,6 +209,7 @@ BUILD_FLAG = "release" TARGET_OS = "android" CRATE_TYPE = "cdylib" FLUTTER_OUTPUT_DIR = "Release" +PRODUCT_EXT = "apk" LIB_EXT = "so" [tasks.echo_env] diff --git a/frontend/appflowy_flutter/android/app/src/main/CMakeLists.txt b/frontend/appflowy_flutter/android/app/src/main/CMakeLists.txt index 3df7d13ed0..38b0aa5ca7 100644 --- a/frontend/appflowy_flutter/android/app/src/main/CMakeLists.txt +++ b/frontend/appflowy_flutter/android/app/src/main/CMakeLists.txt @@ -2,6 +2,9 @@ cmake_minimum_required(VERSION 3.10.0) project(AppFlowy) +message(CONFIGURE_LOG "NDK PATH: ${ANDROID_NDK}") +message(CONFIGURE_LOG "Copying libc++_shared.so") + # arm64-v8a file(COPY ${ANDROID_NDK}/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so diff --git a/frontend/scripts/makefile/flutter.toml b/frontend/scripts/makefile/flutter.toml index 3ccac1f58f..8c3a186049 100644 --- a/frontend/scripts/makefile/flutter.toml +++ b/frontend/scripts/makefile/flutter.toml @@ -58,7 +58,7 @@ run_task = { name = [ "code_generation", "set-app-version", "flutter-build-android", - "copy-to-product-mobile", + "copy-to-product-android", ] } script_runner = "@shell" @@ -139,6 +139,23 @@ script = [ ] script_runner = "@shell" +[tasks.copy-to-product-android] +script = [ + """ + product_path=${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/appflowy_flutter/product/${APP_VERSION} + output_path=${product_path}/${TARGET_OS}/${FLUTTER_OUTPUT_DIR} + if [ -d "${output_path}" ]; then + rm -rf ${output_path}/ + fi + mkdir -p ${output_path} + + product=${PRODUCT_NAME}-arm64-v8a-release.${PRODUCT_EXT} + cp -R ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/appflowy_flutter/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk \ + ${output_path}/${product} + """, +] +script_runner = "@shell" + [tasks.copy-to-product-macos] script = [ """ @@ -149,7 +166,7 @@ script = [ fi mkdir -p ${output_path} - product=${PRODUCT_NAME}.${PRODUCT_EXT} + product=${PRODUCT_NAME}-arm64-v8a-release.${PRODUCT_EXT} cp -R ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/appflowy_flutter/build/${TARGET_OS}/Build/Products/${FLUTTER_OUTPUT_DIR}/${product} \ ${output_path}/${product} """, diff --git a/frontend/scripts/makefile/mobile.toml b/frontend/scripts/makefile/mobile.toml index 941bc8a3f1..466c913899 100644 --- a/frontend/scripts/makefile/mobile.toml +++ b/frontend/scripts/makefile/mobile.toml @@ -95,7 +95,7 @@ script = [ lib = set lib${LIB_NAME}.${LIB_EXT} echo "💻 💻 💻 Copying ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/jniLibs/ to ${dart_ffi_dir}/" - rm -r ${dart_ffi_dir}/jniLibs/ + rm -r ${dart_ffi_dir}/jniLibs cp ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/jniLibs/ \ ${dart_ffi_dir}/