summary refs log tree commit diff
path: root/pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix')
-rw-r--r--pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix151
1 files changed, 151 insertions, 0 deletions
diff --git a/pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix b/pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix
new file mode 100644
index 00000000000..ebfe97b856a
--- /dev/null
+++ b/pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix
@@ -0,0 +1,151 @@
+{
+  # To test your changes in androidEnv run `nix-shell android-sdk-with-emulator-shell.nix`
+
+  # If you copy this example out of nixpkgs, use these lines instead of the next.
+  # This example pins nixpkgs: https://nix.dev/tutorials/towards-reproducibility-pinning-nixpkgs.html
+  /*nixpkgsSource ? (builtins.fetchTarball {
+    name = "nixpkgs-20.09";
+    url = "https://github.com/NixOS/nixpkgs/archive/20.09.tar.gz";
+    sha256 = "1wg61h4gndm3vcprdcg7rc4s1v3jkm5xd7lw8r2f67w502y94gcy";
+  }),
+  pkgs ? import nixpkgsSource {
+    config.allowUnfree = true;
+  },
+  */
+
+  # If you want to use the in-tree version of nixpkgs:
+  pkgs ? import ../../../../.. {
+    config.allowUnfree = true;
+  },
+
+  config ? pkgs.config
+}:
+
+# Copy this file to your Android project.
+let
+  # Declaration of versions for everything. This is useful since these
+  # versions may be used in multiple places in this Nix expression.
+  android = {
+    platforms = [ "33" ];
+    systemImageTypes = [ "google_apis" ];
+    abis = [ "arm64-v8a" "x86_64" ];
+  };
+
+  # If you copy this example out of nixpkgs, something like this will work:
+  /*androidEnvNixpkgs = fetchTarball {
+    name = "androidenv";
+    url = "https://github.com/NixOS/nixpkgs/archive/<fill me in from Git>.tar.gz";
+    sha256 = "<fill me in with nix-prefetch-url --unpack>";
+  };
+
+  androidEnv = pkgs.callPackage "${androidEnvNixpkgs}/pkgs/development/mobile/androidenv" {
+    inherit config pkgs;
+    licenseAccepted = true;
+  };*/
+
+  # Otherwise, just use the in-tree androidenv:
+  androidEnv = pkgs.callPackage ./.. {
+    inherit config pkgs;
+    # You probably need to uncomment below line to express consent.
+    # licenseAccepted = true;
+  };
+
+  sdkArgs = {
+    platformVersions = android.platforms;
+    abiVersions = android.abis;
+    systemImageTypes = android.systemImageTypes;
+
+    includeSystemImages = true;
+    includeEmulator = true;
+
+    # Accepting more licenses declaratively:
+    extraLicenses = [
+      # Already accepted for you with the global accept_license = true or
+      # licenseAccepted = true on androidenv.
+      # "android-sdk-license"
+
+      # These aren't, but are useful for more uncommon setups.
+      "android-sdk-preview-license"
+      "android-googletv-license"
+      "android-sdk-arm-dbt-license"
+      "google-gdk-license"
+      "intel-android-extra-license"
+      "intel-android-sysimage-license"
+      "mips-android-sysimage-license"
+    ];
+  };
+
+  androidComposition = androidEnv.composeAndroidPackages sdkArgs;
+  androidEmulator = androidEnv.emulateApp {
+    name = "android-sdk-emulator-demo";
+    sdkExtraArgs = sdkArgs;
+  };
+  androidSdk = androidComposition.androidsdk;
+  platformTools = androidComposition.platform-tools;
+  jdk = pkgs.jdk;
+in
+pkgs.mkShell rec {
+  name = "androidenv-demo";
+  packages = [ androidSdk platformTools androidEmulator jdk pkgs.android-studio ];
+
+  LANG = "C.UTF-8";
+  LC_ALL = "C.UTF-8";
+  JAVA_HOME = jdk.home;
+
+  # Note: ANDROID_HOME is deprecated. Use ANDROID_SDK_ROOT.
+  ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
+  ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle";
+
+  shellHook = ''
+    # Write out local.properties for Android Studio.
+    cat <<EOF > local.properties
+    # This file was automatically generated by nix-shell.
+    sdk.dir=$ANDROID_SDK_ROOT
+    ndk.dir=$ANDROID_NDK_ROOT
+    EOF
+  '';
+
+  passthru.tests = {
+
+    shell-with-emulator-sdkmanager-packages-test = pkgs.runCommand "shell-with-emulator-sdkmanager-packages-test" {
+      nativeBuildInputs = [ androidSdk jdk ];
+    } ''
+      output="$(sdkmanager --list)"
+      installed_packages_section=$(echo "''${output%%Available Packages*}" | awk 'NR>4 {print $1}')
+      echo "installed_packages_section: ''${installed_packages_section}"
+
+      packages=(
+        "build-tools;33.0.1" "cmdline-tools;8.0" \
+        "emulator" "patcher;v4" "platform-tools" "platforms;android-33" \
+        "system-images;android-33;google_apis;arm64-v8a" \
+        "system-images;android-33;google_apis;x86_64"
+      )
+
+      for package in "''${packages[@]}"; do
+        if [[ ! $installed_packages_section =~ "$package" ]]; then
+          echo "$package package was not installed."
+          exit 1
+        fi
+      done
+
+      touch "$out"
+    '';
+
+    shell-with-emulator-avdmanager-create-avd-test = pkgs.runCommand "shell-with-emulator-avdmanager-create-avd-test" {
+      nativeBuildInputs = [ androidSdk androidEmulator jdk ];
+    } ''
+      avdmanager delete avd -n testAVD || true
+      echo "" | avdmanager create avd --force --name testAVD --package 'system-images;android-33;google_apis;x86_64'
+      result=$(avdmanager list avd)
+
+      if [[ ! $result =~ "Name: testAVD" ]]; then
+        echo "avdmanager couldn't create the avd! The output is :''${result}"
+        exit 1
+      fi
+
+      avdmanager delete avd -n testAVD || true
+      touch "$out"
+    '';
+  };
+}
+