From 1d6ff634060e001ca2bf4377edd9db45d0df5abb Mon Sep 17 00:00:00 2001 From: Jean-Marie 'Histausse' Mineau Date: Thu, 30 Oct 2025 23:43:24 +0100 Subject: [PATCH] make function for .class and .dex --- build.sh | 1 + flake.nix | 79 ++++++++++++++----- java/actual/com/example/shadowing/Main.java | 10 +++ java/dummy/com/example/shadowing/Main.java | 10 +++ java/empty/com/example/shadowing/Empty.java | 4 + .../com/example/shadowing/MainActivity.java | 11 ++- 6 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 java/actual/com/example/shadowing/Main.java create mode 100644 java/dummy/com/example/shadowing/Main.java create mode 100644 java/empty/com/example/shadowing/Empty.java rename java/{classes => main}/com/example/shadowing/MainActivity.java (72%) diff --git a/build.sh b/build.sh index 1e595d2..7c49d3d 100644 --- a/build.sh +++ b/build.sh @@ -13,4 +13,5 @@ fi #~/Android/Sdk/platform-tools/adb install app.signed.apk #~/Android/Sdk/platform-tools/adb shell am start -n com.example.shadowing/.MainActivity +#adb logcat -s SHADOWING #~/Android/Sdk/platform-tools/adb uninstall com.example.shadowing diff --git a/flake.nix b/flake.nix index 3541686..8b7f246 100644 --- a/flake.nix +++ b/flake.nix @@ -15,7 +15,6 @@ allowUnfree = true; }; }; - #pkgs = nixpkgs.legacyPackages.${system}; jdk = pkgs.javaPackages.compiler.openjdk17; android-env = pkgs.androidenv.composeAndroidPackages { buildToolsVersions = [ "34.0.0" ]; @@ -23,36 +22,76 @@ }; 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/ -# ''; + + 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"; - src = self; + srcs = 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/ + 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/ diff --git a/java/actual/com/example/shadowing/Main.java b/java/actual/com/example/shadowing/Main.java new file mode 100644 index 0000000..b4f7519 --- /dev/null +++ b/java/actual/com/example/shadowing/Main.java @@ -0,0 +1,10 @@ +package com.example.shadowing; + +public class Main { + private static String value = "actual"; + public static void actual() {} + public static String getValue() { + actual(); + return Main.value; + } +} diff --git a/java/dummy/com/example/shadowing/Main.java b/java/dummy/com/example/shadowing/Main.java new file mode 100644 index 0000000..7e66f49 --- /dev/null +++ b/java/dummy/com/example/shadowing/Main.java @@ -0,0 +1,10 @@ +package com.example.shadowing; + +public class Main { + private static String value = "dummy"; + public static void dummy() {} + public static String getValue() { + dummy(); + return Main.value; + } +} diff --git a/java/empty/com/example/shadowing/Empty.java b/java/empty/com/example/shadowing/Empty.java new file mode 100644 index 0000000..ab0b490 --- /dev/null +++ b/java/empty/com/example/shadowing/Empty.java @@ -0,0 +1,4 @@ +package com.example.shadowing; + +public class Empty { +} diff --git a/java/classes/com/example/shadowing/MainActivity.java b/java/main/com/example/shadowing/MainActivity.java similarity index 72% rename from java/classes/com/example/shadowing/MainActivity.java rename to java/main/com/example/shadowing/MainActivity.java index 3df9c3d..a11fce2 100644 --- a/java/classes/com/example/shadowing/MainActivity.java +++ b/java/main/com/example/shadowing/MainActivity.java @@ -6,22 +6,25 @@ import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; -//import android.widget.RelativeLayout; -//import android.view.ViewGroup; -//import android.view.View; +import android.util.Log; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + String txt = Main.getValue(); + String pkg_name = getApplicationContext().getPackageName(); + LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); ll.generateViewId(); setContentView(ll); TextView tw = new TextView(this); - tw.setText("Hello Void!"); + tw.setText(txt); tw.generateViewId(); ll.addView(tw); + + Log.i("SHADOWING", "App: " + pkg_name + ", txt: " + txt); } }