diff options
Diffstat (limited to 'pkgs/development/mobile/androidenv/emulate-app.nix')
-rw-r--r-- | pkgs/development/mobile/androidenv/emulate-app.nix | 93 |
1 files changed, 52 insertions, 41 deletions
diff --git a/pkgs/development/mobile/androidenv/emulate-app.nix b/pkgs/development/mobile/androidenv/emulate-app.nix index 2fc753c047a..01669024b3b 100644 --- a/pkgs/development/mobile/androidenv/emulate-app.nix +++ b/pkgs/development/mobile/androidenv/emulate-app.nix @@ -1,33 +1,41 @@ -{stdenv, androidsdk}: +{ composeAndroidPackages, stdenv }: { name, app ? null -, platformVersion ? "8", abiVersion ? "armeabi-v7a", useGoogleAPIs ? false +, platformVersion ? "16", abiVersion ? "armeabi-v7a", systemImageType ? "default", useGoogleAPIs ? false , enableGPU ? false, extraAVDFiles ? [] , package ? null, activity ? null , avdHomeDir ? null -}: +}@args: let - androidsdkComposition = androidsdk { - inherit useGoogleAPIs; + androidSdkArgNames = builtins.attrNames (builtins.functionArgs composeAndroidPackages); + extraParams = removeAttrs args ([ "name" ] ++ androidSdkArgNames); + + # Extract the parameters meant for the Android SDK + androidParams = { platformVersions = [ platformVersion ]; + includeEmulator = true; + includeSystemImages = true; + systemImageTypes = [ systemImageType ]; abiVersions = [ abiVersion ]; }; + + androidsdkComposition = (composeAndroidPackages androidParams).androidsdk; in stdenv.mkDerivation { inherit name; - + buildCommand = '' mkdir -p $out/bin - + cat > $out/bin/run-test-emulator << "EOF" #! ${stdenv.shell} -e - + # We need a TMPDIR if [ "$TMPDIR" = "" ] then export TMPDIR=/tmp fi - + ${if avdHomeDir == null then '' # Store the virtual devices somewhere else, instead of polluting a user's HOME directory export ANDROID_SDK_HOME=$(mktemp -d $TMPDIR/nix-android-vm-XXXX) @@ -35,20 +43,23 @@ stdenv.mkDerivation { mkdir -p "${avdHomeDir}" export ANDROID_SDK_HOME="${avdHomeDir}" ''} - + + # We need to specify the location of the Android SDK root folder + export ANDROID_SDK_ROOT=${androidsdkComposition}/libexec/android-sdk + # We have to look for a free TCP port - + echo "Looking for a free TCP port in range 5554-5584" >&2 - + for i in $(seq 5554 2 5584) do - if [ -z "$(${androidsdkComposition}/libexec/platform-tools/adb devices | grep emulator-$i)" ] + if [ -z "$(${androidsdkComposition}/libexec/android-sdk/platform-tools/adb devices | grep emulator-$i)" ] then port=$i break fi done - + if [ -z "$port" ] then echo "Unfortunately, the emulator port space is exhausted!" >&2 @@ -56,57 +67,57 @@ stdenv.mkDerivation { else echo "We have a free TCP port: $port" >&2 fi - + export ANDROID_SERIAL="emulator-$port" - + # Create a virtual android device for testing if it does not exists - - if [ "$(${androidsdkComposition}/libexec/tools/android list avd | grep 'Name: device')" = "" ] + ${androidsdkComposition}/libexec/android-sdk/tools/android list targets + + if [ "$(${androidsdkComposition}/libexec/android-sdk/tools/android list avd | grep 'Name: device')" = "" ] then # Create a virtual android device - yes "" | ${androidsdkComposition}/libexec/tools/android create avd -n device -t ${if useGoogleAPIs then "'Google Inc.:Google APIs:"+platformVersion+"'" else "android-"+platformVersion} $NIX_ANDROID_AVD_FLAGS - + yes "" | ${androidsdkComposition}/libexec/android-sdk/tools/android create avd -n device -t 1 --abi ${systemImageType}/${abiVersion} $NIX_ANDROID_AVD_FLAGS + ${stdenv.lib.optionalString enableGPU '' # Enable GPU acceleration echo "hw.gpu.enabled=yes" >> $ANDROID_SDK_HOME/.android/avd/device.avd/config.ini ''} - + ${stdenv.lib.concatMapStrings (extraAVDFile: '' ln -sf ${extraAVDFile} $ANDROID_SDK_HOME/.android/avd/device.avd '') extraAVDFiles} fi - + # Launch the emulator - ${androidsdkComposition}/libexec/tools/emulator -avd device -no-boot-anim -port $port $NIX_ANDROID_EMULATOR_FLAGS & + ${androidsdkComposition}/libexec/android-sdk/emulator/emulator -avd device -no-boot-anim -port $port $NIX_ANDROID_EMULATOR_FLAGS & # Wait until the device has completely booted - echo "Waiting until the emulator has booted the device and the package manager is ready..." >&2 - - ${androidsdkComposition}/libexec/platform-tools/adb -s emulator-$port wait-for-device - + + ${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port wait-for-device + echo "Device state has been reached" >&2 - - while [ -z "$(${androidsdkComposition}/libexec/platform-tools/adb -s emulator-$port shell getprop dev.bootcomplete | grep 1)" ] + + while [ -z "$(${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell getprop dev.bootcomplete | grep 1)" ] do sleep 5 done - + echo "dev.bootcomplete property is 1" >&2 - - #while [ -z "$(${androidsdkComposition}/libexec/platform-tools/adb -s emulator-$port shell getprop sys.boot_completed | grep 1)" ] + + #while [ -z "$(${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell getprop sys.boot_completed | grep 1)" ] #do #sleep 5 #done - + #echo "sys.boot_completed property is 1" >&2 - + echo "ready" >&2 - + ${stdenv.lib.optionalString (app != null) '' # Install the App through the debugger, if it has not been installed yet - - if [ -z "${package}" ] || [ "$(${androidsdkComposition}/libexec/platform-tools/adb -s emulator-$port shell pm list packages | grep package:${package})" = "" ] + + if [ -z "${package}" ] || [ "$(${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell pm list packages | grep package:${package})" = "" ] then if [ -d "${app}" ] then @@ -114,13 +125,13 @@ stdenv.mkDerivation { else appPath="${app}" fi - - ${androidsdkComposition}/libexec/platform-tools/adb -s emulator-$port install "$appPath" + + ${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port install "$appPath" fi - + # Start the application ${stdenv.lib.optionalString (package != null && activity != null) '' - ${androidsdkComposition}/libexec/platform-tools/adb -s emulator-$port shell am start -a android.intent.action.MAIN -n ${package}/${activity} + ${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell am start -a android.intent.action.MAIN -n ${package}/${activity} ''} ''} EOF |