From 8feefbefe52f0fea4bca745d8c06346e25f95305 Mon Sep 17 00:00:00 2001 From: Jean-Marie 'Histausse' Mineau Date: Thu, 30 Oct 2025 13:26:44 +0100 Subject: [PATCH] build with nix --- .gitignore | 1 + build.sh | 14 +++++++----- flake.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 flake.lock diff --git a/.gitignore b/.gitignore index 378eac2..43cad3d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build +result diff --git a/build.sh b/build.sh index aae860a..1e595d2 100644 --- a/build.sh +++ b/build.sh @@ -3,10 +3,14 @@ d8 --classpath ~/Android/Sdk/platforms/android-34/android.jar build/com/example/ mkdir -p build/apk_files/ cp build/classes.dex build/apk_files/ ~/Android/Sdk/build-tools/34.0.0/aapt package -v -f -M AndroidManifest.xml -I ~/Android/Sdk/platforms/android-34/android.jar -F build/app.apk build/apk_files/ -keytool -genkeypair -validity 1000 -dname "CN=SomeKey,O=SomeOne,C=FR" -keystore build/ToyKey.keystore -storepass 'P@ssw0rd!' -keypass 'P@ssw0rd!' -alias SignKey -keyalg RSA -v +# Not working +#~/Android/Sdk/build-tools/34.0.0/aapt2 link -v --manifest AndroidManifest.xml -I ~/Android/Sdk/platforms/android-34/android.jar -o build/app.apk build/apk_files/* +if [ ! -f build/ToyKey.keystore ]; then + keytool -genkeypair -validity 1000 -dname "CN=SomeKey,O=SomeOne,C=FR" -keystore build/ToyKey.keystore -storepass 'P@ssw0rd!' -keypass 'P@ssw0rd!' -alias SignKey -keyalg RSA -v +fi ~/Android/Sdk/build-tools/34.0.0/zipalign -f 4 build/app.apk build/app.aligned.apk -~/Android/Sdk/build-tools/34.0.0/apksigner sign -ks ToyKey.keystore --v2-signing-enabled true --in app.aligned.apk --out app.signed.apk --ks-pass 'pass:P@ssw0rd!' +~/Android/Sdk/build-tools/34.0.0/apksigner sign -ks build/ToyKey.keystore --v2-signing-enabled true --in build/app.aligned.apk --out build/app.signed.apk --ks-pass 'pass:P@ssw0rd!' -~/Android/Sdk/platform-tools/adb install app.signed.apk -~/Android/Sdk/platform-tools/adb shell am start -n com.example.shadowing/.MainActivity -~/Android/Sdk/platform-tools/adb uninstall com.example.shadowing +#~/Android/Sdk/platform-tools/adb install app.signed.apk +#~/Android/Sdk/platform-tools/adb shell am start -n com.example.shadowing/.MainActivity +#~/Android/Sdk/platform-tools/adb uninstall com.example.shadowing diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..d0c8490 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1761373498, + "narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 334606f..3541686 100644 --- a/flake.nix +++ b/flake.nix @@ -8,12 +8,71 @@ outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let - pkgs = nixpkgs.legacyPackages.${system}; + pkgs = import nixpkgs { + system = system; + config = { + android_sdk.accept_license = true; + allowUnfree = true; + }; + }; + #pkgs = nixpkgs.legacyPackages.${system}; + jdk = pkgs.javaPackages.compiler.openjdk17; + android-env = pkgs.androidenv.composeAndroidPackages { + buildToolsVersions = [ "34.0.0" ]; + platformVersions = [ "34" ]; + }; + platforms = "${builtins.head android-env.platforms}/libexec/android-sdk/platforms/android-34"; + build-tools = "${builtins.head android-env.build-tools}/libexec/android-sdk/build-tools/34.0.0"; +# build-tools = pkgs.runCommandNoCC "build-tools-v34_0_0-unzip" {} '' +# ${pkgs.unzip}/bin/unzip ${pkgs.androidenv.androidPkgs.all.packages.build-tools.v34_0_0} -d tmp +# mkdir $out +# mv tmp/android-14/* $out/ +# patchShebangs $out/d8 +# ''; +# platforms = pkgs.runCommandNoCC "platforms-v34_0_0-unzip" {} '' +# ${pkgs.unzip}/bin/unzip ${pkgs.androidenv.androidPkgs.all.packages.platforms.v34} -d tmp +# mkdir $out +# mv tmp/android-34/* $out/ +# ''; + in rec { + packages = { + default = pkgs.stdenvNoCC.mkDerivation rec { + name = "com-example-shadowing.apk"; + src = self; + buildInputs = [ jdk android-env.androidsdk pkgs.which ]; + phases = ["unpackPhase" "buildPhase" "installPhase"]; + buildPhase = '' + mkdir build - devShells.default = pkgs.mkShell { - packages = [ pkgs.hello ]; + ${jdk}/bin/javac -classpath ${platforms}/android.jar java/classes/com/example/shadowing/MainActivity.java -d build/ + file build/com/example/shadowing/MainActivity.class >> build/tools.txt + echo $(which d8) --classpath ${platforms}/android.jar build/com/example/shadowing/MainActivity.class --output build/ >> build/tools.txt + d8 --classpath ${platforms}/android.jar build/com/example/shadowing/MainActivity.class --output build/ + mkdir -p build/apk_files/ + + cp build/classes.dex build/apk_files/ + # link classes.dex not working? + # ${build-tools}/aapt2 link -v ---manifest AndroidManifest.xml -I ${platforms}/android.jar -o build/app.apk build/apk_files/ + ${build-tools}/aapt package -v -f -M AndroidManifest.xml -I ${platforms}/android.jar -F build/app.apk build/apk_files/ + ${build-tools}/zipalign -f 4 build/app.apk build/app.aligned.apk + + keytool -genkeypair -validity 1000 -dname "CN=SomeKey,O=SomeOne,C=FR" -keystore build/ToyKey.keystore -storepass 'P@ssw0rd!' -keypass 'P@ssw0rd!' -alias SignKey -keyalg RSA -v + ${build-tools}/apksigner sign -ks build/ToyKey.keystore --v2-signing-enabled true --in build/app.aligned.apk --out build/app.signed.apk --ks-pass 'pass:P@ssw0rd!' + ''; + installPhase = '' + mkdir $out + cp build/app.signed.apk $out/ + cp build/app.signed.apk.idsig $out/ + ''; + }; + }; + + devShells.default = pkgs.mkShellNoCC { + packages = [ jdk android-env.androidsdk ]; + #shellHook = '' + #''; }; }) ;