From bde71a31c77c2f95781195697a1ec2b4c95fce45 Mon Sep 17 00:00:00 2001 From: iWisp360 Date: Fri, 10 Apr 2026 10:19:56 -0400 Subject: [PATCH] add action to build release apk with nix --- .github/workflows/android-release-nix.yml | 35 +++++ flake.nix | 151 +++++++++++++--------- 2 files changed, 123 insertions(+), 63 deletions(-) create mode 100644 .github/workflows/android-release-nix.yml diff --git a/.github/workflows/android-release-nix.yml b/.github/workflows/android-release-nix.yml new file mode 100644 index 00000000..fc650d4a --- /dev/null +++ b/.github/workflows/android-release-nix.yml @@ -0,0 +1,35 @@ +name: Build APKs for Android using Nix + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + submodules: 'recursive' + + - uses: cachix/install-nix-action@v31 + + - name: Add required files + run: | + cat <<"EOF-FILE" >local.properties + ${{ secrets.LOCAL_PROPERTIES }} + EOF-FILE + + cat <<"EOF-FILE" >app/google-services.json + ${{ secrets.GOOGLE_SERVICES_JSON }} + EOF-FILE + + - name: Build Task + run: nix --experimental-features "nix-command flakes" run .#buildRelease -L + + - name: Upload Release APKs + uses: actions/upload-artifact@v7 + with: + name: Release APKs + path: app/build/outputs/apk/release/*.apk + diff --git a/flake.nix b/flake.nix index 1d309e82..763a000a 100644 --- a/flake.nix +++ b/flake.nix @@ -1,78 +1,103 @@ { - description = "Native Telegram client for Android based on TDLib."; + description = "Native Telegram client for Android based on TDLib."; - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; - flake-parts.url = "github:hercules-ci/flake-parts"; - systems.url = "github:nix-systems/default"; - }; + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flake-parts.url = "github:hercules-ci/flake-parts"; + systems.url = "github:nix-systems/default"; + }; - outputs = - inputs: - inputs.flake-parts.lib.mkFlake { inherit inputs; } { - systems = import inputs.systems; + outputs = + inputs: + inputs.flake-parts.lib.mkFlake { inherit inputs; } { + systems = import inputs.systems; - perSystem = - { pkgs, system, ... }: - let - androidComposition = - pkgs: - (pkgs.androidenv.composeAndroidPackages { - platformVersions = [ - "35" - "36" - ]; + perSystem = + { pkgs, system, ... }: + let + actualBuildTools = "36.0.0"; + actualPlatform = "36"; + actualNdk = "28.2.13676358"; + androidComposition = + pkgs: + (pkgs.androidenv.composeAndroidPackages { + platformVersions = [ actualPlatform ]; + buildToolsVersions = [ actualBuildTools ]; + ndkVersions = [ actualNdk ]; + cmakeVersions = [ "3.22.1" ]; + abiVersions = [ + "armeabi-v7a" + "arm64-v8a" + "x86_64" + ]; - buildToolsVersions = [ - "35.0.0" - ]; + systemImageTypes = [ "google_apis_playstore" ]; + includeNDK = true; + includeCmake = true; + includeSources = true; + includeExtras = [ "extras;google;auto" ]; + }).androidsdk; + in + { + _module.args.pkgs = import inputs.nixpkgs { + inherit system; + config = { + android_sdk.accept_license = true; + allowUnfree = true; + }; + }; - cmakeVersions = [ - "3.22.1" - ]; + devShells.default = pkgs.mkShell { + name = "monogram-sdk"; - ndkVersions = [ - "27.0.12077973" - ]; + nativeBuildInputs = [ + (androidComposition pkgs) + pkgs.glibc + pkgs.jdk21 + pkgs.android-studio + ]; - abiVersions = [ - "armeabi-v7a" - "arm64-v8a" - "x86_64" - ]; + JAVA_HOME = "${pkgs.jdk21}"; + ANDROID_HOME = "${androidComposition pkgs}/libexec/android-sdk"; + }; - systemImageTypes = [ "google_apis_playstore" ]; - includeNDK = true; - includeCmake = true; - includeExtras = [ "extras;google;auto" ]; - }).androidsdk; - in - { - _module.args.pkgs = import inputs.nixpkgs { - inherit system; - config = { - android_sdk.accept_license = true; - allowUnfree = true; - }; - }; + apps = { + buildRelease = { + type = "app"; + program = "${pkgs.writeShellScriptBin "buildRelease" '' + if ! ${pkgs.git}/bin/git submodule update --init --recursive; then + echo "failed getting submodules" + fi - devShells.default = - (pkgs.buildFHSEnv { - name = "monogram-sdk-env"; + if ! [ -f local.properties ] || ! [ -f app/google-services.json ]; then + echo "Warning: local.properties and/or app/google-services.json aren't found," + echo "build will most likely fail" + fi - targetPkgs = pkgs: [ - (androidComposition pkgs) - pkgs.glibc - pkgs.jdk21 - ]; + export ANDROID_HOME="${androidComposition pkgs}/libexec/android-sdk/" + export ANDROID_SDK_ROOT="${androidComposition pkgs}/libexec/android-sdk/" + export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/${actualNdk}/" + export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidComposition pkgs}/libexec/android-sdk/build-tools/${actualBuildTools}/aapt2" + export JAVA_HOME="${pkgs.jdk21}" - profile = '' - export JAVA_HOME="/usr/lib/openjdk" - export ANDROID_HOME="/usr/libexec/android-sdk" - ''; + cd presentation/src/main/cpp/ + if ! [ -d libvpx_build ]; then + sed -e "s|#!/bin/bash|#!${pkgs.bash}/bin/bash|g" \ + -e "s|make clean|${pkgs.gnumake}/bin/make clean|g" \ + -e "s|make -j|${pkgs.gnumake}/bin/make -j|g" build.sh >new_build.sh + chmod +x new_build.sh + if ! ${pkgs.bash}/bin/bash new_build.sh; then + echo "libvpx build failed" + exit 1 + fi + rm new_build.sh + fi - runScript = "bash"; - }).env; - }; + cd ../../../.. + ./gradlew assembleRelease + ''}/bin/buildRelease"; + }; + }; }; + }; }