Skip to content

Latest commit

Β 

History

History
119 lines (91 loc) Β· 2.8 KB

File metadata and controls

119 lines (91 loc) Β· 2.8 KB

Creating LSPosed Modules

Guide to building your own Xposed/LSPosed modules.


Project Setup

# Clone template
git clone https://github.com/LSPosed/LSPosed.git

# Or use Android Studio:
# File β†’ New β†’ Project β†’ use module template from LSPosed

Minimal Module Structure

MyModule/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ build.gradle
β”‚   └── src/main/
β”‚       β”œβ”€β”€ AndroidManifest.xml
β”‚       β”œβ”€β”€ resources/
β”‚       └── java/
β”‚           └── com/example/MyModule.kt
β”œβ”€β”€ template/
β”‚   └── system.prop
└── build.gradle

Hook Example (Kotlin)

package com.example.mymodule

import de.robv.android.xposed.IXposedHookLoadPackage
import de.robv.android.xposed.XC_MethodHook
import de.robv.android.xposed.XposedBridge
import de.robv.android.xposed.callbacks.XC_LoadPackage

class Hook : IXposedHookLoadPackage {
    override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
        if (lpparam.packageName != "com.target.app") return

        // Hook a method
        val targetClass = lpparam.classLoader.loadClass("com.target.app.MainActivity")
        XposedBridge.hookAllMethods(targetClass, "onCreate", object : XC_MethodHook() {
            override fun beforeHookedMethod(param: MethodHookParam) {
                XposedBridge.log("onCreate called!")
            }

            override fun afterHookedMethod(param: MethodHookParam) {
                // Modify the result if needed
                param.result = null
            }
        })
    }
}

Building & Installing

# Build
./gradlew build

# Output APK: app/build/outputs/apk/release/app-release.apk

# Install (must have Magisk + Zygisk + LSPosed)
adb install app/build/outputs/apk/release/app-release.apk

# Enable in LSPosed Manager
# Restart target app

Common Hooks

System Settings

val settingsClass = lpparam.classLoader.loadClass("android.provider.Settings")
XposedBridge.hookMethod(settingsClass.getMethod("getString", ...)) { hook ->
    // Intercept settings
}

Permissions

val pmClass = lpparam.classLoader.loadClass("android.app.ApplicationPackageManager")
XposedBridge.hookMethod(pmClass.getMethod("checkPermission", ...)) { hook ->
    hook.result = android.content.pm.PackageManager.PERMISSION_GRANTED
}

Network

val urlClass = lpparam.classLoader.loadClass("java.net.URL")
XposedBridge.hookMethod(urlClass.getMethod("openConnection")) { hook ->
    // Intercept network calls
}

Publishing

  1. Build release APK
  2. Upload to XDA or LSPosed Module Repo
  3. Users install through LSPosed Manager β†’ Modules
  4. Select app scope, reboot, done

Resources: