diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml index 4001e1c9..52ee9c1f 100644 --- a/.github/workflows/core.yml +++ b/.github/workflows/core.yml @@ -64,14 +64,16 @@ jobs: with: gradle-home-cache-cleanup: true - - name: Setup Android SDK - uses: android-actions/setup-android@v3 - - name: Setup ninja uses: seanmiddleditch/gha-setup-ninja@master with: version: 1.12.0 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + - name: Setup ccache uses: hendrikmuhs/ccache-action@v1.2 with: diff --git a/magisk-loader/build.gradle.kts b/magisk-loader/build.gradle.kts index a5deb3a2..e67005fc 100644 --- a/magisk-loader/build.gradle.kts +++ b/magisk-loader/build.gradle.kts @@ -126,6 +126,46 @@ val zipAll = task("zipAll") { group = "LSPosed" } +val generateWebRoot = tasks.register("generateWebRoot") { + group = "LSPosed" + val webroottmp = File("$projectDir/build/intermediates/generateWebRoot") + val webrootsrc = File(webroottmp, "src") + + onlyIf { + val os = org.gradle.internal.os.OperatingSystem.current() + if (os.isWindows) { + exec { + commandLine("cmd", "/c", "where", "pnpm") + isIgnoreExitValue = true + }.exitValue == 0 + } else { + exec { + commandLine("which", "pnpm") + isIgnoreExitValue = true + }.exitValue == 0 + } + } + + doFirst { + webroottmp.mkdirs() + webrootsrc.mkdirs() + } + + from("$projectDir/src/webroot") + into(webrootsrc) + + doLast { + exec { + workingDir = webroottmp + commandLine("pnpm", "add", "-D", "parcel-bundler", "kernelsu") + } + exec { + workingDir = webroottmp + commandLine("./node_modules/.bin/parcel", "build", "src/index.html") + } + } +} + fun afterEval() = android.applicationVariants.forEach { variant -> val variantCapped = variant.name.replaceFirstChar { it.uppercase() } val variantLowered = variant.name.lowercase() @@ -145,7 +185,8 @@ fun afterEval() = android.applicationVariants.forEach { variant -> "assemble$variantCapped", ":app:package$buildTypeCapped", ":daemon:package$buildTypeCapped", - ":dex2oat:externalNativeBuild${buildTypeCapped}" + ":dex2oat:externalNativeBuild${buildTypeCapped}", + generateWebRoot ) into(magiskDir) from("${rootProject.projectDir}/README.md") @@ -218,6 +259,14 @@ fun afterEval() = android.applicationVariants.forEach { variant -> from(dexOutPath) rename("classes.dex", "lspd.dex") } + into("webroot") { + if (flavorLowered.startsWith("zygisk")) { + from("$projectDir/build/intermediates/generateWebRoot/dist") { + include("**/*.js") + include("**/*.html") + } + } + } val injected = objects.newInstance(magiskDir.get().asFile.path) doLast { diff --git a/magisk-loader/magisk_module/customize.sh b/magisk-loader/magisk_module/customize.sh index ee84c316..e88f19ff 100644 --- a/magisk-loader/magisk_module/customize.sh +++ b/magisk-loader/magisk_module/customize.sh @@ -90,7 +90,18 @@ rm -f /data/adb/lspd/manager.apk extract "$ZIPFILE" 'manager.apk' "$MODPATH" if [ "$FLAVOR" == "zygisk" ]; then + # extract for KernelSU and APatch + if [ "$KSU" ] || [ "$APATCH" ]; then + # webroot only for zygisk + mkdir -p "$MODPATH/webroot" + extract "$ZIPFILE" "webroot/index.html" "$MODPATH/webroot" true + # evaluate if use awk or tr -s ' ' | cut -d' ' -f5 + SRCJS=$(unzip -l "$ZIPFILE" | grep "webroot/src" | grep -v sha256 | awk '{print $4}') + extract "$ZIPFILE" "$SRCJS" "$MODPATH/webroot" true + fi + mkdir -p "$MODPATH/zygisk" + if [ "$ARCH" = "arm" ] || [ "$ARCH" = "arm64" ]; then extract "$ZIPFILE" "lib/armeabi-v7a/liblspd.so" "$MODPATH/zygisk" true mv "$MODPATH/zygisk/liblspd.so" "$MODPATH/zygisk/armeabi-v7a.so" diff --git a/magisk-loader/src/webroot/index.html b/magisk-loader/src/webroot/index.html new file mode 100644 index 00000000..7ceefe5a --- /dev/null +++ b/magisk-loader/src/webroot/index.html @@ -0,0 +1,9 @@ + + + + + JingMatrix/LSPosed + + + + diff --git a/magisk-loader/src/webroot/index.js b/magisk-loader/src/webroot/index.js new file mode 100644 index 00000000..737fea8a --- /dev/null +++ b/magisk-loader/src/webroot/index.js @@ -0,0 +1,12 @@ +import { exec } from "kernelsu"; +import { toast } from "kernelsu"; + +async function open_manager() { + toast("LSPosed Manager starting..."); + const { errno, stdout, stderr } = await exec( + "am start -c org.lsposed.manager.LAUNCH_MANAGER com.android.shell/.BugreportWarningActivity", + { cwd: "/system" } + ); +} + +open_manager();