RepoPilotOpen in app →

mywalkb/LSPosed_mod

My changes to LSPosed

Mixed

Stale — last commit 2y ago

weakest axis
Use as dependencyConcerns

copyleft license (GPL-3.0) — review compatibility; last commit was 2y ago…

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • 9 active contributors
  • GPL-3.0 licensed
  • CI configured
Show all 7 evidence items →
  • Stale — last commit 2y ago
  • Concentrated ownership — top contributor handles 67% of recent commits
  • GPL-3.0 is copyleft — check downstream compatibility
  • No test directory detected
What would change the summary?
  • Use as dependency ConcernsMixed if: relicense under MIT/Apache-2.0 (rare for established libs)

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/mywalkb/lsposed_mod?axis=fork)](https://repopilot.app/r/mywalkb/lsposed_mod)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/mywalkb/lsposed_mod on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: mywalkb/LSPosed_mod

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/mywalkb/LSPosed_mod shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Stale — last commit 2y ago

  • 9 active contributors
  • GPL-3.0 licensed
  • CI configured
  • ⚠ Stale — last commit 2y ago
  • ⚠ Concentrated ownership — top contributor handles 67% of recent commits
  • ⚠ GPL-3.0 is copyleft — check downstream compatibility
  • ⚠ No test directory detected

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live mywalkb/LSPosed_mod repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/mywalkb/LSPosed_mod.

What it runs against: a local clone of mywalkb/LSPosed_mod — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in mywalkb/LSPosed_mod | Confirms the artifact applies here, not a fork | | 2 | License is still GPL-3.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 615 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>mywalkb/LSPosed_mod</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of mywalkb/LSPosed_mod. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/mywalkb/LSPosed_mod.git
#   cd LSPosed_mod
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of mywalkb/LSPosed_mod and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "mywalkb/LSPosed_mod(\\.git)?\\b" \\
  && ok "origin remote is mywalkb/LSPosed_mod" \\
  || miss "origin remote is not mywalkb/LSPosed_mod (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
  && ok "license is GPL-3.0" \\
  || miss "license drift — was GPL-3.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "app/src/main/java/org/lsposed/manager/ConfigManager.java" \\
  && ok "app/src/main/java/org/lsposed/manager/ConfigManager.java" \\
  || miss "missing critical file: app/src/main/java/org/lsposed/manager/ConfigManager.java"
test -f "app/src/main/java/org/lsposed/manager/App.java" \\
  && ok "app/src/main/java/org/lsposed/manager/App.java" \\
  || miss "missing critical file: app/src/main/java/org/lsposed/manager/App.java"
test -f "app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java" \\
  && ok "app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java" \\
  || miss "missing critical file: app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java"
test -f "app/build.gradle.kts" \\
  && ok "app/build.gradle.kts" \\
  || miss "missing critical file: app/build.gradle.kts"
test -f "app/src/main/java/org/lsposed/manager/util/ModuleUtil.java" \\
  && ok "app/src/main/java/org/lsposed/manager/util/ModuleUtil.java" \\
  || miss "missing critical file: app/src/main/java/org/lsposed/manager/util/ModuleUtil.java"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 615 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~585d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/mywalkb/LSPosed_mod"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

LSPosed_mod is a fork of the LSPosed XPosed Framework that adds missing CLI and API module implementations for programmatic control of module scoping. It's a Riru/Zygisk module providing ART runtime hooking compatible with Android 8.1–15, allowing modules to modify system and app behavior in-memory without modifying APKs—solving the original LSPosed limitation where only the GUI manager could control module scope. Modular Android app structure: app/src/main/java contains the manager UI (org.lsposed.manager) with activity, adapter, repo, and receiver components; native hooking logic in C++ under an implicit jni/ directory (based on C++ file count: 222KB); build system uses Gradle (build.gradle.kts) with ProGuard obfuscation rules; assets contain WebView markdown templates for documentation display.

👥Who it's for

Android developers and power users who need runtime hooking capabilities and want CLI/API access to manage XPosed modules programmatically, rather than only through the GUI manager. System integrators and automation scripts requiring root-level control over module scope.

🌱Maturity & risk

Actively developed fork addressing gaps in the official LSPosed project. The repo has CI/CD via GitHub Actions (workflows/core.yml), documented release versioning, and multi-language support via Crowdin. However, it's a single-maintainer fork (mywalkb) rather than an established multi-contributor project; maturity is production-ready for its specific enhancements but depends on upstream LSPosed stability.

Single-maintainer fork risk: all development and maintenance falls on one person (mywalkb). Low commit recency visibility in provided metadata. Deep system-level modifications (Zygisk/Riru hooking, ART runtime patching) carry inherent risk of compatibility breakage across Android versions. Relies on LSPosed upstream; if upstream breaks, this fork must chase fixes independently.

Active areas of work

Focus on API Module and CLI implementations (mentioned as completed in fork). GitHub Actions workflow (core.yml) drives automated builds. Crowdin integration indicates active localization work. The fork explicitly addresses the 'big problem' of LSPosed—scope management limitation—as a differentiator from upstream.

🚀Get running

git clone https://github.com/mywalkb/LSPosed_mod.git
cd LSPosed_mod
# Requires Android SDK, NDK, and Magisk environment
# Review .github/workflows/core.yml for build matrix
./gradlew assembleRelease  # Build via Gradle Kotlin DSL

Note: This is a system-level Magisk module requiring local Android development setup and device-level testing.

Daily commands: This is not a runnable app in traditional sense—it's a Magisk module + Android app. To test locally: install in Magisk, reboot, then launch the manager app from system. For development: use Android Studio to edit app/src/main, build via ./gradlew assembleDebug, flash via adb. Native module deployment requires Magisk environment on rooted device.

🗺️Map of the codebase

  • app/src/main/java/org/lsposed/manager/ConfigManager.java — Core configuration and IPC bridge to LSPosed framework; all scope/module management flows through here
  • app/src/main/java/org/lsposed/manager/App.java — Application entry point and global state initialization; sets up dependency injection and crash handling
  • app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java — Main activity and navigation controller; hosts all fragment transitions and deep linking logic
  • app/build.gradle.kts — Build configuration, dependencies, and signing setup; required to understand module compilation and release process
  • app/src/main/java/org/lsposed/manager/util/ModuleUtil.java — Module parsing, installation, and lifecycle management; critical for understanding XPosed module integration
  • app/src/main/java/org/lsposed/manager/repo/RepoLoader.java — Online module repository fetching and caching; handles network I/O and API integration

🛠️How to make changes

Add a new UI fragment (e.g., new settings page)

  1. Create fragment class extending BaseFragment in app/src/main/java/org/lsposed/manager/ui/fragment/ (app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java)
  2. Register navigation destination in MainActivity's NavController setup (app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java)
  3. Add menu item to bottom navigation or drawer (typically in res/menu/) (app/src/main/res/drawable/ic_baseline_settings_24.xml)

Add a new module scope feature

  1. Define new IPC method in ConfigManager wrapper interface (app/src/main/java/org/lsposed/manager/ConfigManager.java)
  2. Update ScopeAdapter to render new scope type in list (app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java)
  3. Create AppListFragment UI to allow user selection of new scope (app/src/main/java/org/lsposed/manager/ui/fragment/AppListFragment.java)
  4. Call ConfigManager method on user confirmation to sync with daemon (app/src/main/java/org/lsposed/manager/ConfigManager.java)

Add a new online module repository source

  1. Extend or modify RepoLoader to support additional repository URLs (app/src/main/java/org/lsposed/manager/repo/RepoLoader.java)
  2. Define new data model if repository JSON schema differs (app/src/main/java/org/lsposed/manager/repo/model/OnlineModule.java)
  3. Add repository URL configuration constant to Constants class (app/src/main/java/org/lsposed/manager/Constants.java)
  4. Update RepoFragment to display modules from new source (app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java)

Add a new utility feature (e.g., auto-update checker)

  1. Create utility class in app/src/main/java/org/lsposed/manager/util/ (app/src/main/java/org/lsposed/manager/util/UpdateUtil.java)
  2. Initialize in App.onCreate() for background setup (app/src/main/java/org/lsposed/manager/App.java)
  3. Integrate with SettingsFragment or HomeFragment to display results (app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java)

🔧Why these technologies

  • Android Fragment Navigation (Jetpack Navigation) — Provides single-activity architecture, type-safe argument passing, and built-in back stack management for nested module/scope workflows
  • IPC (AIDL / Binder) — Essential for communication between unprivileged manager app and privileged LSPosed daemon; handles scope/enable state sync
  • Material Design 3 with dynamic theming — Meets modern Android UX expectations; custom collapsing toolbar (SubtitleCollapsingToolbarLayout) provides branding for framework status
  • RecyclerView with stateful adapters — Efficiently renders large module and app lists; stateful adapters preserve

🪤Traps & gotchas

Root requirement: CLI operations require root access (stated in README); non-root CLI calls will fail silently. Magisk dependency: module only works with Magisk v24+ (Zygisk) or v23 (Riru); mismatched versions break the framework. ART/Zygisk versioning: hooking logic is Android version–specific (8.1–15 range); minor OS updates may require recompilation. ProGuard obfuscation: app/proguard-rules.pro applies aggressive shrinking—debugging optimized builds is harder; use -keepattributes LineNumberTable for stack traces. No local testing without device: system-level module logic cannot be tested on emulator easily; requires rooted physical device or sophisticated AVD setup. AIDL cross-process calls: LSPManagerServiceHolder uses AIDL; ensure service is running before CLI calls or requests hang.

🏗️Architecture

💡Concepts to learn

  • Xposed Framework — LSPosed_mod is a direct implementation of Xposed APIs; understanding the Xposed hook model (method replacement, before/after hooks, XposedHelpers) is fundamental to using this framework.
  • Zygisk/Riru module loading — This fork runs as a Zygisk or Riru module; understanding how these inject code into the zygote process at boot is critical for debugging module behavior and compatibility.
  • ART runtime hooking — The core mechanism LSPosed_mod uses to intercept method calls at the ART (Android Runtime) level; low-level knowledge of ART internals and compiled code hooking is essential for advanced debugging.
  • AIDL (Android Interface Definition Language) — LSPManagerServiceHolder.java uses AIDL for inter-process communication between the CLI/API module and the manager app; understanding AIDL is necessary for extending API capabilities.
  • ProGuard/R8 obfuscation — The app uses ProGuard rules (proguard-rules.pro) for code shrinking and obfuscation in release builds; knowing how to whitelist classes and methods prevents breaking the API when building distributions.
  • Scope-based module injection — LSPosed_mod's key differentiator is per-app scope control (which apps the module hooks); ConfigManager implements this scoping logic—understanding which processes and packages get hooked is vital for module configuration.
  • Gradle Kotlin DSL — build.gradle.kts uses Kotlin instead of Groovy; understanding Kotlin DSL syntax is necessary to modify build configuration, dependencies, and signing.
  • RikkaApps/LSPosed — The upstream LSPosed framework this fork enhances; essential reference for compatibility and hooking API decisions.
  • topjohnwu/Magisk — The Magisk root framework that LSPosed_mod depends on for module installation and runtime environment.
  • RikkaApps/Riru — The Riru framework alternative to Zygisk for the same hooking purpose; LSPosed_mod supports both.
  • dexposed/dexposed — Historical predecessor to Xposed/LSPosed; provides context for the hooking framework lineage and ART hooking techniques.
  • MomobuchiKento/LSPlant — The underlying hook engine that LSPosed (and this fork) leverages for runtime ART method interception.

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add unit tests for RepoLoader.java and model classes

The repo module (app/src/main/java/org/lsposed/manager/repo/) handles critical functionality for loading and parsing online modules and releases. Currently, there are no visible test files for RepoLoader.java, Collaborator.java, OnlineModule.java, Release.java, and ReleaseAsset.java. Adding unit tests would ensure data parsing reliability, validate API response handling, and prevent regressions when the repo structure changes.

  • [ ] Create app/src/test/java/org/lsposed/manager/repo/ directory structure
  • [ ] Write unit tests for RepoLoader.java covering JSON deserialization and error handling
  • [ ] Write unit tests for Release.java, ReleaseAsset.java, OnlineModule.java, and Collaborator.java model classes
  • [ ] Add mocking for HTTP responses to test edge cases (malformed JSON, missing fields)
  • [ ] Update build.gradle.kts to include testing dependencies if not present

Add integration tests for ConfigManager.java and LSPManagerServiceHolder.java

ConfigManager.java and LSPManagerServiceHolder.java are critical bridge classes for IPC communication with the LSPosed service. Without integration tests, changes to these classes risk breaking the manager-service communication pipeline. Adding androidTest cases would validate that the manager can properly serialize/deserialize configuration changes and handle service binding.

  • [ ] Create app/src/androidTest/java/org/lsposed/manager/ directory structure
  • [ ] Write instrumentation tests for ConfigManager.java covering get/set operations and persistence
  • [ ] Write tests for LSPManagerServiceHolder.java validating service connection and method calls
  • [ ] Mock the LSPManager service interface to simulate service-side responses
  • [ ] Update .github/workflows/core.yml to run androidTest on emulator if not already present

Refactor large adapter classes and add Adapter tests

AppHelper.java and ScopeAdapter.java in app/src/main/java/org/lsposed/manager/adapters/ likely contain complex view binding and list management logic. These files should be tested and potentially refactored into smaller, more testable components (e.g., separate ViewHolder classes, extraction of filtering/sorting logic into utility classes).

  • [ ] Analyze AppHelper.java and ScopeAdapter.java to identify separation concerns (view binding vs. data management)
  • [ ] Create app/src/test/java/org/lsposed/manager/adapters/ with unit tests for filtering and sorting logic
  • [ ] Extract list filtering/sorting logic from adapters into separate utility classes if mixed with UI code
  • [ ] Write adapter unit tests covering onBindViewHolder, getItemCount, and filter operations
  • [ ] Document adapter usage in app/src/main/java/org/lsposed/manager/adapters/README.md for future maintainers

🌿Good first issues

  • Add CLI unit tests: The README highlights CLI as a new feature but file list shows no test/ directory. Create app/src/test/java/org/lsposed/manager/cli/ with JUnit tests for ConfigManager CLI entry points, particularly scope enable/disable operations.
  • Document API module examples: app/src/main/assets/webview/ contains documentation templates but no concrete API usage examples. Add markdown files showing how to call the API Module programmatically (auth, scope management, module status queries) with runnable code snippets.
  • Localization coverage audit: .github shows Crowdin integration but no completeness metrics. Review crowdin.com/project/lsposedmod status and file issues for any major languages <80% translated, or add missing string keys to app/src/main/res/values/strings.xml for new UI fields.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 9cd7a47 — --- (#105) (dependabot[bot])
  • 363449f — [skip ci] Close #104 #107 #106 (mywalkb)
  • 3de408e — --- (#103) (dependabot[bot])
  • 640cf8c — Bump the maven-dependencies group with 2 updates (#102) (dependabot[bot])
  • b182c2e — New translations strings.xml (Chinese Simplified) (#99) (mywalkb)
  • 98ec76d — Bump org.jetbrains.kotlinx:kotlinx-coroutines-core (#98) (dependabot[bot])
  • 88b2ea9 — New translations strings.xml (Turkish) (#95) (mywalkb)
  • 1fc97b5 — Bump info.picocli:picocli in the maven-dependencies group (#96) (dependabot[bot])
  • 2387fbf — Bump the maven-dependencies group with 2 updates (#93) (dependabot[bot])
  • 15f7887 — New translations strings.xml (Spanish) (mywalkb)

🔒Security observations

  • High · Potential WebView XSS Vulnerability — app/src/main/java/org/lsposed/manager/ui/widget/ScrollWebView.java, app/src/main/assets/webview/template.html, app/src/main/assets/webview/template_dark.html. The codebase contains WebView functionality (ScrollWebView.java) and HTML template assets (template.html, template_dark.html) used for displaying web content. If user-controlled or external data is rendered in these WebViews without proper sanitization, it could lead to Cross-Site Scripting (XSS) attacks. Fix: Implement proper input validation and sanitization before rendering any content in WebViews. Use Content Security Policy (CSP) headers in HTML templates. Consider using a strict sandboxing approach and disable JavaScript if not required.
  • High · Network Security Risk - Custom DNS and NoSNI Implementation — app/src/main/java/org/lsposed/manager/util/CloudflareDNS.java, app/src/main/java/org/lsposed/manager/util/NoSniFactory.java. The presence of CloudflareDNS.java and NoSniFactory.java suggests custom network implementations that bypass standard security mechanisms. NoSNI (Server Name Indication) bypassing can expose communications to MITM attacks, and custom DNS handling may circumvent DNS security protocols. Fix: Review and justify the necessity of bypassing SNI. Implement proper certificate pinning if custom network implementations are required. Use system-level DNS and TLS configurations instead of custom implementations. Consider using standard OkHttp or Retrofit configurations with proper security settings.
  • High · Missing Dependency Information - Unable to Assess Vulnerable Libraries — app/build.gradle.kts. The dependency file content is empty or not provided. This prevents analysis of third-party libraries for known vulnerabilities (CVEs). The build.gradle.kts file structure suggests Gradle-based dependencies but their versions and security status cannot be verified. Fix: Provide and regularly audit the build.gradle.kts file. Use dependency checking tools like OWASP Dependency-Check or Snyk to identify vulnerable dependencies. Keep all libraries up-to-date with security patches. Document all external dependencies with their versions.
  • Medium · Potential Data Leakage via LinkifyTextView — app/src/main/java/org/lsposed/manager/ui/widget/LinkifyTextView.java. The LinkifyTextView component automatically converts URLs and emails to clickable links. If sensitive information is displayed through this widget, it could inadvertently expose data through logs or UI automation. Fix: Review all uses of LinkifyTextView with potentially sensitive content. Consider implementing additional masking or sanitization for sensitive data types. Ensure links are validated before rendering.
  • Medium · Unclear Module Permissions and Hook Injection Points — app/src/main/java/org/lsposed/manager/adapters/AppHelper.java, app/src/main/java/org/lsposed/manager/util/ModuleUtil.java. This is a framework for injecting hooks into applications (based on the name and structure). The AppHelper, ScopeAdapter, and ModuleUtil suggest broad system-level access capabilities. Without visible permission controls and validation mechanisms, this could be exploited for privilege escalation. Fix: Implement strict permission validation for module installation and injection. Add integrity checks for modules before execution. Implement audit logging for all hook injection activities. Consider code signing for trusted modules.
  • Medium · Backup Utility Without Encryption Verification — app/src/main/java/org/lsposed/manager/util/BackupUtils.java. BackupUtils.java suggests implementation of backup functionality. If backups are created without encryption or with weak encryption, sensitive data could be exposed. Fix: Ensure all backups are encrypted using industry-standard algorithms (AES-256 minimum). Implement integrity verification (HMAC or digital signatures). Store backup encryption keys securely, separate from backups. Implement access controls for backup operations.
  • Medium · Potential SQL Injection Risk in Repository Model — undefined. The repo model classes (OnlineModule.java, Release.java, ReleaseAsset.java, Collaborator.java) suggest data persistence mechanisms. Without visible parameterized queries or ORM validation, there could be SQL injection risks if data is persisted Fix: undefined

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · mywalkb/LSPosed_mod — RepoPilot