]> Git — Sourcephile - tmp/julm/android.git/blob - flake.nix
init
[tmp/julm/android.git] / flake.nix
1 {
2 description = "Nix flake to develop for Android";
3 inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
4 inputs.flake-utils.url = "github:numtide/flake-utils";
5 outputs =
6 inputs:
7 let
8 systems = [
9 "x86_64-linux"
10 "x86_64-darwin"
11 "aarch64-linux"
12 "aarch64-darwin"
13 ];
14 in
15 inputs.flake-utils.lib.eachSystem systems (
16 system:
17 let
18 pkgs = import inputs.nixpkgs {
19 inherit system;
20 config = {
21 android_sdk.accept_license = true;
22 allowUnfreePredicate =
23 pkg:
24 builtins.elem (pkgs.lib.getName pkg) [
25 # ExplanationNote: android-emulate-app (see below) is unfree by transitivity
26 "android-emulate-app"
27 "android-sdk-build-tools"
28 "android-sdk-cmdline-tools"
29 "android-sdk-emulator"
30 "android-sdk-ndk"
31 "android-sdk-platform-tools"
32 "android-sdk-platforms"
33 "android-sdk-tools"
34 "android-studio-stable"
35 "android-sdk-system-image-${androidPlatformVersion}-google_apis-x86_64"
36 "android-sdk-system-image-${androidPlatformVersion}-google_apis-arm64-v8a"
37 ];
38 };
39 };
40 androidPlatformVersion = "34";
41 androidBuildToolsVersion = "34.0.0";
42 androidCmakeVersion = "3.22.1";
43 androidSdkArgs = {
44 cmakeVersions = [ androidCmakeVersion ];
45 platformVersions = [ androidPlatformVersion ];
46 abiVersions = [
47 "arm64-v8a"
48 "armeabi-v7a"
49 "x86_64"
50 ];
51 systemImageTypes = [
52 "google_apis"
53 #"google_apis_playstore"
54 ];
55 platformToolsVersion = "34.0.1";
56 ndkVersions = [ "23.1.7779620" ];
57 buildToolsVersions = [ androidBuildToolsVersion ];
58
59 includeNDK = true;
60 #includeEmulator = true;
61 #includeSystemImages = true;
62 extraLicenses = [
63 "android-sdk-license"
64 #"android-sdk-preview-license"
65 #"android-googletv-license"
66 #"android-sdk-arm-dbt-license"
67 #"google-gdk-license"
68 #"intel-android-extra-license"
69 #"intel-android-sysimage-license"
70 #"mips-android-sysimage-license"
71 ];
72 };
73 androidComposition = pkgs.androidenv.composeAndroidPackages androidSdkArgs;
74 androidEmulateApp =
75 args:
76 pkgs.androidenv.emulateApp (
77 {
78 name = "android-emulate-app";
79 app = null;
80 deviceName = "device";
81 package = "";
82 # ToDo: set this when the emulator will be working
83 # for emulate-android-armeabi-v7a
84 # or emulate-android-arm64-v8a
85 #app = ".";
86 #package = "chat.simplex.app";
87 #activity = "chat.simplex.app.MainActivity";
88
89 sdkExtraArgs = androidSdkArgs // {
90 emulatorVersion = "35.6.2";
91 };
92 platformVersion = androidPlatformVersion;
93 systemImageType = "google_apis";
94
95 # ExplanationNote: workaround `-gpu host` not working
96 # on my Vulkan system.
97 androidEmulatorFlags = "-gpu guest";
98
99 configOptions = {
100 "hw.keyboard" = "yes";
101 # FixMe: Not working for me:
102 # WARNING | emuglConfig_get_vulkan_hardware_gpu: Failed to create vulkan instance error code: -9
103 # See https://issuetracker.google.com/issues/356896486
104 #"hw.gpu.enabled" = "yes";
105 };
106 }
107 // args
108 );
109 in
110 {
111 packages = rec {
112 default = emulate-android-x86_64;
113 emulate-android-x86_64 = androidEmulateApp { abiVersion = "x86_64"; };
114 # FixMe: PANIC: Avd's CPU Architecture 'arm64' is not supported by the QEMU2 emulator on x86_64 host.
115 emulate-android-arm64-v8a = androidEmulateApp { abiVersion = "arm64-v8a"; };
116 # FixMe: Error: Package path is not valid. Valid system image paths are:
117 # null
118 # Note: why is there no valid system image for armeabi-v7a???
119 emulate-android-armeabi-v7a = androidEmulateApp { abiVersion = "armeabi-v7a"; };
120 };
121
122 devShell =
123 let
124 zipAlignPath = "${androidComposition.androidsdk}/libexec/android-sdk/build-tools/${androidBuildToolsVersion}/zipalign";
125 in
126 pkgs.mkShell {
127 buildInputs = [
128 (pkgs.android-studio.withSdk androidComposition.androidsdk)
129 (pkgs.writeShellScriptBin "zipalign" ''exec ${zipAlignPath} "$@"'')
130 androidComposition.androidsdk
131 androidComposition.platform-tools
132 pkgs.gradle
133 pkgs.gradle.jdk
134 ];
135 shellHook = ''
136 # Note: ANDROID_HOME is deprecated. Use ANDROID_SDK_ROOT.
137 export ANDROID_SDK_ROOT="${androidComposition.androidsdk}/libexec/android-sdk"
138 export ANDROID_NDK_ROOT="${androidComposition.androidsdk}/libexec/android-sdk/ndk-bundle"
139 export PATH="$(echo "$ANDROID_SDK_ROOT/cmake/${androidCmakeVersion}".*/bin):$PATH"
140
141 # Use the same androidBuildToolsVersion and a statically linked aapt2
142 export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=$ANDROID_SDK_ROOT/build-tools/${androidBuildToolsVersion}/aapt2";
143 '';
144 };
145 }
146 );
147 }