From 33dd0715aefb9df09da345d49e5222b101aec512 Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 4 Jun 2022 23:50:59 +0800 Subject: [PATCH] apksigner --- pkgs/development/tools/apksigner/default.nix | 102 ++++++++++++++++--- pkgs/top-level/all-packages.nix | 4 +- 2 files changed, 90 insertions(+), 16 deletions(-) diff --git a/pkgs/development/tools/apksigner/default.nix b/pkgs/development/tools/apksigner/default.nix index 7b05479ea42f..e7afa7189c22 100644 --- a/pkgs/development/tools/apksigner/default.nix +++ b/pkgs/development/tools/apksigner/default.nix @@ -1,15 +1,91 @@ -{ runCommand +{ lib +, stdenv +, fetchgit +, openjdk17_headless +, gradle +, perl , makeWrapper -, jre -, build-tools }: -let - tools = builtins.head build-tools; -in -runCommand "apksigner" { - nativeBuildInputs = [ makeWrapper ]; -} '' - mkdir -p $out/bin - makeWrapper "${jre}/bin/java" "$out/bin/apksigner" \ - --add-flags "-jar ${tools}/libexec/android-sdk/build-tools/${tools.version}/lib/apksigner.jar" -'' + +stdenv.mkDerivation rec { + pname = "apksigner"; + version = "33.0.1"; + + src = fetchgit { + # use pname here because the final jar uses this as the filename + name = pname; + url = "https://android.googlesource.com/platform/tools/apksig"; + rev = "platform-tools-${version}"; + hash = "sha256-CKvwB9Bb12QvkL/HBOwT6DhA1PI45+QnTNfwnvReGUQ="; + }; + + postPatch = '' + cat >> build.gradle < com/squareup/okio/okio/1.13.0/okio-1.13.0.jar) + installPhase = '' + find $GRADLE_USER_HOME/caches/modules-2 -type f -regex '.*\.\(jar\|pom\)' \ + | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/''${\($5 =~ s/okio-jvm/okio/r)}" #e' \ + | sh + ''; + # Don't move info to share/ + forceShare = [ "dummy" ]; + outputHashMode = "recursive"; + # Downloaded jars differ by platform + outputHash = "sha256-cs95YI0SpvzCo5x5trMXlVUGepNKIH9oZ95AfLErKIU="; + }; + + preBuild = '' + # Use the local packages from -deps + sed -i -e '/repositories {/a maven { url uri("${deps}") }' build.gradle + ''; + + buildPhase = '' + runHook preBuild + + export GRADLE_USER_HOME=$(mktemp -d) + gradle --offline --no-daemon build + + runHook postBuild + ''; + + nativeBuildInputs = [ gradle makeWrapper ]; + + installPhase = '' + install -Dm444 build/libs/apksigner.jar -t $out/lib + makeWrapper "${openjdk17_headless}/bin/java" "$out/bin/apksigner" \ + --add-flags "-jar $out/lib/apksigner.jar" + ''; + + meta = with lib; { + description = "Command line tool to sign and verify Android APKs"; + homepage = "https://developer.android.com/studio/command-line/apksigner"; + license = licenses.asl20; + maintainers = with maintainers; [ linsui ]; + platforms = [ "x86_64-linux" ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 77c7b2a6b01c..fcd27c06fec7 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1733,9 +1733,7 @@ with pkgs; apksigcopier = callPackage ../development/tools/apksigcopier { }; - apksigner = callPackage ../development/tools/apksigner { - inherit (androidenv.androidPkgs_9_0) build-tools; - }; + apksigner = callPackage ../development/tools/apksigner { }; apktool = callPackage ../development/tools/apktool { inherit (androidenv.androidPkgs_9_0) build-tools;