Merge pull request #66747 from erikarvstedt/androidenv-fixes

Androidenv fixes
This commit is contained in:
Matthew Bauer 2019-08-20 13:38:01 -04:00 committed by GitHub
commit 5be571eea1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 61 additions and 66 deletions

View file

@ -185,10 +185,9 @@ with import <nixpkgs> {};
androidenv.emulateApp { androidenv.emulateApp {
name = "emulate-MyAndroidApp"; name = "emulate-MyAndroidApp";
platformVersion = "24"; platformVersion = "28";
abiVersion = "armeabi-v7a"; # mips, x86 or x86_64 abiVersion = "x86_64"; # armeabi-v7a, mips, x86
systemImageType = "default"; systemImageType = "google_apis_playstore";
useGoogleAPIs = false;
} }
``` ```
@ -201,7 +200,7 @@ with import <nixpkgs> {};
androidenv.emulateApp { androidenv.emulateApp {
name = "emulate-MyAndroidApp"; name = "emulate-MyAndroidApp";
platformVersion = "24"; platformVersion = "24";
abiVersion = "armeabi-v7a"; # mips, x86 or x86_64 abiVersion = "armeabi-v7a"; # mips, x86, x86_64
systemImageType = "default"; systemImageType = "default";
useGoogleAPIs = false; useGoogleAPIs = false;
app = ./MyApp.apk; app = ./MyApp.apk;

View file

@ -1,4 +1,4 @@
{ composeAndroidPackages, stdenv, ant, jdk, gnumake, gawk }: { composeAndroidPackages, stdenv, lib, ant, jdk, gnumake, gawk }:
{ name { name
, release ? false, keyStore ? null, keyAlias ? null, keyStorePassword ? null, keyAliasPassword ? null , release ? false, keyStore ? null, keyAlias ? null, keyStorePassword ? null, keyAliasPassword ? null
@ -16,11 +16,11 @@ let
extraArgs = removeAttrs args ([ "name" ] ++ builtins.attrNames androidSdkFormalArgs); extraArgs = removeAttrs args ([ "name" ] ++ builtins.attrNames androidSdkFormalArgs);
in in
stdenv.mkDerivation ({ stdenv.mkDerivation ({
name = stdenv.lib.replaceChars [" "] [""] name; # Android APKs may contain white spaces in their names, but Nix store paths cannot name = lib.replaceChars [" "] [""] name; # Android APKs may contain white spaces in their names, but Nix store paths cannot
ANDROID_HOME = "${androidsdk}/libexec/android-sdk"; ANDROID_HOME = "${androidsdk}/libexec/android-sdk";
buildInputs = [ jdk ant ]; buildInputs = [ jdk ant ];
buildPhase = '' buildPhase = ''
${stdenv.lib.optionalString release '' ${lib.optionalString release ''
# Provide key singing attributes # Provide key singing attributes
( echo "key.store=${keyStore}" ( echo "key.store=${keyStore}"
echo "key.alias=${keyAlias}" echo "key.alias=${keyAlias}"
@ -31,7 +31,7 @@ stdenv.mkDerivation ({
export ANDROID_SDK_HOME=`pwd` # Key files cannot be stored in the user's home directory. This overrides it. export ANDROID_SDK_HOME=`pwd` # Key files cannot be stored in the user's home directory. This overrides it.
${stdenv.lib.optionalString (args ? includeNDK && args.includeNDK) '' ${lib.optionalString (args ? includeNDK && args.includeNDK) ''
export GNUMAKE=${gnumake}/bin/make export GNUMAKE=${gnumake}/bin/make
export NDK_HOST_AWK=${gawk}/bin/gawk export NDK_HOST_AWK=${gawk}/bin/gawk
${androidsdk}/libexec/android-sdk/ndk-bundle/ndk-build ${androidsdk}/libexec/android-sdk/ndk-bundle/ndk-build

View file

@ -21,7 +21,7 @@
}: }:
let let
inherit (pkgs) stdenv fetchurl makeWrapper unzip; inherit (pkgs) stdenv lib fetchurl makeWrapper unzip;
# Determine the Android os identifier from Nix's system identifier # Determine the Android os identifier from Nix's system identifier
os = if stdenv.system == "x86_64-linux" then "linux" os = if stdenv.system == "x86_64-linux" then "linux"
@ -59,12 +59,12 @@ let
}; };
system-images-packages = system-images-packages =
stdenv.lib.recursiveUpdate lib.recursiveUpdate
system-images-packages-android system-images-packages-android
(stdenv.lib.recursiveUpdate system-images-packages-android-tv (lib.recursiveUpdate system-images-packages-android-tv
(stdenv.lib.recursiveUpdate system-images-packages-android-wear (lib.recursiveUpdate system-images-packages-android-wear
(stdenv.lib.recursiveUpdate system-images-packages-android-wear-cn (lib.recursiveUpdate system-images-packages-android-wear-cn
(stdenv.lib.recursiveUpdate system-images-packages-google_apis system-images-packages-google_apis_playstore)))); (lib.recursiveUpdate system-images-packages-google_apis system-images-packages-google_apis_playstore))));
# Generated addons # Generated addons
addons = import ./generated/addons.nix { addons = import ./generated/addons.nix {
@ -77,15 +77,13 @@ rec {
}; };
platform-tools = import ./platform-tools.nix { platform-tools = import ./platform-tools.nix {
inherit deployAndroidPackage os autoPatchelfHook pkgs; inherit deployAndroidPackage os autoPatchelfHook pkgs lib;
inherit (stdenv) lib;
package = packages.platform-tools."${platformToolsVersion}"; package = packages.platform-tools."${platformToolsVersion}";
}; };
build-tools = map (version: build-tools = map (version:
import ./build-tools.nix { import ./build-tools.nix {
inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686; inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686 lib;
inherit (stdenv) lib;
package = packages.build-tools."${version}"; package = packages.build-tools."${version}";
} }
) buildToolsVersions; ) buildToolsVersions;
@ -96,8 +94,7 @@ rec {
}; };
emulator = import ./emulator.nix { emulator = import ./emulator.nix {
inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686; inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686 lib;
inherit (stdenv) lib;
package = packages.emulator."${emulatorVersion}"."${os}"; package = packages.emulator."${emulatorVersion}"."${os}";
}; };
@ -115,12 +112,18 @@ rec {
} }
) platformVersions; ) platformVersions;
system-images = stdenv.lib.flatten (map (apiVersion: system-images = lib.flatten (map (apiVersion:
map (type: map (type:
map (abiVersion: map (abiVersion:
deployAndroidPackage { deployAndroidPackage {
inherit os; inherit os;
package = system-images-packages.${apiVersion}.${type}.${abiVersion}; package = system-images-packages.${apiVersion}.${type}.${abiVersion};
# Patch 'google_apis' system images so they're recognized by the sdk.
# Without this, `android list targets` shows 'Tag/ABIs : no ABIs' instead
# of 'Tag/ABIs : google_apis*/*' and the emulator fails with an ABI-related error.
patchInstructions = lib.optionalString (lib.hasPrefix "google_apis" type) ''
sed -i '/^Addon.Vendor/d' source.properties
'';
} }
) abiVersions ) abiVersions
) systemImageTypes ) systemImageTypes
@ -128,23 +131,20 @@ rec {
lldb = map (version: lldb = map (version:
import ./lldb.nix { import ./lldb.nix {
inherit deployAndroidPackage os autoPatchelfHook pkgs; inherit deployAndroidPackage os autoPatchelfHook pkgs lib;
inherit (stdenv) lib;
package = packages.lldb."${version}"; package = packages.lldb."${version}";
} }
) lldbVersions; ) lldbVersions;
cmake = map (version: cmake = map (version:
import ./cmake.nix { import ./cmake.nix {
inherit deployAndroidPackage os autoPatchelfHook pkgs; inherit deployAndroidPackage os autoPatchelfHook pkgs lib;
inherit (stdenv) lib;
package = packages.cmake."${version}"; package = packages.cmake."${version}";
} }
) cmakeVersions; ) cmakeVersions;
ndk-bundle = import ./ndk-bundle { ndk-bundle = import ./ndk-bundle {
inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs platform-tools; inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs lib platform-tools;
inherit (stdenv) lib;
package = packages.ndk-bundle."${ndkVersion}"; package = packages.ndk-bundle."${ndkVersion}";
}; };
@ -164,24 +164,24 @@ rec {
# Function that automatically links all plugins for which multiple versions can coexist # Function that automatically links all plugins for which multiple versions can coexist
linkPlugins = {name, plugins}: linkPlugins = {name, plugins}:
stdenv.lib.optionalString (plugins != []) '' lib.optionalString (plugins != []) ''
mkdir -p ${name} mkdir -p ${name}
${stdenv.lib.concatMapStrings (plugin: '' ${lib.concatMapStrings (plugin: ''
ln -s ${plugin}/libexec/android-sdk/${name}/* ${name} ln -s ${plugin}/libexec/android-sdk/${name}/* ${name}
'') plugins} '') plugins}
''; '';
# Function that automatically links a plugin for which only one version exists # Function that automatically links a plugin for which only one version exists
linkPlugin = {name, plugin, check ? true}: linkPlugin = {name, plugin, check ? true}:
stdenv.lib.optionalString check '' lib.optionalString check ''
ln -s ${plugin}/libexec/android-sdk/* ${name} ln -s ${plugin}/libexec/android-sdk/* ${name}
''; '';
# Links all plugins related to a requested platform # Links all plugins related to a requested platform
linkPlatformPlugins = {name, plugins, check}: linkPlatformPlugins = {name, plugins, check}:
stdenv.lib.optionalString check '' lib.optionalString check ''
mkdir -p ${name} mkdir -p ${name}
${stdenv.lib.concatMapStrings (plugin: '' ${lib.concatMapStrings (plugin: ''
ln -s ${plugin}/libexec/android-sdk/${name}/* ${name} ln -s ${plugin}/libexec/android-sdk/${name}/* ${name}
'') plugins} '') plugins}
''; # */ ''; # */
@ -194,8 +194,7 @@ rec {
https://developer.android.com/studio/terms https://developer.android.com/studio/terms
by setting nixpkgs config option 'android_sdk.accept_license = true;' by setting nixpkgs config option 'android_sdk.accept_license = true;'
'' else import ./tools.nix { '' else import ./tools.nix {
inherit deployAndroidPackage requireFile packages toolsVersion autoPatchelfHook makeWrapper os pkgs pkgs_i686; inherit deployAndroidPackage requireFile packages toolsVersion autoPatchelfHook makeWrapper os pkgs pkgs_i686 lib;
inherit (stdenv) lib;
postInstall = '' postInstall = ''
# Symlink all requested plugins # Symlink all requested plugins
@ -210,9 +209,9 @@ rec {
${linkPlugins { name = "cmake"; plugins = cmake; }} ${linkPlugins { name = "cmake"; plugins = cmake; }}
${linkPlugin { name = "ndk-bundle"; plugin = ndk-bundle; check = includeNDK; }} ${linkPlugin { name = "ndk-bundle"; plugin = ndk-bundle; check = includeNDK; }}
${stdenv.lib.optionalString includeSystemImages '' ${lib.optionalString includeSystemImages ''
mkdir -p system-images mkdir -p system-images
${stdenv.lib.concatMapStrings (system-image: '' ${lib.concatMapStrings (system-image: ''
apiVersion=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*)) apiVersion=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*))
type=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*/*)) type=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*/*))
mkdir -p system-images/$apiVersion/$type mkdir -p system-images/$apiVersion/$type
@ -224,7 +223,7 @@ rec {
${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleTVAddOns; }} ${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleTVAddOns; }}
# Link extras # Link extras
${stdenv.lib.concatMapStrings (identifier: ${lib.concatMapStrings (identifier:
let let
path = addons.extras."${identifier}".path; path = addons.extras."${identifier}".path;
addon = deployAndroidPackage { addon = deployAndroidPackage {

View file

@ -10,12 +10,12 @@ rec {
}; };
buildApp = import ./build-app.nix { buildApp = import ./build-app.nix {
inherit (pkgs) stdenv jdk ant gnumake gawk; inherit (pkgs) stdenv lib jdk ant gnumake gawk;
inherit composeAndroidPackages; inherit composeAndroidPackages;
}; };
emulateApp = import ./emulate-app.nix { emulateApp = import ./emulate-app.nix {
inherit (pkgs) stdenv; inherit (pkgs) stdenv lib;
inherit composeAndroidPackages; inherit composeAndroidPackages;
}; };

View file

@ -1,24 +1,21 @@
{ composeAndroidPackages, stdenv }: { composeAndroidPackages, stdenv, lib }:
{ name, app ? null { name, app ? null
, platformVersion ? "16", abiVersion ? "armeabi-v7a", systemImageType ? "default", useGoogleAPIs ? false , platformVersion ? "16", abiVersion ? "armeabi-v7a", systemImageType ? "default"
, enableGPU ? false, extraAVDFiles ? [] , enableGPU ? false, extraAVDFiles ? []
, package ? null, activity ? null , package ? null, activity ? null
, avdHomeDir ? null , avdHomeDir ? null, sdkExtraArgs ? {}
}@args: }:
let let
androidSdkArgNames = builtins.attrNames (builtins.functionArgs composeAndroidPackages); sdkArgs = {
# Extract the parameters meant for the Android SDK
androidParams = {
platformVersions = [ platformVersion ]; platformVersions = [ platformVersion ];
includeEmulator = true; includeEmulator = true;
includeSystemImages = true; includeSystemImages = true;
systemImageTypes = [ systemImageType ]; systemImageTypes = [ systemImageType ];
abiVersions = [ abiVersion ]; abiVersions = [ abiVersion ];
}; } // sdkExtraArgs;
androidsdkComposition = (composeAndroidPackages androidParams).androidsdk; sdk = (composeAndroidPackages sdkArgs).androidsdk;
in in
stdenv.mkDerivation { stdenv.mkDerivation {
inherit name; inherit name;
@ -44,7 +41,7 @@ stdenv.mkDerivation {
''} ''}
# We need to specify the location of the Android SDK root folder # We need to specify the location of the Android SDK root folder
export ANDROID_SDK_ROOT=${androidsdkComposition}/libexec/android-sdk export ANDROID_SDK_ROOT=${sdk}/libexec/android-sdk
# We have to look for a free TCP port # We have to look for a free TCP port
@ -52,7 +49,7 @@ stdenv.mkDerivation {
for i in $(seq 5554 2 5584) for i in $(seq 5554 2 5584)
do do
if [ -z "$(${androidsdkComposition}/libexec/android-sdk/platform-tools/adb devices | grep emulator-$i)" ] if [ -z "$(${sdk}/libexec/android-sdk/platform-tools/adb devices | grep emulator-$i)" ]
then then
port=$i port=$i
break break
@ -70,41 +67,41 @@ stdenv.mkDerivation {
export ANDROID_SERIAL="emulator-$port" export ANDROID_SERIAL="emulator-$port"
# Create a virtual android device for testing if it does not exists # Create a virtual android device for testing if it does not exists
${androidsdkComposition}/libexec/android-sdk/tools/android list targets ${sdk}/libexec/android-sdk/tools/android list targets
if [ "$(${androidsdkComposition}/libexec/android-sdk/tools/android list avd | grep 'Name: device')" = "" ] if [ "$(${sdk}/libexec/android-sdk/tools/android list avd | grep 'Name: device')" = "" ]
then then
# Create a virtual android device # Create a virtual android device
yes "" | ${androidsdkComposition}/libexec/android-sdk/tools/android create avd -n device -t 1 --abi ${systemImageType}/${abiVersion} $NIX_ANDROID_AVD_FLAGS yes "" | ${sdk}/libexec/android-sdk/tools/android create avd -n device -t 1 --abi ${systemImageType}/${abiVersion} $NIX_ANDROID_AVD_FLAGS
${stdenv.lib.optionalString enableGPU '' ${lib.optionalString enableGPU ''
# Enable GPU acceleration # Enable GPU acceleration
echo "hw.gpu.enabled=yes" >> $ANDROID_SDK_HOME/.android/avd/device.avd/config.ini echo "hw.gpu.enabled=yes" >> $ANDROID_SDK_HOME/.android/avd/device.avd/config.ini
''} ''}
${stdenv.lib.concatMapStrings (extraAVDFile: '' ${lib.concatMapStrings (extraAVDFile: ''
ln -sf ${extraAVDFile} $ANDROID_SDK_HOME/.android/avd/device.avd ln -sf ${extraAVDFile} $ANDROID_SDK_HOME/.android/avd/device.avd
'') extraAVDFiles} '') extraAVDFiles}
fi fi
# Launch the emulator # Launch the emulator
${androidsdkComposition}/libexec/android-sdk/emulator/emulator -avd device -no-boot-anim -port $port $NIX_ANDROID_EMULATOR_FLAGS & ${sdk}/libexec/android-sdk/emulator/emulator -avd device -no-boot-anim -port $port $NIX_ANDROID_EMULATOR_FLAGS &
# Wait until the device has completely booted # Wait until the device has completely booted
echo "Waiting until the emulator has booted the device and the package manager is ready..." >&2 echo "Waiting until the emulator has booted the device and the package manager is ready..." >&2
${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port wait-for-device ${sdk}/libexec/android-sdk/platform-tools/adb -s emulator-$port wait-for-device
echo "Device state has been reached" >&2 echo "Device state has been reached" >&2
while [ -z "$(${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell getprop dev.bootcomplete | grep 1)" ] while [ -z "$(${sdk}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell getprop dev.bootcomplete | grep 1)" ]
do do
sleep 5 sleep 5
done done
echo "dev.bootcomplete property is 1" >&2 echo "dev.bootcomplete property is 1" >&2
#while [ -z "$(${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell getprop sys.boot_completed | grep 1)" ] #while [ -z "$(${sdk}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell getprop sys.boot_completed | grep 1)" ]
#do #do
#sleep 5 #sleep 5
#done #done
@ -113,10 +110,10 @@ stdenv.mkDerivation {
echo "ready" >&2 echo "ready" >&2
${stdenv.lib.optionalString (app != null) '' ${lib.optionalString (app != null) ''
# Install the App through the debugger, if it has not been installed yet # Install the App through the debugger, if it has not been installed yet
if [ -z "${package}" ] || [ "$(${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell pm list packages | grep package:${package})" = "" ] if [ -z "${package}" ] || [ "$(${sdk}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell pm list packages | grep package:${package})" = "" ]
then then
if [ -d "${app}" ] if [ -d "${app}" ]
then then
@ -125,12 +122,12 @@ stdenv.mkDerivation {
appPath="${app}" appPath="${app}"
fi fi
${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port install "$appPath" ${sdk}/libexec/android-sdk/platform-tools/adb -s emulator-$port install "$appPath"
fi fi
# Start the application # Start the application
${stdenv.lib.optionalString (package != null && activity != null) '' ${lib.optionalString (package != null && activity != null) ''
${androidsdkComposition}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell am start -a android.intent.action.MAIN -n ${package}/${activity} ${sdk}/libexec/android-sdk/platform-tools/adb -s emulator-$port shell am start -a android.intent.action.MAIN -n ${package}/${activity}
''} ''}
''} ''}
EOF EOF