android-shadowing-bench/flake.nix

118 lines
4.5 KiB
Nix

{
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;
};
};
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";
javaCompile = folder: pkgs.stdenvNoCC.mkDerivation {
name = "java-class-${folder}";
src = self;
buildInputs = [ jdk android-env.androidsdk ];
phases = ["unpackPhase" "buildPhase"];
buildPhase = ''
mkdir $out
javac -classpath ${platforms}/android.jar $(find ${folder} -type f -name '*.java') -d $out/
'';
};
java2dex = drv: pkgs.stdenvNoCC.mkDerivation {
name = "${drv}-classes.dex";
srcs = drv;
# jdk env needed for d8
buildInputs = [ jdk android-env.androidsdk ];
phases = ["unpackPhase" "buildPhase" "installPhase"];
buildPhase = ''
mkdir build
d8 --classpath ${platforms}/android.jar $(find . -name '*.class') --output build/
'';
installPhase = ''
mv build/classes.dex $out
'';
};
java-classes-main = pkgs.stdenvNoCC.mkDerivation {
name = "java-class-main";
src = self;
buildInputs = [ jdk android-env.androidsdk ];
phases = ["unpackPhase" "buildPhase"];
buildPhase = ''
mkdir $out
javac -classpath ${platforms}/android.jar $(find java/main -type f -name '*.java') $(find java/actual -type f -name '*.java') -d $out/
find java/actual/ -type f -name '*.java' | while read f ; do
class_file=$(echo $f | sed "s#java/actual/##" | sed 's/.java/.class/')
rm $out/$class_file
done
'';
};
java-classes-actual = javaCompile "java/actual";
java-classes-dummy = javaCompile "java/dummy";
java-classes-empty = javaCompile "java/empty";
main-actual-classes-dex = java2dex (pkgs.symlinkJoin {
name = "classes-main-actual";
paths = [ java-classes-main java-classes-actual ];
});
main-dummy-classes-dex = java2dex (pkgs.symlinkJoin {
name = "classes-main-dummy";
paths = [ java-classes-main java-classes-dummy ];
});
main-classes-dex = java2dex java-classes-main;
actual-classes-dex = java2dex java-classes-actual;
dummy-classes-dex = java2dex java-classes-dummy;
empty-classes-dex = java2dex java-classes-empty;
in rec {
packages = {
default = pkgs.stdenvNoCC.mkDerivation rec {
name = "com-example-shadowing.apk";
srcs = self;
buildInputs = [ jdk android-env.androidsdk pkgs.which ];
phases = ["unpackPhase" "buildPhase" "installPhase"];
buildPhase = ''
mkdir -p build/apk_files/
cp ${main-actual-classes-dex} build/apk_files/classes.dex
# 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 = ''
#'';
};
})
;
}