{ description = "APKs demonstrating class shadowing."; inputs = { nixpkgs.url = github:nixos/nixpkgs/nixos-unstable; flake-utils.url = github:numtide/flake-utils; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let 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 ${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 = '' #''; }; }) ; }