1{stdenv, fetchurl, requireFile, makeWrapper, unzip, 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 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 tarballs found 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 stdenv.lib.recursiveUpdate
63 system-images-packages-android
64 (stdenv.lib.recursiveUpdate system-images-packages-android-tv
65 (stdenv.lib.recursiveUpdate system-images-packages-android-wear
66 (stdenv.lib.recursiveUpdate system-images-packages-android-wear-cn
67 (stdenv.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;
81 inherit (stdenv) lib;
82 package = packages.platform-tools."${platformToolsVersion}";
83 };
84
85 build-tools = map (version:
86 import ./build-tools.nix {
87 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686;
88 inherit (stdenv) lib;
89 package = packages.build-tools."${version}";
90 }
91 ) buildToolsVersions;
92
93 docs = deployAndroidPackage {
94 inherit os;
95 package = packages.docs."1";
96 };
97
98 emulator = import ./emulator.nix {
99 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686;
100 inherit (stdenv) lib;
101 package = packages.emulator."${emulatorVersion}"."${os}";
102 };
103
104 platforms = map (version:
105 deployAndroidPackage {
106 inherit os;
107 package = packages.platforms."${version}";
108 }
109 ) platformVersions;
110
111 sources = map (version:
112 deployAndroidPackage {
113 inherit os;
114 package = packages.sources."${version}";
115 }
116 ) platformVersions;
117
118 system-images = stdenv.lib.flatten (map (apiVersion:
119 map (type:
120 map (abiVersion:
121 deployAndroidPackage {
122 inherit os;
123 package = system-images-packages.${apiVersion}.${type}.${abiVersion};
124 }
125 ) abiVersions
126 ) systemImageTypes
127 ) platformVersions);
128
129 lldb = map (version:
130 import ./lldb.nix {
131 inherit deployAndroidPackage os autoPatchelfHook pkgs;
132 inherit (stdenv) lib;
133 package = packages.lldb."${version}";
134 }
135 ) lldbVersions;
136
137 cmake = map (version:
138 import ./cmake.nix {
139 inherit deployAndroidPackage os autoPatchelfHook pkgs;
140 inherit (stdenv) lib;
141 package = packages.cmake."${version}";
142 }
143 ) cmakeVersions;
144
145 ndk-bundle = import ./ndk-bundle {
146 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs platform-tools;
147 inherit (stdenv) lib;
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 stdenv.lib.optionalString (plugins != []) ''
168 mkdir -p ${name}
169 ${stdenv.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 stdenv.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 stdenv.lib.optionalString check ''
183 mkdir -p ${name}
184 ${stdenv.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;
198 inherit (stdenv) lib;
199
200 postInstall = ''
201 # Symlink all requested plugins
202
203 ${linkPlugin { name = "platform-tools"; plugin = platform-tools; }}
204 ${linkPlugins { name = "build-tools"; plugins = build-tools; }}
205 ${linkPlugin { name = "emulator"; plugin = emulator; check = includeEmulator; }}
206 ${linkPlugin { name = "docs"; plugin = docs; check = includeDocs; }}
207 ${linkPlugins { name = "platforms"; plugins = platforms; }}
208 ${linkPlatformPlugins { name = "sources"; plugins = sources; check = includeSources; }}
209 ${linkPlugins { name = "lldb"; plugins = lldb; }}
210 ${linkPlugins { name = "cmake"; plugins = cmake; }}
211 ${linkPlugin { name = "ndk-bundle"; plugin = ndk-bundle; check = includeNDK; }}
212
213 ${stdenv.lib.optionalString includeSystemImages ''
214 mkdir -p system-images
215 ${stdenv.lib.concatMapStrings (system-image: ''
216 apiVersion=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*))
217 type=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*/*))
218 mkdir -p system-images/$apiVersion/$type
219 ln -s ${system-image}/libexec/android-sdk/system-images/$apiVersion/$type/* system-images/$apiVersion/$type
220 '') system-images}
221 ''}
222
223 ${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleAPIs; }}
224 ${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleTVAddOns; }}
225
226 # Link extras
227 ${stdenv.lib.concatMapStrings (identifier:
228 let
229 path = addons.extras."${identifier}".path;
230 addon = deployAndroidPackage {
231 inherit os;
232 package = addons.extras."${identifier}";
233 };
234 in
235 ''
236 targetDir=$(dirname ${path})
237 mkdir -p $targetDir
238 ln -s ${addon}/libexec/android-sdk/${path} $targetDir
239 '') includeExtras}
240
241 # Expose common executables in bin/
242 mkdir -p $out/bin
243 find $PWD/tools -not -path '*/\.*' -type f -executable -mindepth 1 -maxdepth 1 | while read i
244 do
245 ln -s $i $out/bin
246 done
247
248 find $PWD/tools/bin -not -path '*/\.*' -type f -executable -mindepth 1 -maxdepth 1 | while read i
249 do
250 ln -s $i $out/bin
251 done
252
253 for i in ${platform-tools}/bin/*
254 do
255 ln -s $i $out/bin
256 done
257 '';
258 };
259}