Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/workflows/android-release-nix.yml
Original file line number Diff line number Diff line change
@@ -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

151 changes: 88 additions & 63 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -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";
};
};
};
};
}