From 9c4ef9ce32259ef9687ec00ef6d88125b53a1a6e Mon Sep 17 00:00:00 2001 From: Magick4 <112317807+Magick4@users.noreply.github.com> Date: Tue, 14 Apr 2026 22:47:27 -0600 Subject: [PATCH] Add KernelSU module files and build workflow --- .github/workflows/build-ksu.yml | 40 ++++++++++++++++ ksu-module/build.sh | 14 ++++++ ksu-module/fox/fps/FpsOverlay.java | 74 ++++++++++++++++++++++++++++++ ksu-module/module.prop | 6 +++ ksu-module/service.sh | 11 +++++ 5 files changed, 145 insertions(+) create mode 100644 .github/workflows/build-ksu.yml create mode 100644 ksu-module/build.sh create mode 100644 ksu-module/fox/fps/FpsOverlay.java create mode 100644 ksu-module/module.prop create mode 100644 ksu-module/service.sh diff --git a/.github/workflows/build-ksu.yml b/.github/workflows/build-ksu.yml new file mode 100644 index 0000000..ee0d952 --- /dev/null +++ b/.github/workflows/build-ksu.yml @@ -0,0 +1,40 @@ +name: Build KernelSU Module + +on: + push: + branches: [ ksu-module ] + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout source + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Install Build Tools and Platforms + run: | + sdkmanager "build-tools;33.0.0" "platforms;android-33" + + - name: Build Module + run: | + cd ksu-module + chmod +x build.sh + ./build.sh + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: fox_live_fps + path: ksu-module/fox_live_fps.zip + retention-days: 30 diff --git a/ksu-module/build.sh b/ksu-module/build.sh new file mode 100644 index 0000000..0f57eb2 --- /dev/null +++ b/ksu-module/build.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Ensure you have the Android SDK installed for javac and d8 + +# 1. Compile the Java source against the Android framework +javac -cp $ANDROID_HOME/platforms/android-33/android.jar fox/fps/FpsOverlay.java + +# 2. Convert to DEX bytecode +$ANDROID_HOME/build-tools/33.0.0/d8 fox/fps/FpsOverlay.class --output . + +# 3. Rename and package the KSU module +mv classes.dex fps_overlay.dex +zip -r fox_live_fps.zip module.prop service.sh fps_overlay.dex + +echo "Done. Flash fox_live_fps.zip in KernelSU, bitch." diff --git a/ksu-module/fox/fps/FpsOverlay.java b/ksu-module/fox/fps/FpsOverlay.java new file mode 100644 index 0000000..957e124 --- /dev/null +++ b/ksu-module/fox/fps/FpsOverlay.java @@ -0,0 +1,74 @@ +package fox.fps; + +import android.app.ActivityThread; +import android.content.Context; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.os.Handler; +import android.os.Looper; +import android.view.Gravity; +import android.view.WindowManager; +import android.widget.TextView; +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class FpsOverlay { + public static void main(String[] args) { + Looper.prepare(); + try { + // Grab the system context directly from ActivityThread + ActivityThread thread = ActivityThread.systemMain(); + Context context = thread.getSystemContext(); + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + + TextView tv = new TextView(context); + tv.setText("FPS: --"); + tv.setTextColor(Color.GREEN); + tv.setTextSize(18f); + tv.setBackgroundColor(Color.argb(150, 0, 0, 0)); + tv.setPadding(15, 10, 15, 10); + + WindowManager.LayoutParams params = new WindowManager.LayoutParams( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT, + 2015, // TYPE_SECURE_SYSTEM_OVERLAY - bypasses draw-over-apps permission + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, + PixelFormat.TRANSLUCENT + ); + params.gravity = Gravity.TOP | Gravity.LEFT; + params.x = 50; + params.y = 50; + + wm.addView(tv, params); + + Handler handler = new Handler(); + Runnable updateFps = new Runnable() { + @Override + public void run() { + tv.setText("FPS: " + getFps()); + handler.postDelayed(this, 500); + } + }; + handler.post(updateFps); + + } catch (Exception e) { + e.printStackTrace(); + } + Looper.loop(); + } + + private static String getFps() { + try { + // Standard Qualcomm DRM sysfs node. + Process p = Runtime.getRuntime().exec(new String[]{"sh", "-c", "cat /sys/class/drm/sde-crtc-*/measured_fps | head -n 1"}); + BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line = reader.readLine(); + if (line != null && !line.trim().isEmpty()) { + return line.trim().split(" ")[0]; + } + } catch (Exception e) {} + return "N/A"; + } +} diff --git a/ksu-module/module.prop b/ksu-module/module.prop new file mode 100644 index 0000000..010c882 --- /dev/null +++ b/ksu-module/module.prop @@ -0,0 +1,6 @@ +id=fox_live_fps +name=Live FPS Overlay +version=v1.0 +versionCode=1 +author=Fox +description=Displays a live FPS overlay using app_process. diff --git a/ksu-module/service.sh b/ksu-module/service.sh new file mode 100644 index 0000000..6a7a9d3 --- /dev/null +++ b/ksu-module/service.sh @@ -0,0 +1,11 @@ +#!/system/bin/sh +MODDIR=${0%/*} + +# Wait for boot to finish so WindowManager is ready +while [ "$(getprop sys.boot_completed)" != "1" ]; do + sleep 1 +done + +# Launch the app_process payload in the background +export CLASSPATH=$MODDIR/fps_overlay.dex +app_process /system/bin fox.fps.FpsOverlay &