]> Git — Sourcephile - tmp/julm/android.git/blob - flake.nix
improve upon armeabi-v7a
[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 "android-sdk-system-image-${androidPlatformVersion}-google_apis-armeabi-v7a"
38 ];
39 };
40 };
41 androidPlatformVersion = "34";
42 androidBuildToolsVersion = "34.0.0";
43 androidCmakeVersion = "3.22.1";
44 androidSdkArgs = {
45 cmakeVersions = [ androidCmakeVersion ];
46 platformVersions = [ androidPlatformVersion ];
47 abiVersions = [
48 "arm64-v8a"
49 "armeabi-v7a"
50 "x86_64"
51 ];
52 systemImageTypes = [
53 "google_apis"
54 #"google_apis_playstore"
55 ];
56 platformToolsVersion = "34.0.1";
57 ndkVersions = [ "23.1.7779620" ];
58 buildToolsVersions = [ androidBuildToolsVersion ];
59
60 includeNDK = true;
61 #includeEmulator = true;
62 #includeSystemImages = true;
63 extraLicenses = [
64 "android-sdk-license"
65 #"android-sdk-preview-license"
66 #"android-googletv-license"
67 #"android-sdk-arm-dbt-license"
68 #"google-gdk-license"
69 #"intel-android-extra-license"
70 #"intel-android-sysimage-license"
71 #"mips-android-sysimage-license"
72 ];
73 };
74 androidComposition = pkgs.androidenv.composeAndroidPackages androidSdkArgs;
75 androidEmulateApp =
76 args:
77 pkgs.androidenv.emulateApp (
78 {
79 name = "android-emulate-app";
80 app = null;
81 deviceName = "device";
82 package = "";
83 # ToDo: set this when the emulator will be working
84 # for emulate-android-armeabi-v7a
85 # or emulate-android-arm64-v8a
86 #app = ".";
87 #package = "chat.simplex.app";
88 #activity = "chat.simplex.app.MainActivity";
89
90 sdkExtraArgs = androidSdkArgs // {
91 emulatorVersion = "35.6.2";
92 };
93 platformVersion = androidPlatformVersion;
94 systemImageType = "google_apis";
95
96 # ExplanationNote: workaround `-gpu host` not working
97 # on my Vulkan system.
98 androidEmulatorFlags = "-gpu guest";
99
100 configOptions = {
101 "hw.keyboard" = "yes";
102 # FixMe: Not working for me:
103 # WARNING | emuglConfig_get_vulkan_hardware_gpu: Failed to create vulkan instance error code: -9
104 # See https://issuetracker.google.com/issues/356896486
105 #"hw.gpu.enabled" = "yes";
106 };
107 }
108 // args
109 );
110 in
111 {
112 packages = rec {
113 default = emulate-android-x86_64;
114 emulate-android-x86_64 = androidEmulateApp { abiVersion = "x86_64"; };
115 # FixMe: PANIC: Avd's CPU Architecture 'arm64' is not supported by the QEMU2 emulator on x86_64 host.
116 emulate-android-arm64-v8a = androidEmulateApp { abiVersion = "arm64-v8a"; };
117 # FixMe: PANIC: CPU Architecture 'arm' is not supported by the QEMU2 emulator, (the classic engine is deprecated!)
118 # Note: only androidPlatformVersion <= 25 still provide images for this ABI
119 # See nixpkgs/pkgs/development/mobile/androidenv/repo.json
120 emulate-android-armeabi-v7a = androidEmulateApp { abiVersion = "armeabi-v7a"; };
121 };
122
123 devShell =
124 let
125 zipAlignPath = "${androidComposition.androidsdk}/libexec/android-sdk/build-tools/${androidBuildToolsVersion}/zipalign";
126 in
127 pkgs.mkShell {
128 buildInputs = [
129 (pkgs.android-studio.withSdk androidComposition.androidsdk)
130 (pkgs.writeShellScriptBin "zipalign" ''exec ${zipAlignPath} "$@"'')
131 androidComposition.androidsdk
132 androidComposition.platform-tools
133 pkgs.gradle
134 pkgs.gradle.jdk
135 ];
136 shellHook = ''
137 # Note: ANDROID_HOME is deprecated. Use ANDROID_SDK_ROOT.
138 export ANDROID_SDK_ROOT="${androidComposition.androidsdk}/libexec/android-sdk"
139 export ANDROID_NDK_ROOT="${androidComposition.androidsdk}/libexec/android-sdk/ndk-bundle"
140 export PATH="$(echo "$ANDROID_SDK_ROOT/cmake/${androidCmakeVersion}".*/bin):$PATH"
141
142 # Use the same androidBuildToolsVersion and a statically linked aapt2
143 export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=$ANDROID_SDK_ROOT/build-tools/${androidBuildToolsVersion}/aapt2";
144 '';
145 };
146 }
147 );
148 }