Merge pull request #89775 from numinit/update-androidenv

This commit is contained in:
Jörg Thalheim 2021-01-10 15:09:36 +00:00 committed by GitHub
commit 51894963cb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 6158 additions and 5066 deletions

View file

@ -13,21 +13,19 @@ with import <nixpkgs> {};
let
androidComposition = androidenv.composeAndroidPackages {
toolsVersion = "25.2.5";
platformToolsVersion = "27.0.1";
buildToolsVersions = [ "27.0.3" ];
toolsVersion = "26.1.1";
platformToolsVersion = "30.0.5";
buildToolsVersions = [ "30.0.3" ];
includeEmulator = false;
emulatorVersion = "27.2.0";
platformVersions = [ "24" ];
emulatorVersion = "30.3.4";
platformVersions = [ "28" "29" "30" ];
includeSources = false;
includeDocs = false;
includeSystemImages = false;
systemImageTypes = [ "default" ];
abiVersions = [ "armeabi-v7a" ];
lldbVersions = [ "2.0.2558144" ];
cmakeVersions = [ "3.6.4111459" ];
includeNDK = false;
ndkVersion = "16.1.4479499";
systemImageTypes = [ "google_apis_playstore" ];
abiVersions = [ "armeabi-v7a" "arm64-v8a" ];
cmakeVersions = [ "3.10.2" ];
includeNDK = true;
ndkVersion = "22.0.7026061";
useGoogleAPIs = false;
useGoogleTVAddOns = false;
includeExtras = [
@ -46,13 +44,11 @@ The following parameters are supported:
* `toolsVersion`, specifies the version of the tools package to use
* `platformsToolsVersion` specifies the version of the `platform-tools` plugin
* `buildToolsVersion` specifies the versions of the `build-tools` plugins to
* `buildToolsVersions` specifies the versions of the `build-tools` plugins to
use.
* `includeEmulator` specifies whether to deploy the emulator package (`false`
by default). When enabled, the version of the emulator to deploy can be
specified by setting the `emulatorVersion` parameter.
* `includeDocs` specifies whether the documentation catalog should be included.
* `lldbVersions` specifies what LLDB versions should be deployed.
* `cmakeVersions` specifies which CMake versions should be deployed.
* `includeNDK` specifies that the Android NDK bundle should be included.
Defaults to: `false`.
@ -82,6 +78,38 @@ For each requested system image we can specify the following options:
Most of the function arguments have reasonable default settings.
You can specify license names:
* `extraLicenses` is a list of of license names.
You can get these names from repo.json or `querypackages.sh licenses`. The SDK
license (`android-sdk-license`) is accepted for you if you set accept_license
to true. If you are doing something like working with preview SDKs, you will
want to add `android-sdk-preview-license` or whichever license applies here.
Additionally, you can override the repositories that composeAndroidPackages will
pull from:
* `repoJson` specifies a path to a generated repo.json file. You can generate this
by running `generate.sh`, which in turn will call into `mkrepo.rb`.
* `repoXmls` is an attribute set containing paths to repo XML files. If specified,
it takes priority over `repoJson`, and will trigger a local build writing out a
repo.json to the Nix store based on the given repository XMLs.
```nix
repoXmls = {
packages = [ ./xml/repository2-1.xml ];
images = [
./xml/android-sys-img2-1.xml
./xml/android-tv-sys-img2-1.xml
./xml/android-wear-sys-img2-1.xml
./xml/android-wear-cn-sys-img2-1.xml
./xml/google_apis-sys-img2-1.xml
./xml/google_apis_playstore-sys-img2-1.xml
];
addons = [ ./xml/addon2-1.xml ];
};
```
When building the above expression with:
```bash
@ -104,8 +132,8 @@ in
androidComposition.platform-tools
```
Using predefine Android package compositions
--------------------------------------------
Using predefined Android package compositions
---------------------------------------------
In addition to composing an Android package set manually, it is also possible
to use a predefined composition that contains all basic packages for a specific
Android version, such as version 9.0 (API-level 28).
@ -209,27 +237,104 @@ androidenv.emulateApp {
In addition to prebuilt APKs, you can also bind the APK parameter to a
`buildApp {}` function invocation shown in the previous example.
Notes on environment variables in Android projects
--------------------------------------------------
* `ANDROID_SDK_ROOT` should point to the Android SDK. In your Nix expressions, this should be
`${androidComposition.androidsdk}/libexec/android-sdk`. Note that `ANDROID_HOME` is deprecated,
but if you rely on tools that need it, you can export it too.
* `ANDROID_NDK_ROOT` should point to the Android NDK, if you're doing NDK development.
In your Nix expressions, this should be `${ANDROID_SDK_ROOT}/ndk-bundle`.
If you are running the Android Gradle plugin, you need to export GRADLE_OPTS to override aapt2
to point to the aapt2 binary in the Nix store as well, or use a FHS environment so the packaged
aapt2 can run. If you don't want to use a FHS environment, something like this should work:
```nix
let
buildToolsVersion = "30.0.3";
# Use buildToolsVersion when you define androidComposition
androidComposition = <...>;
in
pkgs.mkShell rec {
ANDROID_SDK_ROOT = "${androidComposition.androidsdk}/libexec/android-sdk";
ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle";
# Use the same buildToolsVersion here
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${buildToolsVersion}/aapt2";
}
```
If you are using cmake, you need to add it to PATH in a shell hook or FHS env profile.
The path is suffixed with a build number, but properly prefixed with the version.
So, something like this should suffice:
```nix
let
cmakeVersion = "3.10.2";
# Use cmakeVersion when you define androidComposition
androidComposition = <...>;
in
pkgs.mkShell rec {
ANDROID_SDK_ROOT = "${androidComposition.androidsdk}/libexec/android-sdk";
ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle";
# Use the same cmakeVersion here
shellHook = ''
export PATH="$(echo "$ANDROID_SDK_ROOT/cmake/${cmakeVersion}".*/bin):$PATH"
'';
}
```
Note that running Android Studio with ANDROID_SDK_ROOT set will automatically write a
`local.properties` file with `sdk.dir` set to $ANDROID_SDK_ROOT if one does not already
exist. If you are using the NDK as well, you may have to add `ndk.dir` to this file.
An example shell.nix that does all this for you is provided in examples/shell.nix.
This shell.nix includes a shell hook that overwrites local.properties with the correct
sdk.dir and ndk.dir values. This will ensure that the SDK and NDK directories will
both be correct when you run Android Studio inside nix-shell.
Notes on improving build.gradle compatibility
---------------------------------------------
Ensure that your buildToolsVersion and ndkVersion match what is declared in androidenv.
If you are using cmake, make sure its declared version is correct too.
Otherwise, you may get cryptic errors from aapt2 and the Android Gradle plugin warning
that it cannot install the build tools because the SDK directory is not writeable.
```gradle
android {
buildToolsVersion "30.0.3"
ndkVersion = "22.0.7026061"
externalNativeBuild {
cmake {
version "3.10.2"
}
}
}
```
Querying the available versions of each plugin
----------------------------------------------
When using any of the previously shown functions, it may be a bit inconvenient
to find out what options are supported, since the Android SDK provides many
plugins.
repo.json provides all the options in one file now.
A shell script in the `pkgs/development/mobile/androidenv/` sub directory can be used to retrieve all
A shell script in the `pkgs/development/mobile/androidenv/` subdirectory can be used to retrieve all
possible options:
```bash
sh ./querypackages.sh packages build-tools
./querypackages.sh packages
```
The above command-line instruction queries all build-tools versions in the
generated `packages.nix` expression.
The above command-line instruction queries all package versions in repo.json.
Updating the generated expressions
----------------------------------
Most of the Nix expressions are generated from XML files that the Android
package manager uses. To update the expressions run the `generate.sh` script
that is stored in the `pkgs/development/mobile/androidenv/` sub directory:
repo.json is generated from XML files that the Android Studio package manager uses.
To update the expressions run the `generate.sh` script that is stored in the
`pkgs/development/mobile/androidenv/` subdirectory:
```bash
./generate.sh

View file

@ -362,6 +362,22 @@ http://some.json-exporter.host:7979/probe?target=https://example.com/some/json/e
official documentation</link> of the json_exporter.
</para>
</listitem>
<listitem>
<para>
Androidenv was updated, removing the <literal>includeDocs</literal> and <literal>lldbVersions</literal>
arguments. Docs only covered a single version of the Android SDK, LLDB is now bundled with the NDK,
and both are no longer available to download from the Android package repositories. Additionally, since
the package lists have been updated, some older versions of Android packages may not be bundled. If you
depend on older versions of Android packages, we recommend overriding the repo.
</para>
<para>
Android packages are now loaded from a repo.json file created by parsing Android repo XML files. The arguments
<literal>repoJson</literal> and <literal>repoXmls</literal> have been added to allow overriding the built-in
androidenv repo.json with your own. Additionally, license files are now written to allow compatibility
with Gradle-based tools, and the <literal>extraLicenses</literal> argument has been added to accept more
SDK licenses if your project requires it. See the androidenv documentation for more details.
</para>
</listitem>
</itemizedlist>
</section>

View file

@ -0,0 +1,2 @@
/xml
local.properties

View file

@ -2,8 +2,8 @@
deployAndroidPackage {
inherit package os;
buildInputs = [ autoPatchelfHook ]
++ lib.optional (os == "linux") [ pkgs.stdenv.glibc pkgs.stdenv.cc.cc ];
nativeBuildInputs = [ autoPatchelfHook ];
buildInputs = lib.optional (os == "linux") [ pkgs.stdenv.glibc pkgs.stdenv.cc.cc pkgs.ncurses5 ];
patchInstructions = lib.optionalString (os == "linux") ''
autoPatchelf $packageBaseDir/bin
'';

View file

@ -1,23 +1,26 @@
{requireFile, autoPatchelfHook, pkgs, pkgsHostHost, pkgs_i686, licenseAccepted ? false}:
{ requireFile, autoPatchelfHook, pkgs, pkgsHostHost, pkgs_i686
, licenseAccepted ? false
}:
{ toolsVersion ? "25.2.5"
, platformToolsVersion ? "29.0.6"
, buildToolsVersions ? [ "28.0.3" ]
{ toolsVersion ? "26.1.1"
, platformToolsVersion ? "30.0.5"
, buildToolsVersions ? [ "30.0.3" ]
, includeEmulator ? false
, emulatorVersion ? "30.0.3"
, emulatorVersion ? "30.3.4"
, platformVersions ? []
, includeSources ? false
, includeDocs ? false
, includeSystemImages ? false
, systemImageTypes ? [ "default" ]
, systemImageTypes ? [ "google_apis_playstore" ]
, abiVersions ? [ "armeabi-v7a" ]
, lldbVersions ? [ ]
, cmakeVersions ? [ ]
, includeNDK ? false
, ndkVersion ? "21.0.6113669"
, ndkVersion ? "22.0.7026061"
, useGoogleAPIs ? false
, useGoogleTVAddOns ? false
, includeExtras ? []
, repoJson ? ./repo.json
, repoXmls ? null
, extraLicenses ? []
}:
let
@ -28,48 +31,86 @@ let
else if stdenv.system == "x86_64-darwin" then "macosx"
else throw "No Android SDK tarballs are available for system architecture: ${stdenv.system}";
# Generated Nix packages
packages = import ./generated/packages.nix {
inherit fetchurl;
# Uses mkrepo.rb to create a repo spec.
mkRepoJson = { packages ? [], images ? [], addons ? [] }: let
mkRepoRuby = (pkgs.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
'';
};
# Generated system images
system-images-packages-android = import ./generated/system-images-android.nix {
inherit fetchurl;
# 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
builtins.fromJSON (builtins.readFile "${mkRepoJson repoXmlSpec}")
else
builtins.fromJSON (builtins.readFile repoJson);
# Converts all 'archives' keys in a repo spec to fetchurl calls.
fetchArchives = attrSet:
lib.attrsets.mapAttrsRecursive
(path: value:
if (builtins.elemAt path ((builtins.length path) - 1)) == "archives" then
(builtins.listToAttrs
(builtins.map
(archive: lib.attrsets.nameValuePair archive.os (fetchurl { inherit (archive) url sha1; })) value))
else value
)
attrSet;
# Converts the repo attrset into fetch calls
packages = fetchArchives repo.packages;
system-images-packages = fetchArchives repo.images;
addons = {
addons = fetchArchives repo.addons;
extras = fetchArchives repo.extras;
};
system-images-packages-android-tv = import ./generated/system-images-android-tv.nix {
inherit fetchurl;
};
# Converts a license name to a list of license texts.
mkLicenses = licenseName: repo.licenses.${licenseName};
system-images-packages-android-wear = import ./generated/system-images-android-wear.nix {
inherit fetchurl;
};
# Converts a list of license names to a flattened list of license texts.
# Just used for displaying licenses.
mkLicenseTexts = licenseNames:
lib.lists.flatten
(builtins.map
(licenseName:
builtins.map
(licenseText: "--- ${licenseName} ---\n${licenseText}")
(mkLicenses licenseName))
licenseNames);
system-images-packages-android-wear-cn = import ./generated/system-images-android-wear-cn.nix {
inherit fetchurl;
};
# Converts a license name to a list of license hashes.
mkLicenseHashes = licenseName:
builtins.map
(licenseText: builtins.hashString "sha1" licenseText)
(mkLicenses licenseName);
system-images-packages-google_apis = import ./generated/system-images-google_apis.nix {
inherit fetchurl;
};
system-images-packages-google_apis_playstore = import ./generated/system-images-google_apis_playstore.nix {
inherit fetchurl;
};
system-images-packages =
lib.recursiveUpdate
system-images-packages-android
(lib.recursiveUpdate system-images-packages-android-tv
(lib.recursiveUpdate system-images-packages-android-wear
(lib.recursiveUpdate system-images-packages-android-wear-cn
(lib.recursiveUpdate system-images-packages-google_apis system-images-packages-google_apis_playstore))));
# Generated addons
addons = import ./generated/addons.nix {
inherit fetchurl;
};
# The list of all license names we're accepting. Put android-sdk-license there
# by default.
licenseNames = lib.lists.unique ([
"android-sdk-license"
] ++ extraLicenses);
in
rec {
deployAndroidPackage = import ./deploy-androidpackage.nix {
@ -88,14 +129,9 @@ rec {
}
) buildToolsVersions;
docs = deployAndroidPackage {
inherit os;
package = packages.docs."1";
};
emulator = import ./emulator.nix {
inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686 lib;
package = packages.emulator.${emulatorVersion}.${os};
package = packages.emulator.${emulatorVersion};
};
platforms = map (version:
@ -115,27 +151,22 @@ rec {
system-images = lib.flatten (map (apiVersion:
map (type:
map (abiVersion:
deployAndroidPackage {
inherit os;
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
'';
}
if lib.hasAttrByPath [apiVersion type abiVersion] system-images-packages then
deployAndroidPackage {
inherit os;
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
'';
}
else []
) abiVersions
) systemImageTypes
) platformVersions);
lldb = map (version:
import ./lldb.nix {
inherit deployAndroidPackage os autoPatchelfHook pkgs lib;
package = packages.lldb.${version};
}
) lldbVersions;
cmake = map (version:
import ./cmake.nix {
inherit deployAndroidPackage os autoPatchelfHook pkgs lib;
@ -187,12 +218,15 @@ rec {
''; # */
# This derivation deploys the tools package and symlinks all the desired
# plugins that we want to use.
# plugins that we want to use. If the license isn't accepted, prints all the licenses
# requested and throws.
androidsdk = if !licenseAccepted then throw ''
You must accept the Android Software Development Kit License Agreement at
https://developer.android.com/studio/terms
by setting nixpkgs config option 'android_sdk.accept_license = true;'
${builtins.concatStringsSep "\n\n" (mkLicenseTexts licenseNames)}
You must accept the following licenses:
${lib.concatMapStringsSep "\n" (str: " - ${str}") licenseNames}
by setting nixpkgs config option 'android_sdk.accept_license = true;'.
'' else import ./tools.nix {
inherit deployAndroidPackage requireFile packages toolsVersion autoPatchelfHook makeWrapper os pkgs pkgs_i686 lib;
@ -202,10 +236,8 @@ rec {
${linkPlugin { name = "platform-tools"; plugin = platform-tools; }}
${linkPlugins { name = "build-tools"; plugins = build-tools; }}
${linkPlugin { name = "emulator"; plugin = emulator; check = includeEmulator; }}
${linkPlugin { name = "docs"; plugin = docs; check = includeDocs; }}
${linkPlugins { name = "platforms"; plugins = platforms; }}
${linkPlatformPlugins { name = "sources"; plugins = sources; check = includeSources; }}
${linkPlugins { name = "lldb"; plugins = lldb; }}
${linkPlugins { name = "cmake"; plugins = cmake; }}
${linkPlugin { name = "ndk-bundle"; plugin = ndk-bundle; check = includeNDK; }}
@ -253,6 +285,17 @@ rec {
do
ln -s $i $out/bin
done
# Write licenses
mkdir -p licenses
${lib.concatMapStrings (licenseName:
let
licenseHashes = builtins.concatStringsSep "\n" (mkLicenseHashes licenseName);
licenseHashFile = pkgs.writeText "androidenv-${licenseName}" licenseHashes;
in
''
ln -s ${licenseHashFile} licenses/${licenseName}
'') licenseNames}
'';
};
}

View file

@ -1,128 +0,0 @@
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:addon="http://schemas.android.com/sdk/android/repo/addon2/01"
xmlns:sdk="http://schemas.android.com/repository/android/common/01"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output omit-xml-declaration="yes" indent="no" />
<!-- Template that puts a google HTTP prefix in front of relative URLs -->
<xsl:template name="repository-url">
<xsl:variable name="raw-url" select="complete/url"/>
<xsl:choose>
<xsl:when test="starts-with($raw-url, 'http')">
<xsl:value-of select="$raw-url"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>https://dl.google.com/android/repository/</xsl:text>
<xsl:value-of select="$raw-url"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/addon:sdk-addon">
{fetchurl}:
{
addons = {
<!-- Convert all addons, but skip the entry for google APIs version 25 because it is inconsistent with the spec -->
<xsl:for-each select="remotePackage[type-details/@xsi:type='addon:addonDetailsType' and archives/archive/complete/url != 'google_apis-25_r1.zip' ]"><xsl:sort select="@path" />
"<xsl:value-of select="type-details/api-level" />"."<xsl:value-of select="type-details/tag/id" />" = {
name = "<xsl:value-of select="type-details/tag/id" />";
path = "<xsl:value-of select="translate(@path, ';', '/')" />";
revision = "<xsl:value-of select="type-details/api-level" />";
displayName = "<xsl:value-of select="display-name" />";
archives = {
<xsl:for-each select="archives/archive[not(host-os)]">
all = fetchurl {
url = "<xsl:call-template name="repository-url"/>";
sha1 = "<xsl:value-of select="complete/checksum" />";
};
</xsl:for-each>
<xsl:for-each select="archives/archive[host-os and not(host-os = 'windows')]">
<xsl:value-of select="host-os" /> = fetchurl {
url = "<xsl:call-template name="repository-url"/>";
sha1 = "<xsl:value-of select="complete/checksum" />";
};
</xsl:for-each>
};
};
</xsl:for-each>
<!-- Workaround to make google APIs version 25 work. Hopefully, we can get rid of this at some point -->
<xsl:for-each select="remotePackage[type-details/@xsi:type='addon:addonDetailsType' and archives/archive/complete/url = 'google_apis-25_r1.zip' ]">
"<xsl:value-of select="25" />"."<xsl:value-of select="type-details/tag/id" />" = {
name = "<xsl:value-of select="type-details/tag/id" />";
path = "add-ons/addon-google_apis-google-25";
revision = "<xsl:value-of select="25" />";
displayName = "<xsl:value-of select="display-name" />";
archives = {
<xsl:for-each select="archives/archive[not(host-os)]">
all = fetchurl {
url = "<xsl:call-template name="repository-url"/>";
sha1 = "<xsl:value-of select="complete/checksum" />";
};
</xsl:for-each>
<xsl:for-each select="archives/archive[host-os and not(host-os = 'windows')]">
<xsl:value-of select="host-os" /> = fetchurl {
url = "<xsl:call-template name="repository-url"/>";
sha1 = "<xsl:value-of select="complete/checksum" />";
};
</xsl:for-each>
};
};
</xsl:for-each>
};
extras = {
<!-- Convert all extras and maven artefacts -->
<xsl:for-each select="remotePackage[type-details/@xsi:type='addon:extraDetailsType' or type-details/@xsi:type='addon:mavenType']"><xsl:sort select="@path" />
<!-- Compose revision string from revision attributes -->
<xsl:variable name="revision">
<xsl:choose>
<xsl:when test="revision/major">
<xsl:value-of select="revision/major" />
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="revision/minor">.<xsl:value-of select="revision/minor" />
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="revision/micro">.<xsl:value-of select="revision/micro" />
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="revision/preview">-rc<xsl:value-of select="revision/preview" />
</xsl:when>
</xsl:choose>
</xsl:variable>
"<xsl:value-of select="@path" />" = {
name = "<xsl:value-of select="translate(@path, ';', '-')" />";
path = "<xsl:value-of select="translate(@path, ';', '/')" />";
revision = "<xsl:value-of select="$revision" />";
displayName = "<xsl:value-of select="display-name" />";
archives = {
<xsl:for-each select="archives/archive[not(host-os)]">
all = fetchurl {
url = "<xsl:call-template name="repository-url"/>";
sha1 = "<xsl:value-of select="complete/checksum" />";
};
</xsl:for-each>
<xsl:for-each select="archives/archive[host-os and not(host-os = 'windows')]">
<xsl:value-of select="host-os" /> = fetchurl {
url = "<xsl:call-template name="repository-url"/>";
sha1 = "<xsl:value-of select="complete/checksum" />";
};
</xsl:for-each>
};
};
</xsl:for-each>
};
}
</xsl:template>
</xsl:stylesheet>

View file

@ -1,116 +0,0 @@
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:common="http://schemas.android.com/repository/android/common/01"
xmlns:generic="http://schemas.android.com/repository/android/generic/01"
xmlns:sdk="http://schemas.android.com/sdk/android/repo/repository2/01"
xmlns:sdk-common="http://schemas.android.com/sdk/android/repo/common/01"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output omit-xml-declaration="yes" indent="no" />
<!-- Template that puts a google HTTP prefix in front of relative URLs -->
<xsl:template name="repository-url">
<xsl:variable name="raw-url" select="complete/url"/>
<xsl:choose>
<xsl:when test="starts-with($raw-url, 'http')">
<xsl:value-of select="$raw-url"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>https://dl.google.com/android/repository/</xsl:text>
<xsl:value-of select="$raw-url"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/sdk:sdk-repository">
{fetchurl}:
{
<!-- Convert all remote packages -->
<xsl:for-each select="remotePackage[not(contains(@path, ';') and substring-after(@path, ';') = 'latest')]"><xsl:sort select="@path" />
<!-- Extract the package name from the path -->
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="contains(@path, ';')">
<xsl:value-of select="substring-before(@path, ';')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@path" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Compose version string from version attributes -->
<xsl:variable name="revision">
<xsl:choose>
<!-- Compose revision for a generic package from the revision attributes -->
<xsl:when test="type-details/@xsi:type='generic:genericDetailsType'">
<xsl:choose>
<xsl:when test="revision/major">
<xsl:value-of select="revision/major" />
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="revision/minor">.<xsl:value-of select="revision/minor" />
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="revision/micro">.<xsl:value-of select="revision/micro" />
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="revision/preview">-rc<xsl:value-of select="revision/preview" />
</xsl:when>
</xsl:choose>
</xsl:when>
<!-- Compose revision of a platform SDK from the API-level or codename if the latter exists -->
<xsl:when test="type-details/@xsi:type='sdk:platformDetailsType'">
<xsl:choose>
<xsl:when test="not(type-details/codename='')">
<xsl:value-of select="type-details/codename" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="type-details/api-level" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<!-- Compose revision of a source SDK from the API-level -->
<xsl:when test="type-details/@xsi:type='sdk:sourceDetailsType'">
<xsl:value-of select="type-details/api-level" />
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="@path='emulator'"> <!-- An emulator package provides one archive per operating system but the same versions -->
"<xsl:value-of select="$name" />"."<xsl:value-of select="$revision" />".<xsl:value-of select="archives/archive/host-os" /> = {
</xsl:when>
<xsl:otherwise>
"<xsl:value-of select="$name" />"."<xsl:value-of select="$revision" />" = {
</xsl:otherwise>
</xsl:choose>
name = "<xsl:value-of select="$name" />";
path = "<xsl:value-of select="translate(@path, ';', '/')" />";
revision = "<xsl:value-of select="$revision" />";
displayName = "<xsl:value-of select="display-name" />";
archives = {
<xsl:for-each select="archives/archive[not(host-os)]">
all = fetchurl {
url = !<xsl:call-template name="repository-url"/>";
sha1 = "<xsl:value-of select="complete/checksum" />";
};
</xsl:for-each>
<xsl:for-each select="archives/archive[host-os and not(host-os = 'windows')]">
<xsl:value-of select="host-os" /> = fetchurl {
url = "<xsl:call-template name="repository-url"/>";
sha1 = "<xsl:value-of select="complete/checksum" />";
};
</xsl:for-each>
};
};
</xsl:for-each>
}
</xsl:template>
</xsl:stylesheet>

View file

@ -1,76 +0,0 @@
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sys-img="http://schemas.android.com/sdk/android/repo/sys-img2/01"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:param name="imageType" />
<xsl:output method="text" omit-xml-declaration="yes" indent="no" />
<xsl:template name="repository-url">
<xsl:variable name="raw-url" select="complete/url"/>
<xsl:choose>
<xsl:when test="starts-with($raw-url, 'http')">
<xsl:value-of select="$raw-url"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>https://dl.google.com/android/repository/sys-img/</xsl:text><xsl:value-of select="$imageType" /><xsl:text>/</xsl:text><xsl:value-of select="$raw-url"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template mode="revision" match="type-details[codename]">
<xsl:value-of select="codename" />-<xsl:value-of select="tag/id" />-<xsl:value-of select="abi" />
</xsl:template>
<xsl:template mode="revision" match="type-details[not(codename)]">
<xsl:value-of select="api-level" />-<xsl:value-of select="tag/id" />-<xsl:value-of select="abi" />
</xsl:template>
<xsl:template mode="attrkey" match="type-details[codename]">
<xsl:text>"</xsl:text>
<xsl:value-of select="codename" />
<xsl:text>".</xsl:text>
<xsl:value-of select="tag/id" />
<xsl:text>."</xsl:text>
<xsl:value-of select="abi" />
<xsl:text>"</xsl:text>
</xsl:template>
<xsl:template mode="attrkey" match="type-details[not(codename)]">
<xsl:text>"</xsl:text>
<xsl:value-of select="api-level" />
<xsl:text>".</xsl:text>
<xsl:value-of select="tag/id" />
<xsl:text>."</xsl:text>
<xsl:value-of select="abi" />
<xsl:text>"</xsl:text>
</xsl:template>
<xsl:template match="/sys-img:sdk-sys-img">
<xsl:text>{fetchurl}:
{
</xsl:text><xsl:for-each select="remotePackage[starts-with(@path, 'system-images;')]">
<xsl:variable name="revision"><xsl:apply-templates mode="revision" select="type-details" /></xsl:variable>
<xsl:variable name="attrkey"><xsl:apply-templates mode="attrkey" select="type-details" /></xsl:variable>
<xsl:text> </xsl:text><xsl:value-of select="$attrkey" /><xsl:text> = {
name = "system-image-</xsl:text><xsl:value-of select="$revision" /><xsl:text>";
path = "</xsl:text><xsl:value-of select="translate(@path, ';', '/')" /><xsl:text>";
revision = "</xsl:text><xsl:value-of select="$revision" /><xsl:text>";
displayName = "</xsl:text><xsl:value-of select="display-name" /><xsl:text>";
archives.all = fetchurl {</xsl:text>
<xsl:for-each select="archives/archive"><xsl:text>
url = "</xsl:text><xsl:call-template name="repository-url"/><xsl:text>";
sha1 = "</xsl:text><xsl:value-of select="complete/checksum" /><xsl:text>";</xsl:text>
</xsl:for-each><xsl:text>
};
};
</xsl:text>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:template>
</xsl:stylesheet>

View file

@ -0,0 +1,145 @@
{
# 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 {},
pkgs_i686 ? import nixpkgsSource { system = "i686-linux"; },*/
# If you want to use the in-tree version of nixpkgs:
pkgs ? import ../../../../.. {},
pkgs_i686 ? import ../../../../.. { system = "i686-linux"; },
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 = {
versions = {
tools = "26.1.1";
platformTools = "30.0.5";
buildTools = "30.0.3";
ndk = "22.0.7026061";
# or the LTS NDK:
# ndk = "21.3.6528147";
cmake = "3.10.2";
emulator = "30.3.4";
};
platforms = ["23" "24" "25" "26" "27" "28" "29" "30"];
abis = ["armeabi-v7a" "arm64-v8a"];
extras = ["extras;google;gcm"];
};
# 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 pkgs_i686;
licenseAccepted = true;
};*/
# Otherwise, just use the in-tree androidenv:
androidEnv = pkgs.callPackage ./.. {
inherit config pkgs pkgs_i686;
licenseAccepted = true;
};
androidComposition = androidEnv.composeAndroidPackages {
toolsVersion = android.versions.tools;
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;
ndkVersion = android.versions.ndk;
cmakeVersions = [android.versions.cmake];
useGoogleAPIs = true;
includeExtras = android.extras;
# If you want to use a custom repo JSON:
# repoJson = ../repo.json;
# If you want to use custom repo XMLs:
/*repoXmls = {
packages = [ ../xml/repository2-1.xml ];
images = [
../xml/android-sys-img2-1.xml
../xml/android-tv-sys-img2-1.xml
../xml/android-wear-sys-img2-1.xml
../xml/android-wear-cn-sys-img2-1.xml
../xml/google_apis-sys-img2-1.xml
../xml/google_apis_playstore-sys-img2-1.xml
];
addons = [ ../xml/addon2-1.xml ];
};*/
# 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"
];
};
androidSdk = androidComposition.androidsdk;
platformTools = androidComposition.platform-tools;
jdk = pkgs.jdk;
in
pkgs.mkShell rec {
name = "androidenv-demo";
buildInputs = [ androidSdk platformTools 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";
# 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 = ''
# Add cmake to the path.
cmake_root="$(echo "$ANDROID_SDK_ROOT/cmake/${android.versions.cmake}".*/)"
export PATH="$cmake_root/bin:$PATH"
# 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
cmake.dir=$cmake_root
EOF
'';
}

View file

@ -0,0 +1,26 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl
die() {
echo "$1" >&2
exit 1
}
fetch() {
local url="https://dl.google.com/android/repository/$1"
echo "$url -> $2"
curl -s "$url" -o "$2" || die "Failed to fetch $url"
}
pushd "$(dirname "$0")" &>/dev/null || exit 1
mkdir -p xml
fetch repository2-1.xml xml/repository2-1.xml
for img in android android-tv android-wear android-wear-cn android-automotive google_apis google_apis_playstore
do
fetch sys-img/$img/sys-img2-1.xml xml/$img-sys-img2-1.xml
done
fetch addon2-1.xml xml/addon2-1.xml
popd &>/dev/null

View file

@ -1,36 +1,3 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl libxslt
#!/bin/sh
set -e
die() {
echo "$1" >&2
exit 1
}
fetch() {
local url="https://dl.google.com/android/repository/$1"
echo "$url -> $2"
curl -s "$url" -o "$2" || die "Failed to fetch $url"
}
pushd "$(dirname "$0")" &>/dev/null || exit 1
mkdir -p xml
# Convert base packages
fetch repository2-1.xml xml/repository2-1.xml
xsltproc convertpackages.xsl xml/repository2-1.xml > generated/packages.nix
# Convert system images
for img in android android-tv android-wear android-wear-cn google_apis google_apis_playstore
do
fetch sys-img/$img/sys-img2-1.xml xml/$img-sys-img2-1.xml
xsltproc --stringparam imageType $img convertsystemimages.xsl xml/$img-sys-img2-1.xml > generated/system-images-$img.nix
done
# Convert system addons
fetch addon2-1.xml xml/addon2-1.xml
xsltproc convertaddons.xsl xml/addon2-1.xml > generated/addons.nix
popd &>/dev/null
./fetchrepo.sh && ./mkrepo.sh

View file

@ -1,964 +0,0 @@
{fetchurl}:
{
addons = {
"10"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-10";
revision = "10";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-10_r02.zip";
sha1 = "cc0711857c881fa7534f90cf8cc09b8fe985484d";
};
};
};
"11"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-11";
revision = "11";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-11_r01.zip";
sha1 = "5eab5e81addee9f3576d456d205208314b5146a5";
};
};
};
"12"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-12";
revision = "12";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-12_r01.zip";
sha1 = "e9999f4fa978812174dfeceec0721c793a636e5d";
};
};
};
"13"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-13";
revision = "13";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-13_r01.zip";
sha1 = "3b153edd211c27dc736c893c658418a4f9041417";
};
};
};
"14"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-14";
revision = "14";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-14_r02.zip";
sha1 = "f8eb4d96ad0492b4c0db2d7e4f1a1a3836664d39";
};
};
};
"15"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-15";
revision = "15";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-15_r03.zip";
sha1 = "d0d2bf26805eb271693570a1aaec33e7dc3f45e9";
};
};
};
"16"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-16";
revision = "16";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-16_r04.zip";
sha1 = "ee6acf1b01020bfa8a8e24725dbc4478bee5e792";
};
};
};
"17"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-17";
revision = "17";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-17_r04.zip";
sha1 = "a076be0677f38df8ca5536b44dfb411a0c808c4f";
};
};
};
"18"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-18";
revision = "18";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-18_r04.zip";
sha1 = "6109603409debdd40854d4d4a92eaf8481462c8b";
};
};
};
"19"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-19";
revision = "19";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-19_r20.zip";
sha1 = "5b933abe830b2f25b4c0f171d45e9e0651e56311";
};
};
};
"21"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-21";
revision = "21";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-21_r01.zip";
sha1 = "66a754efb24e9bb07cc51648426443c7586c9d4a";
};
};
};
"22"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-22";
revision = "22";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-22_r01.zip";
sha1 = "5def0f42160cba8acff51b9c0c7e8be313de84f5";
};
};
};
"23"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-23";
revision = "23";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-23_r01.zip";
sha1 = "04c5cc1a7c88967250ebba9561d81e24104167db";
};
};
};
"24"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-24";
revision = "24";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-24_r1.zip";
sha1 = "31361c2868f27343ee917fbd259c1463821b6145";
};
};
};
"3"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-3";
revision = "3";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-3-r03.zip";
sha1 = "1f92abf3a76be66ae8032257fc7620acbd2b2e3a";
};
};
};
"4"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-4";
revision = "4";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-4_r02.zip";
sha1 = "9b6e86d8568558de4d606a7debc4f6049608dbd0";
};
};
};
"5"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-5";
revision = "5";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-5_r01.zip";
sha1 = "46eaeb56b645ee7ffa24ede8fa17f3df70db0503";
};
};
};
"6"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-6";
revision = "6";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-6_r01.zip";
sha1 = "5ff545d96e031e09580a6cf55713015c7d4936b2";
};
};
};
"7"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-7";
revision = "7";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-7_r01.zip";
sha1 = "2e7f91e0fe34fef7f58aeced973c6ae52361b5ac";
};
};
};
"8"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-8";
revision = "8";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-8_r02.zip";
sha1 = "3079958e7ec87222cac1e6b27bc471b27bf2c352";
};
};
};
"9"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-9";
revision = "9";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-9_r02.zip";
sha1 = "78664645a1e9accea4430814f8694291a7f1ea5d";
};
};
};
"12"."google_tv_addon" = {
name = "google_tv_addon";
path = "add-ons/addon-google_tv_addon-google-12";
revision = "12";
displayName = "Google TV Addon";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_tv-12_r02.zip";
sha1 = "92128a12e7e8b0fb5bac59153d7779b717e7b840";
};
};
};
"13"."google_tv_addon" = {
name = "google_tv_addon";
path = "add-ons/addon-google_tv_addon-google-13";
revision = "13";
displayName = "Google TV Addon";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_tv-13_r01.zip";
sha1 = "b73f7c66011ac8180b44aa4e83b8d78c66ea9a09";
};
};
};
"25"."google_apis" = {
name = "google_apis";
path = "add-ons/addon-google_apis-google-25";
revision = "25";
displayName = "Google APIs";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_apis-25_r1.zip";
sha1 = "550e83eea9513ab11c44919ac6da54b36084a9f3";
};
};
};
};
extras = {
"extras;android;gapid;1" = {
name = "extras-android-gapid-1";
path = "extras/android/gapid/1";
revision = "1.0.3";
displayName = "GPU Debugging tools";
archives = {
linux = fetchurl {
url = "https://dl.google.com/android/repository/gapid_r01_linux.zip";
sha1 = "7c9ef7544cf0aea030bcc29bd8e12c04fd53e653";
};
macosx = fetchurl {
url = "https://dl.google.com/android/repository/gapid_r01_osx.zip";
sha1 = "597eb271349d890566274861eba2770a84ee4c69";
};
};
};
"extras;android;gapid;3" = {
name = "extras-android-gapid-3";
path = "extras/android/gapid/3";
revision = "3.1.0";
displayName = "GPU Debugging tools";
archives = {
linux = fetchurl {
url = "https://dl.google.com/android/repository/gapid_2994895_linux.zip";
sha1 = "e40371ba191f617e4e79bc760d0ab2948ba8cf46";
};
macosx = fetchurl {
url = "https://dl.google.com/android/repository/gapid_2994895_osx.zip";
sha1 = "ad86a2350b7b9908300277bf03d41649659de384";
};
};
};
"extras;android;m2repository" = {
name = "extras-android-m2repository";
path = "extras/android/m2repository";
revision = "47.0.0";
displayName = "Android Support Repository";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/android_m2repository_r47.zip";
sha1 = "a0d22beacc106a6977321f2b07d692ce4979e96a";
};
};
};
"extras;google;Android_Emulator_Hypervisor_Driver" = {
name = "extras-google-Android_Emulator_Hypervisor_Driver";
path = "extras/google/Android_Emulator_Hypervisor_Driver";
revision = "1.4.0";
displayName = "Android Emulator Hypervisor Driver for AMD Processors (installer)";
archives = {
};
};
"extras;google;admob_ads_sdk" = {
name = "extras-google-admob_ads_sdk";
path = "extras/google/admob_ads_sdk";
revision = "11";
displayName = "Google AdMob Ads SDK";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/GoogleAdMobAdsSdkAndroid-6.4.1.zip";
sha1 = "0102859d9575baa0bf4fd5eb422af2ad0fe6cb82";
};
};
};
"extras;google;analytics_sdk_v2" = {
name = "extras-google-analytics_sdk_v2";
path = "extras/google/analytics_sdk_v2";
revision = "3";
displayName = "Google Analytics App Tracking SDK";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/GoogleAnalyticsAndroid_2.0beta5.zip";
sha1 = "dc14026bf0ce78315cb5dd00552607de0894de83";
};
};
};
"extras;google;auto" = {
name = "extras-google-auto";
path = "extras/google/auto";
revision = "1.1";
displayName = "Android Auto Desktop Head Unit emulator";
archives = {
linux = fetchurl {
url = "https://dl.google.com/android/repository/desktop-head-unit-linux_r01.1.zip";
sha1 = "202a6e1b3009a0eb815f8c672d2d5b3717de6169";
};
macosx = fetchurl {
url = "https://dl.google.com/android/repository/desktop-head-unit-macosx_r01.1.zip";
sha1 = "8179cbb3914493ebc5eb65b731cba061582f2e84";
};
};
};
"extras;google;gcm" = {
name = "extras-google-gcm";
path = "extras/google/gcm";
revision = "3";
displayName = "Google Cloud Messaging for Android Library";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/gcm_r03.zip";
sha1 = "ad066fd0dc7fc99d8aadac09c65a3c2519fbc7bf";
};
};
};
"extras;google;google_play_services" = {
name = "extras-google-google_play_services";
path = "extras/google/google_play_services";
revision = "49";
displayName = "Google Play services";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_play_services_v16_1_rc09.zip";
sha1 = "f95bf19634e2ab0430923247fe2c50246432d2e9";
};
};
};
"extras;google;google_play_services_froyo" = {
name = "extras-google-google_play_services_froyo";
path = "extras/google/google_play_services_froyo";
revision = "12";
displayName = "Google Play services for Froyo";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_play_services_3265130_r12.zip";
sha1 = "92558dbc380bba3d55d0ec181167fb05ce7c79d9";
};
};
};
"extras;google;instantapps" = {
name = "extras-google-instantapps";
path = "extras/google/instantapps";
revision = "1.9.0";
displayName = "Google Play Instant Development SDK";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/iasdk-1.9.0-1566514721.zip";
sha1 = "c498367dcd7db30154b3e70c4ddbb1b0ea4b8d20";
};
};
};
"extras;google;m2repository" = {
name = "extras-google-m2repository";
path = "extras/google/m2repository";
revision = "58";
displayName = "Google Repository";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/google_m2repository_gms_v11_3_rc05_wear_2_0_5.zip";
sha1 = "05086add9e3a0eb1b67111108d7757a4337c3f10";
};
};
};
"extras;google;market_apk_expansion" = {
name = "extras-google-market_apk_expansion";
path = "extras/google/market_apk_expansion";
revision = "1";
displayName = "Google Play APK Expansion library";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/market_apk_expansion-r03.zip";
sha1 = "5305399dc1a56814e86b8459ce24871916f78b8c";
};
};
};
"extras;google;market_licensing" = {
name = "extras-google-market_licensing";
path = "extras/google/market_licensing";
revision = "1";
displayName = "Google Play Licensing Library";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/market_licensing-r02.zip";
sha1 = "355e8dc304a92a5616db235af8ee7bd554356254";
};
};
};
"extras;google;simulators" = {
name = "extras-google-simulators";
path = "extras/google/simulators";
revision = "1";
displayName = "Android Auto API Simulators";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/simulator_r01.zip";
sha1 = "4fb5344e34e8faab4db18af07dace44c50db26a7";
};
};
};
"extras;google;usb_driver" = {
name = "extras-google-usb_driver";
path = "extras/google/usb_driver";
revision = "12";
displayName = "Google USB Driver";
archives = {
};
};
"extras;google;webdriver" = {
name = "extras-google-webdriver";
path = "extras/google/webdriver";
revision = "2";
displayName = "Google Web Driver";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/webdriver_r02.zip";
sha1 = "13f3a3b2670a5fc04a7342861644be9a01b07e38";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.0";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.0";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.0.zip";
sha1 = "b621b9d5adf273bb0725948589863e60e96eeaf1";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha4" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.0-alpha4";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0-alpha4";
revision = "1";
displayName = "com.android.support.constraint:constraint-layout-solver:1.0.0-alpha4";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.0-alpha4.zip";
sha1 = "2aa2aceecc6ba172742d0af0b43f11d03924eeb8";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha8" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.0-alpha8";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0-alpha8";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.0-alpha8";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.0-alpha8.zip";
sha1 = "cd13d16a8f0198c1d6040ec8b1d0d4e5bb7feb6a";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta1" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.0-beta1";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0-beta1";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.0-beta1";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.0-beta1.zip";
sha1 = "042c25575e7650e96f0f5f5d1d3c54ed38eb821a";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta2" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.0-beta2";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0-beta2";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.0-beta2";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.0-beta2.zip";
sha1 = "28492fd42b20ae1586591ff906556d459cfdaae8";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta3" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.0-beta3";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0-beta3";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.0-beta3";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.0-beta3.zip";
sha1 = "268e763fa64bd217d8d830e59ce76be19aaba631";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta4" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.0-beta4";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0-beta4";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.0-beta4";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.0-beta4.zip";
sha1 = "2213bf37e7a2869db2635895b8e90ca6841e79d2";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta5" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.0-beta5";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.0-beta5";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.0-beta5";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.0-beta5.zip";
sha1 = "3918cfef73e64048d0b3e048068e208b414e7e91";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.1" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.1";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.1";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.1";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.1.zip";
sha1 = "76f8823def9a6da8954a54737762a6820bc1d043";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.2" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-solver-1.0.2";
path = "extras/m2repository/com/android/support/constraint/constraint-layout-solver/1.0.2";
revision = "1";
displayName = "Solver for ConstraintLayout 1.0.2";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-solver-1.0.2.zip";
sha1 = "96d7ff669f0e808e9833b2c2e320702826ccc8be";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.0";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.0";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.0.zip";
sha1 = "70acf99689b933bc6735645d5c3d92b91954b6cb";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha4" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.0-alpha4";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0-alpha4";
revision = "1";
displayName = "com.android.support.constraint:constraint-layout:1.0.0-alpha4";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.0-alpha4.zip";
sha1 = "645a9be1f0c1177301e71cd0ddccf1dd67c554fe";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha8" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.0-alpha8";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0-alpha8";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.0-alpha8";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.0-alpha8.zip";
sha1 = "7912ba03b04831f918f523648f118c4ee4da7604";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta1" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.0-beta1";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0-beta1";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.0-beta1";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.0-beta1.zip";
sha1 = "11f2f5cec4ff02986bad75435e5be77b704b4c64";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta2" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.0-beta2";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0-beta2";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.0-beta2";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.0-beta2.zip";
sha1 = "623939865ede2e5c2c975dc55963e0d182bcce95";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta3" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.0-beta3";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0-beta3";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.0-beta3";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.0-beta3.zip";
sha1 = "d78bb6a8ce92005fb1e4ed55d892a65b4258c60b";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta4" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.0-beta4";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0-beta4";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.0-beta4";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.0-beta4.zip";
sha1 = "dc60844aab93a09a54a3c107685a77b18d7c1c39";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta5" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.0-beta5";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.0-beta5";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.0-beta5";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.0-beta5.zip";
sha1 = "4660f6c7a576ea1364f0c3225db71c29ca660d9a";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.1" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.1";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.1";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.1";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.1.zip";
sha1 = "342b0894b8651fff37586f80f383733e97aba9f9";
};
};
};
"extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2" = {
name = "extras-m2repository-com-android-support-constraint-constraint-layout-1.0.2";
path = "extras/m2repository/com/android/support/constraint/constraint-layout/1.0.2";
revision = "1";
displayName = "ConstraintLayout for Android 1.0.2";
archives = {
all = fetchurl {
url = "https://dl.google.com/android/repository/com.android.support.constraint-constraint-layout-1.0.2.zip";
sha1 = "3d9688a50fe0ed7348275f85d1b02278f616d8a4";
};
};
};
};
}

File diff suppressed because it is too large Load diff

View file

@ -1,114 +0,0 @@
{fetchurl}:
{
"21".android-tv."x86" = {
name = "system-image-21-android-tv-x86";
path = "system-images/android-21/android-tv/x86";
revision = "21-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-21_r03.zip";
sha1 = "2f8a1988188d6abfd6c6395baeb4471a034dc1e8";
};
};
"21".android-tv."armeabi-v7a" = {
name = "system-image-21-android-tv-armeabi-v7a";
path = "system-images/android-21/android-tv/armeabi-v7a";
revision = "21-android-tv-armeabi-v7a";
displayName = "Android TV ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/armeabi-v7a-21_r03.zip";
sha1 = "b63e28a47f11b639dd94981a458b7abfa89ac331";
};
};
"22".android-tv."x86" = {
name = "system-image-22-android-tv-x86";
path = "system-images/android-22/android-tv/x86";
revision = "22-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-22_r03.zip";
sha1 = "c78efd5a155622eb490be9d326f5783993375c35";
};
};
"23".android-tv."x86" = {
name = "system-image-23-android-tv-x86";
path = "system-images/android-23/android-tv/x86";
revision = "23-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-23_r19.zip";
sha1 = "47e8d6b08a337a0672f0f105bf907d39ed9457ec";
};
};
"23".android-tv."armeabi-v7a" = {
name = "system-image-23-android-tv-armeabi-v7a";
path = "system-images/android-23/android-tv/armeabi-v7a";
revision = "23-android-tv-armeabi-v7a";
displayName = "Android TV ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/armeabi-v7a-23_r12.zip";
sha1 = "bd84678ae8caf71d584f5210e866b2807e7b4b52";
};
};
"24".android-tv."x86" = {
name = "system-image-24-android-tv-x86";
path = "system-images/android-24/android-tv/x86";
revision = "24-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-24_r20.zip";
sha1 = "0b8cd98dec9ebd04376ce4f6e270193ceae8acea";
};
};
"25".android-tv."x86" = {
name = "system-image-25-android-tv-x86";
path = "system-images/android-25/android-tv/x86";
revision = "25-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-25_r14.zip";
sha1 = "1c88f11683375c059803c3a7be8e880cc23a6f9a";
};
};
"26".android-tv."x86" = {
name = "system-image-26-android-tv-x86";
path = "system-images/android-26/android-tv/x86";
revision = "26-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-26_r12.zip";
sha1 = "d8b12e543925a0454403d2a854996a76410ec374";
};
};
"27".android-tv."x86" = {
name = "system-image-27-android-tv-x86";
path = "system-images/android-27/android-tv/x86";
revision = "27-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-27_r07.zip";
sha1 = "5ed40e568c0d8d023c5b6c76634b22a477ed54aa";
};
};
"28".android-tv."x86" = {
name = "system-image-28-android-tv-x86";
path = "system-images/android-28/android-tv/x86";
revision = "28-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-28_r08.zip";
sha1 = "f5f8f296dfaca7945434992761c8d47d50257c21";
};
};
"Q".android-tv."x86" = {
name = "system-image-Q-android-tv-x86";
path = "system-images/android-Q/android-tv/x86";
revision = "Q-android-tv-x86";
displayName = "Android TV Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-tv/x86-Q_r01.zip";
sha1 = "80c66ddce0dbe53fe6fedcade230d518112fffb1";
};
};
}

View file

@ -1,44 +0,0 @@
{fetchurl}:
{
"25".android-wear."armeabi-v7a" = {
name = "system-image-25-android-wear-armeabi-v7a";
path = "system-images/android-25/android-wear-cn/armeabi-v7a";
revision = "25-android-wear-armeabi-v7a";
displayName = "China version of Android Wear ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear-cn/armeabi-v7a-25_r04.zip";
sha1 = "02d7bc86df054d1e89fe5856b3af1d2c142cab41";
};
};
"25".android-wear."x86" = {
name = "system-image-25-android-wear-x86";
path = "system-images/android-25/android-wear-cn/x86";
revision = "25-android-wear-x86";
displayName = "China version of Android Wear Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear-cn/x86-25_r04.zip";
sha1 = "73eab14c7cf2f6941e1fee61e0038ead7a2c7f4d";
};
};
"26".android-wear."x86" = {
name = "system-image-26-android-wear-x86";
path = "system-images/android-26/android-wear-cn/x86";
revision = "26-android-wear-x86";
displayName = "China version of Android Wear Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear-cn/x86-26_r04.zip";
sha1 = "fdc8a313f889a2d6522de1fbc00ee9e13547d096";
};
};
"28".android-wear."x86" = {
name = "system-image-28-android-wear-x86";
path = "system-images/android-28/android-wear-cn/x86";
revision = "28-android-wear-x86";
displayName = "China version of Wear OS Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear-cn/x86-28_r03.zip";
sha1 = "2099d87709c5e064273925dbf2cf1fd081bf0262";
};
};
}

View file

@ -1,64 +0,0 @@
{fetchurl}:
{
"23".android-wear."armeabi-v7a" = {
name = "system-image-23-android-wear-armeabi-v7a";
path = "system-images/android-23/android-wear/armeabi-v7a";
revision = "23-android-wear-armeabi-v7a";
displayName = "Android Wear ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear/armeabi-v7a-23_r06.zip";
sha1 = "0df5d34b1cdaaaa3805a2f06bb889901eabe2e71";
};
};
"23".android-wear."x86" = {
name = "system-image-23-android-wear-x86";
path = "system-images/android-23/android-wear/x86";
revision = "23-android-wear-x86";
displayName = "Android Wear Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear/x86-23_r06.zip";
sha1 = "3b15c123f3f71459d5b60c1714d49c5d90a5525e";
};
};
"25".android-wear."armeabi-v7a" = {
name = "system-image-25-android-wear-armeabi-v7a";
path = "system-images/android-25/android-wear/armeabi-v7a";
revision = "25-android-wear-armeabi-v7a";
displayName = "Android Wear ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear/armeabi-v7a-25_r03.zip";
sha1 = "76d3568a4e08023047af7d13025a35c9bf1d7e5c";
};
};
"25".android-wear."x86" = {
name = "system-image-25-android-wear-x86";
path = "system-images/android-25/android-wear/x86";
revision = "25-android-wear-x86";
displayName = "Android Wear Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear/x86-25_r03.zip";
sha1 = "693fce7b487a65491a4e88e9f740959688c9dbe6";
};
};
"26".android-wear."x86" = {
name = "system-image-26-android-wear-x86";
path = "system-images/android-26/android-wear/x86";
revision = "26-android-wear-x86";
displayName = "Android Wear Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear/x86-26_r04.zip";
sha1 = "fbffa91b936ca18fcc1e0bab2b52a8b0835cbb1c";
};
};
"28".android-wear."x86" = {
name = "system-image-28-android-wear-x86";
path = "system-images/android-28/android-wear/x86";
revision = "28-android-wear-x86";
displayName = "Wear OS Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android-wear/x86-28_r03.zip";
sha1 = "b80bd53ab69f19441714bff2e4d55931e6d3f7be";
};
};
}

View file

@ -1,364 +0,0 @@
{fetchurl}:
{
"10".default."armeabi-v7a" = {
name = "system-image-10-default-armeabi-v7a";
path = "system-images/android-10/default/armeabi-v7a";
revision = "10-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-10_r05.zip";
sha1 = "8537616a7add47cce24c60f18bc2429e3dc90ae3";
};
};
"14".default."armeabi-v7a" = {
name = "system-image-14-default-armeabi-v7a";
path = "system-images/android-14/default/armeabi-v7a";
revision = "14-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/sysimg_armv7a-14_r02.zip";
sha1 = "d8991b0c06b18d7d6ed4169d67460ee1add6661b";
};
};
"15".default."armeabi-v7a" = {
name = "system-image-15-default-armeabi-v7a";
path = "system-images/android-15/default/armeabi-v7a";
revision = "15-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-15_r05.zip";
sha1 = "03d7ed95a9d3b107e3f2e5b166d017ea12529e70";
};
};
"16".default."armeabi-v7a" = {
name = "system-image-16-default-armeabi-v7a";
path = "system-images/android-16/default/armeabi-v7a";
revision = "16-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-16_r06.zip";
sha1 = "69b944b0d5a18c8563fa80d7d229af64890f724e";
};
};
"17".default."armeabi-v7a" = {
name = "system-image-17-default-armeabi-v7a";
path = "system-images/android-17/default/armeabi-v7a";
revision = "17-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-17_r06.zip";
sha1 = "a18a3fd0958ec4ef52507f58e414fc5c7dfd59d6";
};
};
"18".default."armeabi-v7a" = {
name = "system-image-18-default-armeabi-v7a";
path = "system-images/android-18/default/armeabi-v7a";
revision = "18-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-18_r05.zip";
sha1 = "580b583720f7de671040d5917c8c9db0c7aa03fd";
};
};
"19".default."armeabi-v7a" = {
name = "system-image-19-default-armeabi-v7a";
path = "system-images/android-19/default/armeabi-v7a";
revision = "19-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-19_r05.zip";
sha1 = "d1a5fd4f2e1c013c3d3d9bfe7e9db908c3ed56fa";
};
};
"21".default."armeabi-v7a" = {
name = "system-image-21-default-armeabi-v7a";
path = "system-images/android-21/default/armeabi-v7a";
revision = "21-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-21_r04.zip";
sha1 = "8c606f81306564b65e41303d2603e4c42ded0d10";
};
};
"22".default."armeabi-v7a" = {
name = "system-image-22-default-armeabi-v7a";
path = "system-images/android-22/default/armeabi-v7a";
revision = "22-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-22_r02.zip";
sha1 = "2114ec015dbf3a16cbcb4f63e8a84a1b206a07a1";
};
};
"23".default."armeabi-v7a" = {
name = "system-image-23-default-armeabi-v7a";
path = "system-images/android-23/default/armeabi-v7a";
revision = "23-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-23_r06.zip";
sha1 = "7cf2ad756e54a3acfd81064b63cb0cb9dff2798d";
};
};
"24".default."armeabi-v7a" = {
name = "system-image-24-default-armeabi-v7a";
path = "system-images/android-24/default/armeabi-v7a";
revision = "24-default-armeabi-v7a";
displayName = "ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-24_r07.zip";
sha1 = "3454546b4eed2d6c3dd06d47757d6da9f4176033";
};
};
"24".default."arm64-v8a" = {
name = "system-image-24-default-arm64-v8a";
path = "system-images/android-24/default/arm64-v8a";
revision = "24-default-arm64-v8a";
displayName = "ARM 64 v8a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/arm64-v8a-24_r07.zip";
sha1 = "e8ab2e49e4efe4b064232b33b5eeaded61437d7f";
};
};
"16".default."mips" = {
name = "system-image-16-default-mips";
path = "system-images/android-16/default/mips";
revision = "16-default-mips";
displayName = "MIPS System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/sysimg_mips-16_r04.zip";
sha1 = "67943c54fb3943943ffeb05fdd39c0b753681f6e";
};
};
"17".default."mips" = {
name = "system-image-17-default-mips";
path = "system-images/android-17/default/mips";
revision = "17-default-mips";
displayName = "MIPS System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/sysimg_mips-17_r01.zip";
sha1 = "f0c6e153bd584c29e51b5c9723cfbf30f996a05d";
};
};
"10".default."x86" = {
name = "system-image-10-default-x86";
path = "system-images/android-10/default/x86";
revision = "10-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-10_r05.zip";
sha1 = "a166d5ccbb165e1dd5464fbfeec30a61f77790d8";
};
};
"15".default."x86" = {
name = "system-image-15-default-x86";
path = "system-images/android-15/default/x86";
revision = "15-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-15_r05.zip";
sha1 = "c387e0efed2cdc610e5944eea67b7b692d03760c";
};
};
"16".default."x86" = {
name = "system-image-16-default-x86";
path = "system-images/android-16/default/x86";
revision = "16-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-16_r06.zip";
sha1 = "bf1bf8c5591346118d2235da1ad20e7be8a3e9cd";
};
};
"17".default."x86" = {
name = "system-image-17-default-x86";
path = "system-images/android-17/default/x86";
revision = "17-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-17_r04.zip";
sha1 = "03c6d022ab2dcbbcf655d78ba5ccb0431cadcaec";
};
};
"18".default."x86" = {
name = "system-image-18-default-x86";
path = "system-images/android-18/default/x86";
revision = "18-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-18_r04.zip";
sha1 = "7a4ced4d9b0ab48047825491b4072dc2eb9b610e";
};
};
"19".default."x86" = {
name = "system-image-19-default-x86";
path = "system-images/android-19/default/x86";
revision = "19-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-19_r06.zip";
sha1 = "2ac82153aae97f7eae4c5a0761224fe04321d03d";
};
};
"21".default."x86" = {
name = "system-image-21-default-x86";
path = "system-images/android-21/default/x86";
revision = "21-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-21_r05.zip";
sha1 = "00f0eb0a1003efe3316347f762e20a85d8749cff";
};
};
"22".default."x86" = {
name = "system-image-22-default-x86";
path = "system-images/android-22/default/x86";
revision = "22-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-22_r06.zip";
sha1 = "e33e2a6cc3f1cc56b2019dbef3917d2eeb26f54e";
};
};
"23".default."x86" = {
name = "system-image-23-default-x86";
path = "system-images/android-23/default/x86";
revision = "23-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-23_r10.zip";
sha1 = "f6c3e3dd7bd951454795aa75c3a145fd05ac25bb";
};
};
"24".default."x86" = {
name = "system-image-24-default-x86";
path = "system-images/android-24/default/x86";
revision = "24-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-24_r08.zip";
sha1 = "c1cae7634b0216c0b5990f2c144eb8ca948e3511";
};
};
"25".default."x86" = {
name = "system-image-25-default-x86";
path = "system-images/android-25/default/x86";
revision = "25-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-25_r01.zip";
sha1 = "78ce7eb1387d598685633b9f7cbb300c3d3aeb5f";
};
};
"26".default."x86" = {
name = "system-image-26-default-x86";
path = "system-images/android-26/default/x86";
revision = "26-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-26_r01.zip";
sha1 = "e613d6e0da668e30daf547f3c6627a6352846f90";
};
};
"27".default."x86" = {
name = "system-image-27-default-x86";
path = "system-images/android-27/default/x86";
revision = "27-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-27_r01.zip";
sha1 = "4ec990fac7b62958decd12e18a4cd389dfe7c582";
};
};
"28".default."x86" = {
name = "system-image-28-default-x86";
path = "system-images/android-28/default/x86";
revision = "28-default-x86";
displayName = "Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86-28_r04.zip";
sha1 = "ce03c42d80c0fc6dc47f6455dbee7aa275d02780";
};
};
"21".default."x86_64" = {
name = "system-image-21-default-x86_64";
path = "system-images/android-21/default/x86_64";
revision = "21-default-x86_64";
displayName = "Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86_64-21_r05.zip";
sha1 = "9078a095825a69e5e215713f0866c83cef65a342";
};
};
"22".default."x86_64" = {
name = "system-image-22-default-x86_64";
path = "system-images/android-22/default/x86_64";
revision = "22-default-x86_64";
displayName = "Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86_64-22_r06.zip";
sha1 = "5db3b27f78cd9c4c5092b1cad5a5dd479fb5b2e4";
};
};
"23".default."x86_64" = {
name = "system-image-23-default-x86_64";
path = "system-images/android-23/default/x86_64";
revision = "23-default-x86_64";
displayName = "Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86_64-23_r10.zip";
sha1 = "7cbc291483ca07dc67b71268c5f08a5755f50f51";
};
};
"24".default."x86_64" = {
name = "system-image-24-default-x86_64";
path = "system-images/android-24/default/x86_64";
revision = "24-default-x86_64";
displayName = "Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86_64-24_r08.zip";
sha1 = "f6559e1949a5879f31a9662f4f0e50ad60181684";
};
};
"25".default."x86_64" = {
name = "system-image-25-default-x86_64";
path = "system-images/android-25/default/x86_64";
revision = "25-default-x86_64";
displayName = "Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86_64-25_r01.zip";
sha1 = "7093d7b39216020226ff430a3b7b81c94d31ad37";
};
};
"26".default."x86_64" = {
name = "system-image-26-default-x86_64";
path = "system-images/android-26/default/x86_64";
revision = "26-default-x86_64";
displayName = "Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86_64-26_r01.zip";
sha1 = "432f149c048bffce7f9de526ec65b336daf7a0a3";
};
};
"27".default."x86_64" = {
name = "system-image-27-default-x86_64";
path = "system-images/android-27/default/x86_64";
revision = "27-default-x86_64";
displayName = "Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86_64-27_r01.zip";
sha1 = "2878261011a59ca3de29dc5b457a495fdb268d60";
};
};
"28".default."x86_64" = {
name = "system-image-28-default-x86_64";
path = "system-images/android-28/default/x86_64";
revision = "28-default-x86_64";
displayName = "Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/android/x86_64-28_r04.zip";
sha1 = "d47a85c8f4e9fd57df97814ad8884eeb0f3a0ef0";
};
};
}

View file

@ -1,384 +0,0 @@
{fetchurl}:
{
"10".google_apis."armeabi-v7a" = {
name = "system-image-10-google_apis-armeabi-v7a";
path = "system-images/android-10/google_apis/armeabi-v7a";
revision = "10-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-10_r06.zip";
sha1 = "970abf3a2a9937a43576afd9bb56e4a8191947f8";
};
};
"10".google_apis."x86" = {
name = "system-image-10-google_apis-x86";
path = "system-images/android-10/google_apis/x86";
revision = "10-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-10_r06.zip";
sha1 = "070a9552e3d358d8e72e8b2042e539e2b7a1b035";
};
};
"15".google_apis."x86" = {
name = "system-image-15-google_apis-x86";
path = "system-images/android-15/google_apis/x86";
revision = "15-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-15_r06.zip";
sha1 = "a7deb32c12396b6c4fd60ad14a62e19f8bdcae20";
};
};
"15".google_apis."armeabi-v7a" = {
name = "system-image-15-google_apis-armeabi-v7a";
path = "system-images/android-15/google_apis/armeabi-v7a";
revision = "15-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-15_r06.zip";
sha1 = "6deb76cf34760a6037cb18d89772c9e986d07497";
};
};
"16".google_apis."armeabi-v7a" = {
name = "system-image-16-google_apis-armeabi-v7a";
path = "system-images/android-16/google_apis/armeabi-v7a";
revision = "16-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-16_r06.zip";
sha1 = "5a5ff097680c6dae473c8719296ce6d7b70edb2d";
};
};
"16".google_apis."x86" = {
name = "system-image-16-google_apis-x86";
path = "system-images/android-16/google_apis/x86";
revision = "16-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-16_r06.zip";
sha1 = "b57adef2f43dd176b8c02c980c16a796021b2071";
};
};
"17".google_apis."armeabi-v7a" = {
name = "system-image-17-google_apis-armeabi-v7a";
path = "system-images/android-17/google_apis/armeabi-v7a";
revision = "17-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-17_r06.zip";
sha1 = "a59f26cb5707da97e869a27d87b83477204ac594";
};
};
"17".google_apis."x86" = {
name = "system-image-17-google_apis-x86";
path = "system-images/android-17/google_apis/x86";
revision = "17-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-17_r06.zip";
sha1 = "7864c34faf0402b8923d8c6e609a5339f74cc8d6";
};
};
"18".google_apis."armeabi-v7a" = {
name = "system-image-18-google_apis-armeabi-v7a";
path = "system-images/android-18/google_apis/armeabi-v7a";
revision = "18-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-18_r06.zip";
sha1 = "7faaccabbcc5f08e410436d3f63eea42521ea974";
};
};
"18".google_apis."x86" = {
name = "system-image-18-google_apis-x86";
path = "system-images/android-18/google_apis/x86";
revision = "18-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-18_r06.zip";
sha1 = "dd674d719cad61602702be4b3d98edccfbfea53e";
};
};
"19".google_apis."x86" = {
name = "system-image-19-google_apis-x86";
path = "system-images/android-19/google_apis/x86";
revision = "19-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-19_r38.zip";
sha1 = "928e4ec82876c61ef53451425d10ccb840cdd0f2";
};
};
"19".google_apis."armeabi-v7a" = {
name = "system-image-19-google_apis-armeabi-v7a";
path = "system-images/android-19/google_apis/armeabi-v7a";
revision = "19-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-19_r38.zip";
sha1 = "434edd2ddc39d1ca083a5fa9721c0db8ab804737";
};
};
"21".google_apis."x86" = {
name = "system-image-21-google_apis-x86";
path = "system-images/android-21/google_apis/x86";
revision = "21-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-21_r30.zip";
sha1 = "37548caae9e2897fb1d2b15f7fcf624c714cb610";
};
};
"21".google_apis."x86_64" = {
name = "system-image-21-google_apis-x86_64";
path = "system-images/android-21/google_apis/x86_64";
revision = "21-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-21_r30.zip";
sha1 = "82d34fdaae2916bd4d48a4f144db51e4e5719aa4";
};
};
"21".google_apis."armeabi-v7a" = {
name = "system-image-21-google_apis-armeabi-v7a";
path = "system-images/android-21/google_apis/armeabi-v7a";
revision = "21-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-21_r30.zip";
sha1 = "bbdbbb3c4387752a8f28718a3190d901c0378058";
};
};
"22".google_apis."x86" = {
name = "system-image-22-google_apis-x86";
path = "system-images/android-22/google_apis/x86";
revision = "22-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-22_r24.zip";
sha1 = "e4cd95b1c0837fc12d6544742e82d8ef344c8758";
};
};
"22".google_apis."armeabi-v7a" = {
name = "system-image-22-google_apis-armeabi-v7a";
path = "system-images/android-22/google_apis/armeabi-v7a";
revision = "22-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-22_r24.zip";
sha1 = "d2b7ca5f8259c6e4b3cfa5a0d77e4a088899cfb0";
};
};
"22".google_apis."x86_64" = {
name = "system-image-22-google_apis-x86_64";
path = "system-images/android-22/google_apis/x86_64";
revision = "22-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-22_r24.zip";
sha1 = "cde738f9353606af69ad7b4e625c957a4d603f27";
};
};
"23".google_apis."x86" = {
name = "system-image-23-google_apis-x86";
path = "system-images/android-23/google_apis/x86";
revision = "23-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-23_r31.zip";
sha1 = "877cf79f5198fa53351eab08ba9ce162dc84f7ba";
};
};
"23".google_apis."x86_64" = {
name = "system-image-23-google_apis-x86_64";
path = "system-images/android-23/google_apis/x86_64";
revision = "23-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-23_r31.zip";
sha1 = "342c39df061804ee0d5bc671147e90dead3d6665";
};
};
"23".google_apis."armeabi-v7a" = {
name = "system-image-23-google_apis-armeabi-v7a";
path = "system-images/android-23/google_apis/armeabi-v7a";
revision = "23-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-23_r31.zip";
sha1 = "da0a07800b4eec53fcdb2e5c3b69a9a5d7a6b8a6";
};
};
"24".google_apis."x86" = {
name = "system-image-24-google_apis-x86";
path = "system-images/android-24/google_apis/x86";
revision = "24-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-24_r25.zip";
sha1 = "53dba25eed8359aba394a1be1c7ccb741a459ec0";
};
};
"24".google_apis."x86_64" = {
name = "system-image-24-google_apis-x86_64";
path = "system-images/android-24/google_apis/x86_64";
revision = "24-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-24_r25.zip";
sha1 = "d757dd13ad9b0ba4dd872660e31b6506f60dcf32";
};
};
"24".google_apis."armeabi-v7a" = {
name = "system-image-24-google_apis-armeabi-v7a";
path = "system-images/android-24/google_apis/armeabi-v7a";
revision = "24-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-24_r25.zip";
sha1 = "9a0ec5e9a239a7a6889364e44e9fa4fcd0052c6b";
};
};
"24".google_apis."arm64-v8a" = {
name = "system-image-24-google_apis-arm64-v8a";
path = "system-images/android-24/google_apis/arm64-v8a";
revision = "24-google_apis-arm64-v8a";
displayName = "Google APIs ARM 64 v8a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/arm64-v8a-24_r25.zip";
sha1 = "5ff407d439e3c595ce9221f445a31dcc35df5a86";
};
};
"25".google_apis."x86" = {
name = "system-image-25-google_apis-x86";
path = "system-images/android-25/google_apis/x86";
revision = "25-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-25_r16.zip";
sha1 = "562e3335c6334b8d1947bb9efb90f8d82f2d3e4d";
};
};
"25".google_apis."x86_64" = {
name = "system-image-25-google_apis-x86_64";
path = "system-images/android-25/google_apis/x86_64";
revision = "25-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-25_r16.zip";
sha1 = "e08b94903631d58964467b0b310c93642d85df6c";
};
};
"25".google_apis."armeabi-v7a" = {
name = "system-image-25-google_apis-armeabi-v7a";
path = "system-images/android-25/google_apis/armeabi-v7a";
revision = "25-google_apis-armeabi-v7a";
displayName = "Google APIs ARM EABI v7a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/armeabi-v7a-25_r16.zip";
sha1 = "4c49e0edb845b0bf1f231cb0e8598b1a9f9aa9c8";
};
};
"25".google_apis."arm64-v8a" = {
name = "system-image-25-google_apis-arm64-v8a";
path = "system-images/android-25/google_apis/arm64-v8a";
revision = "25-google_apis-arm64-v8a";
displayName = "Google APIs ARM 64 v8a System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/arm64-v8a-25_r16.zip";
sha1 = "33ffbd335d9a6dc8d9843469d0963091566b3167";
};
};
"26".google_apis."x86" = {
name = "system-image-26-google_apis-x86";
path = "system-images/android-26/google_apis/x86";
revision = "26-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-26_r14.zip";
sha1 = "935da6794d5f64f7ae20a1f352929cb7e3b20cba";
};
};
"26".google_apis."x86_64" = {
name = "system-image-26-google_apis-x86_64";
path = "system-images/android-26/google_apis/x86_64";
revision = "26-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-26_r14.zip";
sha1 = "965631f0554ca9027ac465ba147baa6a6a22fcce";
};
};
"27".google_apis."x86" = {
name = "system-image-27-google_apis-x86";
path = "system-images/android-27/google_apis/x86";
revision = "27-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-27_r09.zip";
sha1 = "ab009fc1308ded01539af4f8233b252d411145bc";
};
};
"28".google_apis."x86" = {
name = "system-image-28-google_apis-x86";
path = "system-images/android-28/google_apis/x86";
revision = "28-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-28_r09.zip";
sha1 = "7c84ba5cbc009132ce38df52830c17b9bffc54bb";
};
};
"28".google_apis."x86_64" = {
name = "system-image-28-google_apis-x86_64";
path = "system-images/android-28/google_apis/x86_64";
revision = "28-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-28_r09.zip";
sha1 = "eeb066346d29194e5b9387a0c0dd0f9e2a570b70";
};
};
"29".google_apis."x86" = {
name = "system-image-29-google_apis-x86";
path = "system-images/android-29/google_apis/x86";
revision = "29-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-29_r09.zip";
sha1 = "33d71d17138ea322dec2dea6d8198aebf4767ab3";
};
};
"29".google_apis."x86_64" = {
name = "system-image-29-google_apis-x86_64";
path = "system-images/android-29/google_apis/x86_64";
revision = "29-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-29_r09.zip";
sha1 = "0aa76b20a7ad30f2e41bc21b897b848d82533d26";
};
};
"R".google_apis."x86" = {
name = "system-image-R-google_apis-x86";
path = "system-images/android-R/google_apis/x86";
revision = "R-google_apis-x86";
displayName = "Google APIs Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86-R_r01.zip";
sha1 = "4e260bef94760eecba3224b68c1a4fed0fb89485";
};
};
"R".google_apis."x86_64" = {
name = "system-image-R-google_apis-x86_64";
path = "system-images/android-R/google_apis/x86_64";
revision = "R-google_apis-x86_64";
displayName = "Google APIs Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis/x86_64-R_r01.zip";
sha1 = "ae12e1c3e1b36043a299359850e9315f47262f81";
};
};
}

View file

@ -1,64 +0,0 @@
{fetchurl}:
{
"24".google_apis_playstore."x86" = {
name = "system-image-24-google_apis_playstore-x86";
path = "system-images/android-24/google_apis_playstore/x86";
revision = "24-google_apis_playstore-x86";
displayName = "Google Play Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86-24_r19.zip";
sha1 = "b52e9593ffdde65c1a0970256a32e8967c89cc22";
};
};
"25".google_apis_playstore."x86" = {
name = "system-image-25-google_apis_playstore-x86";
path = "system-images/android-25/google_apis_playstore/x86";
revision = "25-google_apis_playstore-x86";
displayName = "Google Play Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86-25_r09.zip";
sha1 = "6f6668954f7fd52f896fe7528aa122028c9b026c";
};
};
"26".google_apis_playstore."x86" = {
name = "system-image-26-google_apis_playstore-x86";
path = "system-images/android-26/google_apis_playstore/x86";
revision = "26-google_apis_playstore-x86";
displayName = "Google Play Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86-26_r07.zip";
sha1 = "2c8bee7b97a309f099941532e63c42a7d4a06e19";
};
};
"27".google_apis_playstore."x86" = {
name = "system-image-27-google_apis_playstore-x86";
path = "system-images/android-27/google_apis_playstore/x86";
revision = "27-google_apis_playstore-x86";
displayName = "Google Play Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86-27_r03.zip";
sha1 = "eb5a944ceb691ca0648d0a6f0d93893a47223b5d";
};
};
"28".google_apis_playstore."x86" = {
name = "system-image-28-google_apis_playstore-x86";
path = "system-images/android-28/google_apis_playstore/x86";
revision = "28-google_apis_playstore-x86";
displayName = "Google Play Intel x86 Atom System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86-28_r08.zip";
sha1 = "5381f9d52a3bf1967c9c92a25b20012cd68764c8";
};
};
"28".google_apis_playstore."x86_64" = {
name = "system-image-28-google_apis_playstore-x86_64";
path = "system-images/android-28/google_apis_playstore/x86_64";
revision = "28-google_apis_playstore-x86_64";
displayName = "Google Play Intel x86 Atom_64 System Image";
archives.all = fetchurl {
url = "https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86_64-28_r08.zip";
sha1 = "a767da996fdea7a1f5632a9206fa5c009d6e580c";
};
};
}

View file

@ -1,12 +0,0 @@
{deployAndroidPackage, lib, package, os, autoPatchelfHook, pkgs}:
deployAndroidPackage {
inherit package os;
buildInputs = [ autoPatchelfHook ]
++ lib.optional (os == "linux") [ pkgs.glibc pkgs.stdenv.cc.cc pkgs.zlib pkgs.openssl_1_0_2.out pkgs.ncurses5 ];
patchInstructions = lib.optionalString (os == "linux") ''
addAutoPatchelfSearchPath $packageBaseDir/lib
autoPatchelf $packageBaseDir/lib
autoPatchelf $packageBaseDir/bin
'';
}

View file

@ -0,0 +1,321 @@
#!/usr/bin/env ruby
require 'json'
require 'nokogiri'
require 'slop'
# Returns a repo URL for a given package name.
def repo_url value
if value && value.start_with?('http')
value
elsif value
"https://dl.google.com/android/repository/#{value}"
else
nil
end
end
# Returns a system image URL for a given system image name.
def image_url value, dir
if value && value.start_with?('http')
value
elsif value
"https://dl.google.com/android/repository/sys-img/#{dir}/#{value}"
else
nil
end
end
# Returns a tuple of [type, revision, revision components] for a package node.
def package_revision package
type_details = package.at_css('> type-details')
type = type_details.attributes['type']
type &&= type.value
revision = nil
components = nil
case type
when 'generic:genericDetailsType', 'addon:extraDetailsType', 'addon:mavenType'
major = text package.at_css('> revision > major')
minor = text package.at_css('> revision > minor')
micro = text package.at_css('> revision > micro')
preview = text package.at_css('> revision > preview')
revision = ''
components = []
unless empty?(major)
revision << major
components << major
end
unless empty?(minor)
revision << ".#{minor}"
components << minor
end
unless empty?(micro)
revision << ".#{micro}"
components << micro
end
unless empty?(preview)
revision << "-rc#{preview}"
components << preview
end
when 'sdk:platformDetailsType'
codename = text type_details.at_css('> codename')
api_level = text type_details.at_css('> api-level')
revision = empty?(codename) ? api_level : codename
components = [revision]
when 'sdk:sourceDetailsType'
api_level = text type_details.at_css('> api-level')
revision, components = api_level, [api_level]
when 'sys-img:sysImgDetailsType'
codename = text type_details.at_css('> codename')
api_level = text type_details.at_css('> api-level')
id = text type_details.at_css('> tag > id')
abi = text type_details.at_css('> abi')
revision = ''
components = []
if empty?(codename)
revision << api_level
components << api_level
else
revision << codename
components << codename
end
unless empty?(id)
revision << "-#{id}"
components << id
end
unless empty?(abi)
revision << "-#{abi}"
components << abi
end
when 'addon:addonDetailsType' then
api_level = text type_details.at_css('> api-level')
id = text type_details.at_css('> tag > id')
revision = api_level
components = [api_level, id]
end
[type, revision, components]
end
# Returns a hash of archives for the specified package node.
def package_archives package
archives = {}
package.css('> archives > archive').each do |archive|
host_os = text archive.at_css('> host-os')
host_os = 'all' if empty?(host_os)
archives[host_os] = {
'size' => Integer(text(archive.at_css('> complete > size'))),
'sha1' => text(archive.at_css('> complete > checksum')),
'url' => yield(text(archive.at_css('> complete > url')))
}
end
archives
end
# Returns the text from a node, or nil.
def text node
node ? node.text : nil
end
# Nil or empty helper.
def empty? value
!value || value.empty?
end
# Fixes up returned hashes by sorting keys.
# Will also convert archives (e.g. {'linux' => {'sha1' => ...}, 'macosx' => ...} to
# [{'os' => 'linux', 'sha1' => ...}, {'os' => 'macosx', ...}, ...].
def fixup value
Hash[value.map do |k, v|
if k == 'archives' && v.is_a?(Hash)
[k, v.map do |os, archive|
fixup({'os' => os}.merge(archive))
end]
elsif v.is_a?(Hash)
[k, fixup(v)]
else
[k, v]
end
end.sort {|(k1, v1), (k2, v2)| k1 <=> k2}]
end
# Normalize the specified license text.
# See: https://brash-snapper.glitch.me/ for how the munging works.
def normalize_license license
license = license.dup
license.gsub!(/([^\n])\n([^\n])/m, '\1 \2')
license.gsub!(/ +/, ' ')
license
end
# Gets all license texts, deduplicating them.
def get_licenses doc
licenses = {}
doc.css('license[type="text"]').each do |license_node|
license_id = license_node['id']
if license_id
licenses[license_id] ||= []
licenses[license_id] |= [normalize_license(text(license_node))]
end
end
licenses
end
def parse_package_xml doc
licenses = get_licenses doc
packages = {}
doc.css('remotePackage').each do |package|
name, _, version = package['path'].partition(';')
next if version == 'latest'
type, revision, _ = package_revision(package)
next unless revision
path = package['path'].tr(';', '/')
display_name = text package.at_css('> display-name')
uses_license = package.at_css('> uses-license')
uses_license &&= uses_license['ref']
archives = package_archives(package) {|url| repo_url url}
target = (packages[name] ||= {})
target = (target[revision] ||= {})
target['name'] ||= name
target['path'] ||= path
target['revision'] ||= revision
target['displayName'] ||= display_name
target['license'] ||= uses_license if uses_license
target['archives'] ||= {}
merge target['archives'], archives
end
[licenses, packages]
end
def parse_image_xml doc
licenses = get_licenses doc
images = {}
doc.css('remotePackage[path^="system-images;"]').each do |package|
type, revision, components = package_revision(package)
next unless revision
path = package['path'].tr(';', '/')
display_name = text package.at_css('> display-name')
uses_license = package.at_css('> uses-license')
uses_license &&= uses_license['ref']
archives = package_archives(package) {|url| image_url url, components[-2]}
target = images
components.each do |component|
target = (target[component] ||= {})
end
target['name'] ||= "system-image-#{revision}"
target['path'] ||= path
target['revision'] ||= revision
target['displayName'] ||= display_name
target['license'] ||= uses_license if uses_license
target['archives'] ||= {}
merge target['archives'], archives
end
[licenses, images]
end
def parse_addon_xml doc
licenses = get_licenses doc
addons, extras = {}, {}
doc.css('remotePackage').each do |package|
type, revision, components = package_revision(package)
next unless revision
path = package['path'].tr(';', '/')
display_name = text package.at_css('> display-name')
uses_license = package.at_css('> uses-license')
uses_license &&= uses_license['ref']
archives = package_archives(package) {|url| repo_url url}
case type
when 'addon:addonDetailsType'
name = components.last
target = addons
# Hack for Google APIs 25 r1, which displays as 23 for some reason
archive_name = text package.at_css('> archives > archive > complete > url')
if archive_name == 'google_apis-25_r1.zip'
path = 'add-ons/addon-google_apis-google-25'
revision = '25'
components = [revision, components.last]
end
when 'addon:extraDetailsType', 'addon:mavenType'
name = package['path'].tr(';', '-')
components = [package['path']]
target = extras
end
components.each do |component|
target = (target[component] ||= {})
end
target['name'] ||= name
target['path'] ||= path
target['revision'] ||= revision
target['displayName'] ||= display_name
target['license'] ||= uses_license if uses_license
target['archives'] ||= {}
merge target['archives'], archives
end
[licenses, addons, extras]
end
def merge dest, src
dest.merge! src
end
opts = Slop.parse do |o|
o.array '-p', '--packages', 'packages repo XMLs to parse'
o.array '-i', '--images', 'system image repo XMLs to parse'
o.array '-a', '--addons', 'addon repo XMLs to parse'
end
result = {
licenses: {},
packages: {},
images: {},
addons: {},
extras: {}
}
opts[:packages].each do |filename|
licenses, packages = parse_package_xml(Nokogiri::XML(File.open(filename)))
merge result[:licenses], licenses
merge result[:packages], packages
end
opts[:images].each do |filename|
licenses, images = parse_image_xml(Nokogiri::XML(File.open(filename)))
merge result[:licenses], licenses
merge result[:images], images
end
opts[:addons].each do |filename|
licenses, addons, extras = parse_addon_xml(Nokogiri::XML(File.open(filename)))
merge result[:licenses], licenses
merge result[:addons], addons
merge result[:extras], extras
end
puts JSON.pretty_generate(fixup(result))

View file

@ -0,0 +1,19 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p "ruby.withPackages (pkgs: with pkgs; [ slop nokogiri ])"
set -e
pushd "$(dirname "$0")" &>/dev/null || exit 1
echo "Writing repo.json" >&2
ruby mkrepo.rb \
--packages ./xml/repository2-1.xml \
--images ./xml/android-sys-img2-1.xml \
--images ./xml/android-tv-sys-img2-1.xml \
--images ./xml/android-wear-cn-sys-img2-1.xml \
--images ./xml/android-wear-sys-img2-1.xml \
--images ./xml/google_apis-sys-img2-1.xml \
--images ./xml/google_apis_playstore-sys-img2-1.xml \
--addons ./xml/addon2-1.xml > repo.json
popd &>/dev/null

View file

@ -9,14 +9,14 @@ let
in
deployAndroidPackage {
inherit package os;
buildInputs = [ autoPatchelfHook makeWrapper pkgs.python2 ]
++ lib.optional (os == "linux") [ pkgs.glibc pkgs.stdenv.cc.cc pkgs.ncurses5 pkgs.zlib pkgs.libcxx.out ];
nativeBuildInputs = [ autoPatchelfHook makeWrapper ];
buildInputs = lib.optional (os == "linux") [ pkgs.glibc pkgs.stdenv.cc.cc pkgs.python2 pkgs.ncurses5 pkgs.zlib pkgs.libcxx.out pkgs.libxml2 ];
patchInstructions = lib.optionalString (os == "linux") (''
patchShebangs .
'' + lib.optionalString (builtins.compareVersions (lib.getVersion package) "21" > 0) ''
patch -p1 \
--no-backup-if-mismatch < ${./make_standalone_toolchain.py_18.patch}
--no-backup-if-mismatch < ${./make_standalone_toolchain.py_18.patch} || true
wrapProgram $(pwd)/build/tools/make_standalone_toolchain.py --prefix PATH : "${runtime_paths}"
'' + ''
@ -24,33 +24,35 @@ deployAndroidPackage {
rm -rf docs tests
# Patch the executables of the toolchains, but not the libraries -- they are needed for crosscompiling
if [ -d $out/libexec/android-sdk/ndk-bundle/toolchains/renderscript/prebuilt/linux-x86_64/lib64 ]; then
addAutoPatchelfSearchPath $out/libexec/android-sdk/ndk-bundle/toolchains/renderscript/prebuilt/linux-x86_64/lib64
fi
addAutoPatchelfSearchPath $out/libexec/android-sdk/ndk-bundle/toolchains/renderscript/prebuilt/linux-x86_64/lib64
find toolchains -type d -name bin | while read dir
do
if [ -d $out/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib64 ]; then
addAutoPatchelfSearchPath $out/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib64
fi
find toolchains -type d -name bin -or -name lib64 | while read dir; do
autoPatchelf "$dir"
done
# fix ineffective PROGDIR / MYNDKDIR determination
for i in ndk-build
do
sed -i -e 's|^PROGDIR=`dirname $0`|PROGDIR=`dirname $(readlink -f $(which $0))`|' $i
for progname in ndk-build; do
sed -i -e 's|^PROGDIR=`dirname $0`|PROGDIR=`dirname $(readlink -f $(which $0))`|' $progname
done
# Patch executables
autoPatchelf prebuilt/linux-x86_64
# wrap
for i in ndk-build
do
wrapProgram "$(pwd)/$i" --prefix PATH : "${runtime_paths}"
for progname in ndk-build; do
wrapProgram "$(pwd)/$progname" --prefix PATH : "${runtime_paths}"
done
# make some executables available in PATH
mkdir -p $out/bin
for i in ndk-build
do
ln -sf ../libexec/android-sdk/ndk-bundle/$i $out/bin/$i
for progname in ndk-build; do
ln -sf ../libexec/android-sdk/ndk-bundle/$progname $out/bin/$progname
done
'');
noAuditTmpdir = true; # Audit script gets invoked by the build/ component in the path for the make standalone script

36
pkgs/development/mobile/androidenv/querypackages.sh Normal file → Executable file
View file

@ -1,27 +1,23 @@
#!/bin/sh -e
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p jq
if [ "$1" = "" ]
then
echo "Please select a package set: 'packages', 'addons', 'system-images'" >&2
set -e
pushd "$(dirname "$0")" &>/dev/null || exit 1
if [ "$1" == '' ]; then
echo "Please select a group: 'packages', 'images', 'addons', 'extras', or 'licenses'" >&2
exit 1
fi
if [ "$2" = "" ]
then
echo "Please select a package group:" >&2
( cat <<EOF
builtins.attrNames (import ./generated/$1.nix {
fetchurl = null;
})
EOF
) | nix-instantiate --eval-only -
namespace="$1"
exit 1
if [ "$namespace" == 'licenses' ]; then
jq -r '.licenses | keys | join("\n")' < repo.json
else
jq -r --arg NAMESPACE "$namespace" \
'.[$NAMESPACE] | paths as $path | getpath($path) as $v | select($path[-1] == "displayName") | [[$NAMESPACE] + $path[:-1] | map("\"" + . + "\"") | join("."), $v] | join(": ")' \
< repo.json
fi
( cat <<EOF
builtins.attrNames (import ./generated/$1.nix {
fetchurl = null;
}).$2
EOF
) | nix-instantiate --eval-only -
popd &>/dev/null

File diff suppressed because one or more lines are too long