androidenv: simplify updating and track latest

We can figure out the latest version for every package in mkrepo.rb,
instead of repeating ourselves in compose-android-packages.

Track the latest non-preview versions of all packages by default, and
remove version hardcoding everywhere. Enable the update script.
This commit is contained in:
Morgan Jones
2025-02-05 00:17:00 -08:00
committed by Masum Reza
parent 0342bb0a17
commit fb25c379f4
21 changed files with 837 additions and 664 deletions
@@ -6,6 +6,7 @@
jdk,
gnumake,
gawk,
meta,
}:
{
@@ -64,6 +65,8 @@ stdenv.mkDerivation (
mkdir -p $out/nix-support
echo "file binary-dist \"$(echo $out/*.apk)\"" > $out/nix-support/hydra-build-products
'';
inherit meta;
}
// extraArgs
)
@@ -1,4 +1,4 @@
{deployAndroidPackage, lib, stdenv, package, os, autoPatchelfHook, makeWrapper, pkgs, pkgsi686Linux, postInstall}:
{deployAndroidPackage, lib, stdenv, package, os, autoPatchelfHook, makeWrapper, pkgs, pkgsi686Linux, postInstall, meta}:
deployAndroidPackage {
inherit package;
@@ -24,4 +24,6 @@ deployAndroidPackage {
cd $out/libexec/android-sdk
'' + postInstall;
noAuditTmpdir = true; # The checker script gets confused by the build-tools path that is incorrectly identified as a reference to /build
inherit meta;
}
+5 -1
View File
@@ -1,4 +1,4 @@
{deployAndroidPackage, lib, package, os, autoPatchelfHook, pkgs, stdenv}:
{deployAndroidPackage, lib, package, os, autoPatchelfHook, pkgs, stdenv, meta}:
deployAndroidPackage {
inherit package;
@@ -7,4 +7,8 @@ deployAndroidPackage {
patchInstructions = lib.optionalString (os == "linux") ''
autoPatchelf $packageBaseDir/bin
'';
meta = meta // {
license = lib.licenses.bsd3;
};
}
@@ -8,6 +8,7 @@
pkgs,
stdenv,
postInstall,
meta,
}:
deployAndroidPackage {
@@ -46,5 +47,5 @@ deployAndroidPackage {
${postInstall}
'';
meta.license = lib.licenses.unfree;
inherit meta;
}
@@ -1,27 +1,62 @@
{ callPackage, stdenv, lib, fetchurl, ruby, writeText
, licenseAccepted ? false
{ callPackage, stdenv, stdenvNoCC, lib, fetchurl, ruby, writeText
, licenseAccepted ? false, meta
}:
{ cmdLineToolsVersion ? "13.0"
, toolsVersion ? "26.1.1"
, platformToolsVersion ? "35.0.2"
, buildToolsVersions ? [ "35.0.0" ]
{ repoJson ? ./repo.json
, repoXmls ? null
, repo ? (
# Reads the repo JSON. If repoXmls is provided, will build a repo JSON into the Nix store.
if repoXmls != null then
let
# Uses mkrepo.rb to create a repo spec.
mkRepoJson = { packages ? [], images ? [], addons ? [] }: let
mkRepoRuby = (ruby.withPackages (pkgs: with pkgs; [ slop nokogiri ]));
mkRepoRubyArguments = lib.lists.flatten [
(map (package: ["--packages" "${package}"]) packages)
(map (image: ["--images" "${image}"]) images)
(map (addon: ["--addons" "${addon}"]) addons)
];
in
stdenvNoCC.mkDerivation {
name = "androidenv-repo-json";
buildInputs = [ mkRepoRuby ];
preferLocalBuild = true;
unpackPhase = "true";
buildPhase = ''
ruby ${./mkrepo.rb} ${lib.escapeShellArgs mkRepoRubyArguments} > repo.json
'';
installPhase = ''
mv repo.json $out
'';
};
repoXmlSpec = {
packages = repoXmls.packages or [];
images = repoXmls.images or [];
addons = repoXmls.addons or [];
};
in
lib.importJSON "${mkRepoJson repoXmlSpec}"
else
lib.importJSON repoJson
)
, cmdLineToolsVersion ? repo.latest.cmdline-tools
, toolsVersion ? repo.latest.tools
, platformToolsVersion ? repo.latest.platform-tools
, buildToolsVersions ? [ repo.latest.build-tools ]
, includeEmulator ? false
, emulatorVersion ? "35.5.2"
, platformVersions ? []
, emulatorVersion ? repo.latest.emulator
, platformVersions ? [ repo.latest.platforms ]
, includeSources ? false
, includeSystemImages ? false
, systemImageTypes ? [ "google_apis" "google_apis_playstore" ]
, abiVersions ? [ "x86" "x86_64" "armeabi-v7a" "arm64-v8a" ]
, cmakeVersions ? [ ]
, cmakeVersions ? [ repo.latest.cmake ]
, includeNDK ? false
, ndkVersion ? "27.0.12077973"
, ndkVersions ? [ndkVersion]
, ndkVersion ? repo.latest.ndk
, ndkVersions ? [ ndkVersion ]
, useGoogleAPIs ? false
, useGoogleTVAddOns ? false
, includeExtras ? []
, repoJson ? ./repo.json
, repoXmls ? null
, extraLicenses ? []
}:
@@ -42,41 +77,6 @@ let
aarch64-darwin = "aarch64";
}.${stdenv.hostPlatform.system} or "all";
# Uses mkrepo.rb to create a repo spec.
mkRepoJson = { packages ? [], images ? [], addons ? [] }: let
mkRepoRuby = (ruby.withPackages (pkgs: with pkgs; [ slop nokogiri ]));
mkRepoRubyArguments = lib.lists.flatten [
(builtins.map (package: ["--packages" "${package}"]) packages)
(builtins.map (image: ["--images" "${image}"]) images)
(builtins.map (addon: ["--addons" "${addon}"]) addons)
];
in
stdenv.mkDerivation {
name = "androidenv-repo-json";
buildInputs = [ mkRepoRuby ];
preferLocalBuild = true;
unpackPhase = "true";
buildPhase = ''
ruby ${./mkrepo.rb} ${lib.escapeShellArgs mkRepoRubyArguments} > repo.json
'';
installPhase = ''
mv repo.json $out
'';
};
# Reads the repo JSON. If repoXmls is provided, will build a repo JSON into the Nix store.
repo = if repoXmls != null then
let
repoXmlSpec = {
packages = repoXmls.packages or [];
images = repoXmls.images or [];
addons = repoXmls.addons or [];
};
in
lib.importJSON "${mkRepoJson repoXmlSpec}"
else
lib.importJSON repoJson;
# Converts all 'archives' keys in a repo spec to fetchurl calls.
fetchArchives = attrSet:
lib.attrsets.mapAttrsRecursive
@@ -137,9 +137,9 @@ let
"android-sdk-license"
] ++ extraLicenses);
in
rec {
lib.recurseIntoAttrs rec {
deployAndroidPackages = callPackage ./deploy-androidpackages.nix {
inherit stdenv lib mkLicenses;
inherit stdenv lib mkLicenses meta;
};
deployAndroidPackage = ({package, buildInputs ? [], patchInstructions ? "", meta ? {}, ...}@args:
@@ -164,12 +164,12 @@ rec {
'';
platform-tools = callPackage ./platform-tools.nix {
inherit deployAndroidPackage os;
inherit deployAndroidPackage os meta;
package = check-version packages "platform-tools" platformToolsVersion;
};
tools = callPackage ./tools.nix {
inherit deployAndroidPackage os;
inherit deployAndroidPackage os meta;
package = check-version packages "tools" toolsVersion;
postInstall = ''
@@ -180,7 +180,7 @@ rec {
build-tools = map (version:
callPackage ./build-tools.nix {
inherit deployAndroidPackage os;
inherit deployAndroidPackage os meta;
package = check-version packages "build-tools" version;
postInstall = ''
@@ -190,7 +190,7 @@ rec {
) buildToolsVersions;
emulator = lib.optionals includeEmulator (callPackage ./emulator.nix {
inherit deployAndroidPackage os;
inherit deployAndroidPackage os meta;
package = check-version packages "emulator" emulatorVersion;
postInstall = ''
@@ -248,7 +248,7 @@ rec {
cmake = map (version:
callPackage ./cmake.nix {
inherit deployAndroidPackage os;
inherit deployAndroidPackage os meta;
package = check-version packages "cmake" version;
}
) cmakeVersions;
@@ -256,7 +256,7 @@ rec {
# Creates a NDK bundle.
makeNdkBundle = ndkVersion:
callPackage ./ndk-bundle {
inherit deployAndroidPackage os platform-tools;
inherit deployAndroidPackage os platform-tools meta;
package = packages.ndk-bundle.${ndkVersion} or packages.ndk.${ndkVersion};
};
@@ -344,7 +344,7 @@ rec {
by an environment variable for a single invocation of the nix tools.
$ export NIXPKGS_ACCEPT_ANDROID_SDK_LICENSE=1
'' else callPackage ./cmdline-tools.nix {
inherit deployAndroidPackage os;
inherit deployAndroidPackage os meta;
package = cmdline-tools-package;
@@ -369,7 +369,7 @@ rec {
package = addons.extras.${identifier};
path = package.path;
extras = callPackage ./extras.nix {
inherit deployAndroidPackage package os;
inherit deployAndroidPackage package os meta;
};
in
''
+15 -11
View File
@@ -1,21 +1,21 @@
{
lib,
config,
pkgs ? import <nixpkgs> { },
licenseAccepted ?
config.android_sdk.accept_license or (builtins.getEnv "NIXPKGS_ACCEPT_ANDROID_SDK_LICENSE" == "1"),
licenseAccepted ? config.android_sdk.accept_license or (builtins.getEnv "NIXPKGS_ACCEPT_ANDROID_SDK_LICENSE" == "1"),
}:
rec {
lib.recurseIntoAttrs rec {
composeAndroidPackages = pkgs.callPackage ./compose-android-packages.nix {
inherit licenseAccepted;
inherit licenseAccepted meta;
};
buildApp = pkgs.callPackage ./build-app.nix {
inherit composeAndroidPackages;
inherit composeAndroidPackages meta;
};
emulateApp = pkgs.callPackage ./emulate-app.nix {
inherit composeAndroidPackages;
inherit composeAndroidPackages meta;
};
androidPkgs = composeAndroidPackages {
@@ -40,12 +40,16 @@ rec {
system == "x86_64-linux" || system == "x86_64-darwin" || system == "aarch64-darwin";
};
test-suite = pkgs.callPackage ./test-suite.nix { };
test-suite = pkgs.callPackage ./test-suite.nix {
inherit meta;
};
meta = with pkgs.lib; {
description = "Android SDK & sdkmanager";
homepage = "https://developer.android.com/tools/sdkmanager";
maintainers = with maintainers; [
meta = {
homepage = "https://developer.android.com/tools";
description = "Android SDK tools, packaged in Nixpkgs";
license = lib.licenses.unfree;
platforms = lib.platforms.all;
maintainers = with lib.maintainers; [
numinit
hadilq
];
@@ -1,5 +1,5 @@
{stdenv, lib, unzip, mkLicenses}:
{packages, nativeBuildInputs ? [], buildInputs ? [], patchesInstructions ? {}, meta ? {}, ...}@args:
{stdenv, lib, unzip, mkLicenses, meta}:
{packages, nativeBuildInputs ? [], buildInputs ? [], patchesInstructions ? {}, ...}@args:
let
extraParams = removeAttrs args [ "packages" "os" "buildInputs" "nativeBuildInputs" "patchesInstructions" ];
@@ -108,7 +108,5 @@ stdenv.mkDerivation ({
dontPatchELF = true;
dontAutoPatchelf = true;
meta = {
description = lib.concatMapStringsSep "\n" (package: package.displayName) packages;
} // meta;
inherit meta;
} // extraParams)
@@ -3,6 +3,7 @@
stdenv,
lib,
runtimeShell,
meta,
}:
{
name,
@@ -195,5 +196,7 @@ stdenv.mkDerivation {
chmod +x $out/bin/run-test-emulator
'';
meta.mainProgram = "run-test-emulator";
meta = meta // {
mainProgram = "run-test-emulator";
};
}
@@ -1,4 +1,4 @@
{ deployAndroidPackage, lib, stdenv, package, os, autoPatchelfHook, makeWrapper, pkgs, pkgsi686Linux, postInstall }:
{ deployAndroidPackage, lib, stdenv, package, os, autoPatchelfHook, makeWrapper, pkgs, pkgsi686Linux, postInstall, meta }:
deployAndroidPackage {
inherit package;
@@ -69,4 +69,6 @@ deployAndroidPackage {
${postInstall}
'';
dontMoveLib64 = true;
inherit meta;
}
@@ -27,14 +27,6 @@
# 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 = [ "35" ];
systemImageTypes = [ "google_apis" ];
abis = [ "x86_64" ];
};
# If you copy this example out of nixpkgs, something like this will work:
/*
androidEnvNixpkgs = fetchTarball {
@@ -55,10 +47,6 @@ let
};
sdkArgs = {
platformVersions = android.platforms;
abiVersions = android.abis;
systemImageTypes = android.systemImageTypes;
includeSystemImages = true;
includeEmulator = true;
@@ -133,7 +121,7 @@ pkgs.mkShell rec {
echo "installed_packages_section: ''${installed_packages_section}"
packages=(
"build-tools;35.0.0" "cmdline-tools;13.0" \
"build-tools" "cmdline-tools" \
"emulator" "platform-tools" "platforms;android-35" \
"system-images;android-35;google_apis;x86_64"
)
@@ -26,17 +26,6 @@
# 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 = {
versions = {
cmdLineToolsVersion = "13.0";
platformTools = "35.0.2";
buildTools = "35.0.0";
};
platforms = [ "35" ];
};
# If you copy this example out of nixpkgs, something like this will work:
/*
androidEnvNixpkgs = fetchTarball {
@@ -57,10 +46,6 @@ let
};
sdkArgs = {
cmdLineToolsVersion = android.versions.cmdLineToolsVersion;
platformToolsVersion = android.versions.platformTools;
buildToolsVersions = [ android.versions.buildTools ];
platformVersions = android.platforms;
includeNDK = false;
includeSystemImages = false;
includeEmulator = false;
@@ -126,7 +111,7 @@ pkgs.mkShell {
echo "installed_packages_section: ''${installed_packages_section}"
packages=(
"build-tools;35.0.0" "cmdline-tools;13.0" \
"build-tools" "cmdline-tools" \
"platform-tools" "platforms;android-35"
)
@@ -24,28 +24,6 @@
# 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 = {
versions = {
cmdLineToolsVersion = "13.0";
platformTools = "35.0.2";
buildTools = "35.0.0";
ndk = [
"27.0.12077973"
];
cmake = "3.6.4111459";
emulator = "35.1.4";
};
platforms = [ "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" ];
abis = [ "x86_64" ];
extras = [
"extras;google;gcm"
"extras;google;auto"
];
};
# If you copy this example out of nixpkgs, something like this will work:
/*androidEnvNixpkgs = fetchTarball {
name = "androidenv";
@@ -64,23 +42,13 @@ let
};
androidComposition = androidEnv.composeAndroidPackages {
cmdLineToolsVersion = android.versions.cmdLineToolsVersion;
platformToolsVersion = android.versions.platformTools;
buildToolsVersions = [android.versions.buildTools];
platformVersions = android.platforms;
abiVersions = android.abis;
includeSources = true;
includeSystemImages = true;
includeEmulator = true;
emulatorVersion = android.versions.emulator;
includeNDK = true;
ndkVersions = android.versions.ndk;
cmakeVersions = [android.versions.cmake];
useGoogleAPIs = true;
includeExtras = android.extras;
platformVersions = [ "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" ];
# If you want to use a custom repo JSON:
# repoJson = ../repo.json;
@@ -99,6 +67,11 @@ let
addons = [ ../xml/addon2-1.xml ];
};*/
includeExtras = [
"extras;google;gcm"
"extras;google;auto"
];
# Accepting more licenses declaratively:
extraLicenses = [
# Already accepted for you with the global accept_license = true or
@@ -132,12 +105,12 @@ pkgs.mkShell rec {
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle";
# Ensures that we don't have to use a FHS env by using the nix store's aapt2.
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${android.versions.buildTools}/aapt2";
shellHook = ''
# Ensures that we don't have to use a FHS env by using the nix store's aapt2.
export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=$(echo "$ANDROID_SDK_ROOT/build-tools/"*"/aapt2")"
# Add cmake to the path.
cmake_root="$(echo "$ANDROID_SDK_ROOT/cmake/${android.versions.cmake}"*/)"
cmake_root="$(echo "$ANDROID_SDK_ROOT/cmake/"*/)"
export PATH="$cmake_root/bin:$PATH"
# Write out local.properties for Android Studio.
@@ -169,7 +142,7 @@ pkgs.mkShell rec {
# FIXME couldn't find platforms;android-34, even though it's in the correct directory!! sdkmanager's bug?!
packages=(
"build-tools;35.0.0" "platform-tools" \
"build-tools" "platform-tools" \
"platforms;android-23" "platforms;android-24" "platforms;android-25" "platforms;android-26" \
"platforms;android-27" "platforms;android-28" "platforms;android-29" "platforms;android-30" \
"platforms;android-31" "platforms;android-32" "platforms;android-33" "platforms;android-35" \
@@ -6,6 +6,7 @@
autoPatchelfHook,
makeWrapper,
pkgs,
meta,
}:
deployAndroidPackage {
@@ -36,4 +37,6 @@ deployAndroidPackage {
}
fi
'';
inherit meta;
}
@@ -1,3 +0,0 @@
#!/bin/sh
./fetchrepo.sh && ./mkrepo.sh
@@ -1,6 +1,7 @@
#!/usr/bin/env ruby
require 'json'
require 'rubygems'
require 'nokogiri'
require 'slop'
@@ -467,6 +468,18 @@ opts[:addons].each do |filename|
merge result['extras'], extras
end
result['latest'] = {}
result['packages'].each do |name, versions|
max_version = Gem::Version.new('0')
versions.each do |version, package|
if package['license'] == 'android-sdk-license' && Gem::Version.correct?(package['revision'])
package_version = Gem::Version.new(package['revision'])
max_version = package_version if package_version > max_version
end
end
result['latest'][name] = max_version.to_s
end
# As we keep the old packages in the repo JSON file, we should have
# a strategy to remove them at some point!
# So with this variable we claim it's okay to remove them from the
@@ -1,5 +1,5 @@
{ stdenv, lib, pkgs, pkgsHostHost, makeWrapper, autoPatchelfHook
, deployAndroidPackage, package, os, platform-tools
, deployAndroidPackage, package, os, platform-tools, meta
}:
let
@@ -74,4 +74,6 @@ deployAndroidPackage rec {
+ lib.optionalString stdenv.hostPlatform.isLinux patchElfBnaries;
noAuditTmpdir = true; # Audit script gets invoked by the build/ component in the path for the make standalone script
inherit meta;
}
@@ -1,4 +1,4 @@
{deployAndroidPackage, lib, package, os, autoPatchelfHook, pkgs}:
{deployAndroidPackage, lib, package, os, autoPatchelfHook, pkgs, meta}:
deployAndroidPackage {
inherit package;
@@ -17,4 +17,5 @@ deployAndroidPackage {
ln -s $i
done
'';
inherit meta;
}
File diff suppressed because one or more lines are too long
@@ -2,6 +2,7 @@
callPackage,
lib,
stdenv,
meta,
}:
let
examples-shell = callPackage ./examples/shell.nix { licenseAccepted = true; };
@@ -25,5 +26,14 @@ stdenv.mkDerivation {
passthru.tests = all-tests;
meta.timeout = 60;
# This is the toplevel package, so inherit the update script
passthru.updateScript = {
command = [ ./update.sh ];
attrPath = "androidenv.test-suite";
supportedFeatures = [ "commit" ];
};
meta = meta // {
timeout = 60;
};
}
+2 -2
View File
@@ -1,4 +1,4 @@
{deployAndroidPackage, lib, stdenv, package, autoPatchelfHook, makeWrapper, os, pkgs, pkgsi686Linux, postInstall}:
{deployAndroidPackage, lib, stdenv, package, autoPatchelfHook, makeWrapper, os, pkgs, pkgsi686Linux, postInstall, meta}:
deployAndroidPackage {
name = "androidsdk-tools";
@@ -40,5 +40,5 @@ deployAndroidPackage {
${postInstall}
'';
meta.license = lib.licenses.unfree;
inherit meta;
}
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
pushd "$(dirname "$0")" &>/dev/null || exit 1
./fetchrepo.sh && ./mkrepo.sh
popd &>/dev/null