nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{requireFile, autoPatchelfHook, pkgs, pkgs_i686, licenseAccepted ? false}:
2
3{ toolsVersion ? "25.2.5"
4, platformToolsVersion ? "28.0.1"
5, buildToolsVersions ? [ "28.0.3" ]
6, includeEmulator ? false
7, emulatorVersion ? "28.0.14"
8, platformVersions ? []
9, includeSources ? false
10, includeDocs ? false
11, includeSystemImages ? false
12, systemImageTypes ? [ "default" ]
13, abiVersions ? [ "armeabi-v7a" ]
14, lldbVersions ? [ ]
15, cmakeVersions ? [ ]
16, includeNDK ? false
17, ndkVersion ? "18.1.5063045"
18, useGoogleAPIs ? false
19, useGoogleTVAddOns ? false
20, includeExtras ? []
21}:
22
23let
24 inherit (pkgs) stdenv lib fetchurl makeWrapper unzip;
25
26 # Determine the Android os identifier from Nix's system identifier
27 os = if stdenv.system == "x86_64-linux" then "linux"
28 else if stdenv.system == "x86_64-darwin" then "macosx"
29 else throw "No Android SDK tarballs are available for system architecture: ${stdenv.system}";
30
31 # Generated Nix packages
32 packages = import ./generated/packages.nix {
33 inherit fetchurl;
34 };
35
36 # Generated system images
37 system-images-packages-android = import ./generated/system-images-android.nix {
38 inherit fetchurl;
39 };
40
41 system-images-packages-android-tv = import ./generated/system-images-android-tv.nix {
42 inherit fetchurl;
43 };
44
45 system-images-packages-android-wear = import ./generated/system-images-android-wear.nix {
46 inherit fetchurl;
47 };
48
49 system-images-packages-android-wear-cn = import ./generated/system-images-android-wear-cn.nix {
50 inherit fetchurl;
51 };
52
53 system-images-packages-google_apis = import ./generated/system-images-google_apis.nix {
54 inherit fetchurl;
55 };
56
57 system-images-packages-google_apis_playstore = import ./generated/system-images-google_apis_playstore.nix {
58 inherit fetchurl;
59 };
60
61 system-images-packages =
62 lib.recursiveUpdate
63 system-images-packages-android
64 (lib.recursiveUpdate system-images-packages-android-tv
65 (lib.recursiveUpdate system-images-packages-android-wear
66 (lib.recursiveUpdate system-images-packages-android-wear-cn
67 (lib.recursiveUpdate system-images-packages-google_apis system-images-packages-google_apis_playstore))));
68
69 # Generated addons
70 addons = import ./generated/addons.nix {
71 inherit fetchurl;
72 };
73in
74rec {
75 deployAndroidPackage = import ./deploy-androidpackage.nix {
76 inherit stdenv unzip;
77 };
78
79 platform-tools = import ./platform-tools.nix {
80 inherit deployAndroidPackage os autoPatchelfHook pkgs lib;
81 package = packages.platform-tools.${platformToolsVersion};
82 };
83
84 build-tools = map (version:
85 import ./build-tools.nix {
86 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686 lib;
87 package = packages.build-tools.${version};
88 }
89 ) buildToolsVersions;
90
91 docs = deployAndroidPackage {
92 inherit os;
93 package = packages.docs."1";
94 };
95
96 emulator = import ./emulator.nix {
97 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686 lib;
98 package = packages.emulator.${emulatorVersion}.${os};
99 };
100
101 platforms = map (version:
102 deployAndroidPackage {
103 inherit os;
104 package = packages.platforms.${version};
105 }
106 ) platformVersions;
107
108 sources = map (version:
109 deployAndroidPackage {
110 inherit os;
111 package = packages.sources.${version};
112 }
113 ) platformVersions;
114
115 system-images = lib.flatten (map (apiVersion:
116 map (type:
117 map (abiVersion:
118 deployAndroidPackage {
119 inherit os;
120 package = system-images-packages.${apiVersion}.${type}.${abiVersion};
121 # Patch 'google_apis' system images so they're recognized by the sdk.
122 # Without this, `android list targets` shows 'Tag/ABIs : no ABIs' instead
123 # of 'Tag/ABIs : google_apis*/*' and the emulator fails with an ABI-related error.
124 patchInstructions = lib.optionalString (lib.hasPrefix "google_apis" type) ''
125 sed -i '/^Addon.Vendor/d' source.properties
126 '';
127 }
128 ) abiVersions
129 ) systemImageTypes
130 ) platformVersions);
131
132 lldb = map (version:
133 import ./lldb.nix {
134 inherit deployAndroidPackage os autoPatchelfHook pkgs lib;
135 package = packages.lldb.${version};
136 }
137 ) lldbVersions;
138
139 cmake = map (version:
140 import ./cmake.nix {
141 inherit deployAndroidPackage os autoPatchelfHook pkgs lib;
142 package = packages.cmake.${version};
143 }
144 ) cmakeVersions;
145
146 ndk-bundle = import ./ndk-bundle {
147 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs lib platform-tools;
148 package = packages.ndk-bundle.${ndkVersion};
149 };
150
151 google-apis = map (version:
152 deployAndroidPackage {
153 inherit os;
154 package = addons.addons.${version}.google_apis;
155 }
156 ) (builtins.filter (platformVersion: platformVersion < "26") platformVersions); # API level 26 and higher include Google APIs by default
157
158 google-tv-addons = map (version:
159 deployAndroidPackage {
160 inherit os;
161 package = addons.addons.${version}.google_tv_addon;
162 }
163 ) platformVersions;
164
165 # Function that automatically links all plugins for which multiple versions can coexist
166 linkPlugins = {name, plugins}:
167 lib.optionalString (plugins != []) ''
168 mkdir -p ${name}
169 ${lib.concatMapStrings (plugin: ''
170 ln -s ${plugin}/libexec/android-sdk/${name}/* ${name}
171 '') plugins}
172 '';
173
174 # Function that automatically links a plugin for which only one version exists
175 linkPlugin = {name, plugin, check ? true}:
176 lib.optionalString check ''
177 ln -s ${plugin}/libexec/android-sdk/* ${name}
178 '';
179
180 # Links all plugins related to a requested platform
181 linkPlatformPlugins = {name, plugins, check}:
182 lib.optionalString check ''
183 mkdir -p ${name}
184 ${lib.concatMapStrings (plugin: ''
185 ln -s ${plugin}/libexec/android-sdk/${name}/* ${name}
186 '') plugins}
187 ''; # */
188
189 # This derivation deploys the tools package and symlinks all the desired
190 # plugins that we want to use.
191
192 androidsdk = if !licenseAccepted then throw ''
193 You must accept the Android Software Development Kit License Agreement at
194 https://developer.android.com/studio/terms
195 by setting nixpkgs config option 'android_sdk.accept_license = true;'
196 '' else import ./tools.nix {
197 inherit deployAndroidPackage requireFile packages toolsVersion autoPatchelfHook makeWrapper os pkgs pkgs_i686 lib;
198
199 postInstall = ''
200 # Symlink all requested plugins
201
202 ${linkPlugin { name = "platform-tools"; plugin = platform-tools; }}
203 ${linkPlugins { name = "build-tools"; plugins = build-tools; }}
204 ${linkPlugin { name = "emulator"; plugin = emulator; check = includeEmulator; }}
205 ${linkPlugin { name = "docs"; plugin = docs; check = includeDocs; }}
206 ${linkPlugins { name = "platforms"; plugins = platforms; }}
207 ${linkPlatformPlugins { name = "sources"; plugins = sources; check = includeSources; }}
208 ${linkPlugins { name = "lldb"; plugins = lldb; }}
209 ${linkPlugins { name = "cmake"; plugins = cmake; }}
210 ${linkPlugin { name = "ndk-bundle"; plugin = ndk-bundle; check = includeNDK; }}
211
212 ${lib.optionalString includeSystemImages ''
213 mkdir -p system-images
214 ${lib.concatMapStrings (system-image: ''
215 apiVersion=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*))
216 type=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*/*))
217 mkdir -p system-images/$apiVersion/$type
218 ln -s ${system-image}/libexec/android-sdk/system-images/$apiVersion/$type/* system-images/$apiVersion/$type
219 '') system-images}
220 ''}
221
222 ${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleAPIs; }}
223 ${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleTVAddOns; }}
224
225 # Link extras
226 ${lib.concatMapStrings (identifier:
227 let
228 path = addons.extras.${identifier}.path;
229 addon = deployAndroidPackage {
230 inherit os;
231 package = addons.extras.${identifier};
232 };
233 in
234 ''
235 targetDir=$(dirname ${path})
236 mkdir -p $targetDir
237 ln -s ${addon}/libexec/android-sdk/${path} $targetDir
238 '') includeExtras}
239
240 # Expose common executables in bin/
241 mkdir -p $out/bin
242 find $PWD/tools -not -path '*/\.*' -type f -executable -mindepth 1 -maxdepth 1 | while read i
243 do
244 ln -s $i $out/bin
245 done
246
247 find $PWD/tools/bin -not -path '*/\.*' -type f -executable -mindepth 1 -maxdepth 1 | while read i
248 do
249 ln -s $i $out/bin
250 done
251
252 for i in ${platform-tools}/bin/*
253 do
254 ln -s $i $out/bin
255 done
256 '';
257 };
258}