diff --git a/build.sh b/build.sh deleted file mode 100644 index 7c49d3d..0000000 --- a/build.sh +++ /dev/null @@ -1,17 +0,0 @@ -javac -classpath ~/Android/Sdk/platforms/android-34/android.jar java/classes/com/example/shadowing/MainActivity.java -d build/ -d8 --classpath ~/Android/Sdk/platforms/android-34/android.jar build/com/example/shadowing/MainActivity.class --output build/ -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/ -# 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 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 -#adb logcat -s SHADOWING -#~/Android/Sdk/platform-tools/adb uninstall com.example.shadowing diff --git a/flake.nix b/flake.nix index 957956e..40b7726 100644 --- a/flake.nix +++ b/flake.nix @@ -57,6 +57,45 @@ cat AndroidManifest.xml | sed 's/PACKAGE/${package}/' | sed 's/NAME/${name}/' > $out/AndroidManifest.xml ''; }; + keypass = "P@ssw0rd!"; + keystore = pkgs.stdenvNoCC.mkDerivation { + name = "shadowing.keystore"; + buildInputs = [ jdk ]; + phases = ["buildPhase"]; + buildPhase = '' + keytool -genkeypair -validity 1000 -dname "CN=SomeKey,O=SomeOne,C=FR" -keystore $out -storepass '${keypass}' -keypass '${keypass}' -alias SignKey -keyalg RSA -v + ''; + }; + make-apk = { + package, + name, + classes, + } : let + manifest = make-manifest package name; + in pkgs.stdenvNoCC.mkDerivation { + name = "${package}"; + buildInputs = [ jdk android-env.androidsdk ]; + phases = ["buildPhase" "installPhase"]; + buildPhase = '' + mkdir -p build/apk_files + + ${pkgs.lib.strings.concatMapStringsSep "\n" ( item: + "cp ${item.drv} build/apk_files/${item.name}" + ) classes} + + # link classes.dex not working? + # ${build-tools}/aapt2 link -v ---manifest ${manifest}/AndroidManifest.xml -I ${platforms}/android.jar -o build/app.apk build/apk_files/ + + ${build-tools}/aapt package -v -f -M ${manifest}/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 + ${build-tools}/apksigner sign -ks ${keystore} --v2-signing-enabled true --in build/app.aligned.apk --out build/${package}.apk --ks-pass 'pass:${keypass}' + ''; + installPhase = '' + mkdir $out + cp build/${package}.apk $out/ + cp build/${package}.apk.idsig $out/ + ''; + }; java-classes-main = pkgs.stdenvNoCC.mkDerivation { name = "java-class-main"; @@ -89,35 +128,65 @@ dummy-classes-dex = java2dex java-classes-dummy; empty-classes-dex = java2dex java-classes-empty; - in rec { + in { - packages = { - default = let - manifest = make-manifest "com.example.shadowing.control" "Shadowing C"; - in 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 ${manifest}/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/ - ''; + packages = rec { + control = make-apk { + package = "com.example.shadowing.control"; + name = "Shadowing C"; + classes = [ + { name = "classes.dex"; drv = main-actual-classes-dex; } + ]; + }; + # classes.dex vs classes2.dex + shdw1 = make-apk { + package = "com.example.shadowing.one"; + name = "Shadowing 1"; + classes = [ + { name = "classes.dex"; drv = main-actual-classes-dex; } + { name = "classes2.dex"; drv = dummy-classes-dex; } + ]; + }; + # classes2.dex vs classes3.dex + shdw2 = make-apk { + package = "com.example.shadowing.two"; + name = "Shadowing 2"; + classes = [ + { name = "classes.dex"; drv = main-classes-dex; } + { name = "classes2.dex"; drv = actual-classes-dex; } + { name = "classes3.dex"; drv = dummy-classes-dex; } + ]; + }; + # classes2.dex vs classes1.dex + shdw3 = make-apk { + package = "com.example.shadowing.three"; + name = "Shadowing 3"; + classes = [ + { name = "classes.dex"; drv = main-classes-dex; } + { name = "classes1.dex"; drv = dummy-classes-dex; } + { name = "classes2.dex"; drv = actual-classes-dex; } + ]; + }; + # classes10.dex vs classes2.dex + shdw4 = make-apk { + package = "com.example.shadowing.four"; + name = "Shadowing 4"; + classes = [ + { name = "classes.dex"; drv = main-classes-dex; } + { name = "classes2.dex"; drv = actual-classes-dex; } + { name = "classes3.dex"; drv = empty-classes-dex; } + { name = "classes4.dex"; drv = empty-classes-dex; } + { name = "classes5.dex"; drv = empty-classes-dex; } + { name = "classes6.dex"; drv = empty-classes-dex; } + { name = "classes7.dex"; drv = empty-classes-dex; } + { name = "classes8.dex"; drv = empty-classes-dex; } + { name = "classes9.dex"; drv = empty-classes-dex; } + { name = "classes10.dex"; drv = dummy-classes-dex; } + ]; + }; + default = pkgs.symlinkJoin { + name = "all-shadowing-apks"; + paths = [ control shdw1 shdw2 shdw3 shdw4]; }; }; diff --git a/test-on-android.sh b/test-on-android.sh new file mode 100644 index 0000000..1994f68 --- /dev/null +++ b/test-on-android.sh @@ -0,0 +1,16 @@ +#!/usr/bin/bash + +APK_FOLDER="./result" + +adb logcat -s SHADOWING & +log_pid=$! + +for pkg in $(ls ${APK_FOLDER} | grep '.apk$' | sed 's/.apk$//'); do + adb install "${APK_FOLDER}/${pkg}.apk" &> /dev/null + sleep 2 + adb shell am start -n "${pkg}/com.example.shadowing.MainActivity" &> /dev/null + sleep 2 + adb uninstall "${pkg}" &> /dev/null +done + +kill "${log_pid}"