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