1{
2 # If you copy this example out of nixpkgs, use these lines instead of the next.
3 # This example pins nixpkgs: https://nix.dev/tutorials/towards-reproducibility-pinning-nixpkgs.html
4 /*nixpkgsSource ? (builtins.fetchTarball {
5 name = "nixpkgs-20.09";
6 url = "https://github.com/NixOS/nixpkgs/archive/20.09.tar.gz";
7 sha256 = "1wg61h4gndm3vcprdcg7rc4s1v3jkm5xd7lw8r2f67w502y94gcy";
8 }),
9 pkgs ? import nixpkgsSource {
10 config.allowUnfree = true;
11 },
12 */
13
14 # If you want to use the in-tree version of nixpkgs:
15 pkgs ? import ../../../../.. {
16 config.allowUnfree = true;
17 },
18
19 config ? pkgs.config
20}:
21
22# Copy this file to your Android project.
23let
24 # Declaration of versions for everything. This is useful since these
25 # versions may be used in multiple places in this Nix expression.
26 android = {
27 versions = {
28 cmdLineToolsVersion = "9.0";
29 platformTools = "34.0.1";
30 buildTools = "33.0.2";
31 ndk = [
32 "25.1.8937393" # LTS NDK
33 "25.2.9519653"
34 ];
35 cmake = "3.6.4111459";
36 emulator = "33.1.6";
37 };
38
39 platforms = ["23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33"];
40 abis = ["armeabi-v7a" "arm64-v8a"];
41 extras = ["extras;google;gcm"];
42 };
43
44 # If you copy this example out of nixpkgs, something like this will work:
45 /*androidEnvNixpkgs = fetchTarball {
46 name = "androidenv";
47 url = "https://github.com/NixOS/nixpkgs/archive/<fill me in from Git>.tar.gz";
48 sha256 = "<fill me in with nix-prefetch-url --unpack>";
49 };
50
51 androidEnv = pkgs.callPackage "${androidEnvNixpkgs}/pkgs/development/mobile/androidenv" {
52 inherit config pkgs;
53 licenseAccepted = true;
54 };*/
55
56 # Otherwise, just use the in-tree androidenv:
57 androidEnv = pkgs.callPackage ./.. {
58 inherit config pkgs;
59 # You probably need to uncomment below line to express consent.
60 # licenseAccepted = true;
61 };
62
63 androidComposition = androidEnv.composeAndroidPackages {
64 cmdLineToolsVersion = android.versions.cmdLineToolsVersion;
65 platformToolsVersion = android.versions.platformTools;
66 buildToolsVersions = [android.versions.buildTools];
67 platformVersions = android.platforms;
68 abiVersions = android.abis;
69
70 includeSources = true;
71 includeSystemImages = true;
72 includeEmulator = true;
73 emulatorVersion = android.versions.emulator;
74
75 includeNDK = true;
76 ndkVersions = android.versions.ndk;
77 cmakeVersions = [android.versions.cmake];
78
79 useGoogleAPIs = true;
80 includeExtras = android.extras;
81
82 # If you want to use a custom repo JSON:
83 # repoJson = ../repo.json;
84
85 # If you want to use custom repo XMLs:
86 /*repoXmls = {
87 packages = [ ../xml/repository2-1.xml ];
88 images = [
89 ../xml/android-sys-img2-1.xml
90 ../xml/android-tv-sys-img2-1.xml
91 ../xml/android-wear-sys-img2-1.xml
92 ../xml/android-wear-cn-sys-img2-1.xml
93 ../xml/google_apis-sys-img2-1.xml
94 ../xml/google_apis_playstore-sys-img2-1.xml
95 ];
96 addons = [ ../xml/addon2-1.xml ];
97 };*/
98
99 # Accepting more licenses declaratively:
100 extraLicenses = [
101 # Already accepted for you with the global accept_license = true or
102 # licenseAccepted = true on androidenv.
103 # "android-sdk-license"
104
105 # These aren't, but are useful for more uncommon setups.
106 "android-sdk-preview-license"
107 "android-googletv-license"
108 "android-sdk-arm-dbt-license"
109 "google-gdk-license"
110 "intel-android-extra-license"
111 "intel-android-sysimage-license"
112 "mips-android-sysimage-license"
113 ];
114 };
115
116 androidSdk = androidComposition.androidsdk;
117 platformTools = androidComposition.platform-tools;
118 jdk = pkgs.jdk;
119in
120pkgs.mkShell rec {
121 name = "androidenv-demo";
122 packages = [ androidSdk platformTools jdk pkgs.android-studio ];
123
124 LANG = "C.UTF-8";
125 LC_ALL = "C.UTF-8";
126 JAVA_HOME = jdk.home;
127
128 # Note: ANDROID_HOME is deprecated. Use ANDROID_SDK_ROOT.
129 ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
130 ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle";
131
132 # Ensures that we don't have to use a FHS env by using the nix store's aapt2.
133 GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${android.versions.buildTools}/aapt2";
134
135 shellHook = ''
136 # Add cmake to the path.
137 cmake_root="$(echo "$ANDROID_SDK_ROOT/cmake/${android.versions.cmake}"*/)"
138 export PATH="$cmake_root/bin:$PATH"
139
140 # Write out local.properties for Android Studio.
141 cat <<EOF > local.properties
142 # This file was automatically generated by nix-shell.
143 sdk.dir=$ANDROID_SDK_ROOT
144 ndk.dir=$ANDROID_NDK_ROOT
145 cmake.dir=$cmake_root
146 EOF
147 '';
148
149 passthru.tests = {
150
151 shell-sdkmanager-licenses-test = pkgs.runCommand "shell-sdkmanager-licenses-test" {
152 nativeBuildInputs = [ androidSdk jdk ];
153 } ''
154 if [[ ! "$(sdkmanager --licenses)" =~ "All SDK package licenses accepted." ]]; then
155 echo "At least one of SDK package licenses are not accepted."
156 exit 1
157 fi
158 touch $out
159 '';
160
161 shell-sdkmanager-packages-test = pkgs.runCommand "shell-sdkmanager-packages-test" {
162 nativeBuildInputs = [ androidSdk jdk ];
163 } ''
164 output="$(sdkmanager --list)"
165 installed_packages_section=$(echo "''${output%%Available Packages*}" | awk 'NR>4 {print $1}')
166
167 packages=(
168 "build-tools;33.0.2" "platform-tools" \
169 "platforms;android-23" "platforms;android-24" "platforms;android-25" "platforms;android-26" \
170 "platforms;android-27" "platforms;android-28" "platforms;android-29" "platforms;android-30" \
171 "platforms;android-31" "platforms;android-32" "platforms;android-33" \
172 "sources;android-23" "sources;android-24" "sources;android-25" "sources;android-26" \
173 "sources;android-27" "sources;android-28" "sources;android-29" "sources;android-30" \
174 "sources;android-31" "sources;android-32" "sources;android-33" \
175 "system-images;android-28;google_apis_playstore;arm64-v8a" \
176 "system-images;android-29;google_apis_playstore;arm64-v8a" \
177 "system-images;android-30;google_apis_playstore;arm64-v8a" \
178 "system-images;android-31;google_apis_playstore;arm64-v8a" \
179 "system-images;android-32;google_apis_playstore;arm64-v8a" \
180 "system-images;android-33;google_apis_playstore;arm64-v8a"
181 )
182
183 for package in "''${packages[@]}"; do
184 if [[ ! $installed_packages_section =~ "$package" ]]; then
185 echo "$package package was not installed."
186 exit 1
187 fi
188 done
189
190 touch "$out"
191 '';
192 };
193}
194