mywalkb/LSPosed_mod
My changes to LSPosed
Stale — last commit 2y ago
weakest axiscopyleft license (GPL-3.0) — review compatibility; last commit was 2y ago…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓9 active contributors
- ✓GPL-3.0 licensed
- ✓CI configured
Show all 7 evidence items →Show less
- ⚠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 Concerns → Mixed 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.
[](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:
- 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. - 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.
- 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 |
#!/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).
⚡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 hereapp/src/main/java/org/lsposed/manager/App.java— Application entry point and global state initialization; sets up dependency injection and crash handlingapp/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java— Main activity and navigation controller; hosts all fragment transitions and deep linking logicapp/build.gradle.kts— Build configuration, dependencies, and signing setup; required to understand module compilation and release processapp/src/main/java/org/lsposed/manager/util/ModuleUtil.java— Module parsing, installation, and lifecycle management; critical for understanding XPosed module integrationapp/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)
- 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) - Register navigation destination in MainActivity's NavController setup (
app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java) - 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
- Define new IPC method in ConfigManager wrapper interface (
app/src/main/java/org/lsposed/manager/ConfigManager.java) - Update ScopeAdapter to render new scope type in list (
app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java) - Create AppListFragment UI to allow user selection of new scope (
app/src/main/java/org/lsposed/manager/ui/fragment/AppListFragment.java) - 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
- Extend or modify RepoLoader to support additional repository URLs (
app/src/main/java/org/lsposed/manager/repo/RepoLoader.java) - Define new data model if repository JSON schema differs (
app/src/main/java/org/lsposed/manager/repo/model/OnlineModule.java) - Add repository URL configuration constant to Constants class (
app/src/main/java/org/lsposed/manager/Constants.java) - 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)
- Create utility class in app/src/main/java/org/lsposed/manager/util/ (
app/src/main/java/org/lsposed/manager/util/UpdateUtil.java) - Initialize in App.onCreate() for background setup (
app/src/main/java/org/lsposed/manager/App.java) - 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.
🔗Related repos
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
Top contributors
- @mywalkb — 67 commits
- @dependabot[bot] — 21 commits
- @5ec1cff — 3 commits
- @yujincheng08 — 3 commits
- @vvb2060 — 2 commits
📝Recent commits
Click to expand
Recent commits
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.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.