Modern Xposed Framework
This report summarizes scanner evidence for JingMatrix/Vector, a Kotlin project with 12,994 GitHub stars. SynthScan examined 78,269 lines of code across 545 source files, recording 79 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 1.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 71 finding(s).
Are imports declared and package/API names verified? 6 finding(s).
Are wrappers, guards, and repeated structures necessary? 2 finding(s).
Which changes need focused human review? 79 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 79 distinct pattern matches across 5 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crowdin.yml | 1 | project_id_env: CROWDIN_PROJECT_ID | COMMENT |
| LOW | zygisk/src/main/cpp/module.cpp | 1 | #include <common/config.h> | COMMENT |
| LOW | zygisk/src/main/cpp/include/zygisk.hpp | 101 | struct Api; | COMMENT |
| LOW | zygisk/src/main/cpp/include/zygisk.hpp | 181 | // These values are used in Api::setOption(Option) | COMMENT |
| LOW | zygisk/src/main/cpp/include/zygisk.hpp | 201 | PROCESS_GRANTED_ROOT = (1u << 0), | COMMENT |
| LOW | zygisk/src/main/cpp/include/zygisk.hpp | 221 | // process, you will be connected to a 32-bit companion process, and vice versa for 64-bit. | COMMENT |
| LOW | zygisk/src/main/cpp/include/zygisk.hpp | 241 | COMMENT | |
| LOW | zygisk/src/main/cpp/include/zygisk.hpp | 261 | int numMethods); | COMMENT |
| LOW | native/CMakeLists.txt | 21 | COMMENT | |
| LOW | native/include/framework/android_types.h | 201 | TYPE_STRING = 0x03, | COMMENT |
| LOW | native/src/jni/hook_bridge.cpp | 1 | #include <alloca.h> | COMMENT |
| LOW | native/src/jni/resources_hook.cpp | 1 | #include <dex_builder.h> | COMMENT |
| LOW | native/src/jni/resources_hook.cpp | 261 | // so that the last slot the scan reads is still inside the ResXMLTree allocation on the newest | COMMENT |
| LOW | native/src/elf/elf_image.cpp | 1 | #include "elf/elf_image.h" | COMMENT |
| LOW | native/src/elf/elf_image.cpp | 461 | best_exact = true; | COMMENT |
| LOW | native/src/elf/elf_image.cpp | 481 | // * a private read-only mapping with no code behind it. | COMMENT |
| LOW | …gacy/src/main/java/android/content/res/XResources.java | 61 | public class XResources extends XResourcesSuperClass { | COMMENT |
| LOW | dex2oat/src/main/cpp/oat_hook.cpp | 1 | #include <dlfcn.h> | COMMENT |
| LOW | dex2oat/src/main/cpp/dex2oat.cpp | 1 | #include <linux/memfd.h> | COMMENT |
| LOW | dex2oat/src/main/cpp/include/base_macros.h | 41 | // void operator=(const TypeName&) = delete; | COMMENT |
| LOW | dex2oat/src/main/cpp/include/base_macros.h | 61 | // used in defining new arrays, for example. If you use arraysize on | COMMENT |
| LOW | dex2oat/src/main/cpp/include/base_macros.h | 81 | // vendor code defines LIKELY and UNLIKELY this way, and includes | COMMENT |
| LOW | dex2oat/src/main/cpp/include/base_macros.h | 101 | // between switch labels: | COMMENT |
| LOW | dex2oat/src/main/cpp/include/base_macros.h | 121 | // When compiled with clang, the FALLTHROUGH_INTENDED macro is expanded to | COMMENT |
| LOW | dex2oat/src/main/cpp/include/base_macros.h | 141 | #elif defined(__i386__) | COMMENT |
| LOW | dex2oat/src/main/cpp/include/logging.h | 1 | #pragma once | COMMENT |
| LOW | dex2oat/src/main/cpp/include/logging.h | 21 | ": " fmt, \ | COMMENT |
| LOW | dex2oat/src/main/cpp/include/macros.h | 21 | #include <unistd.h> // for TEMP_FAILURE_RETRY | COMMENT |
| LOW | dex2oat/src/main/cpp/include/macros.h | 41 | ALWAYS_INLINE void* operator new(size_t, void* ptr) noexcept { return ptr; } \ | COMMENT |
| LOW | dex2oat/src/main/cpp/include/macros.h | 61 | COMMENT | |
| LOW | dex2oat/src/main/cpp/include/macros.h | 81 | #define NO_STACK_PROTECTOR __attribute__((no_stack_protector)) | COMMENT |
| LOW | dex2oat/src/main/cpp/include/macros.h | 101 | // without the UNREACHABLE a return statement would be necessary. | COMMENT |
| LOW | dex2oat/src/main/cpp/include/macros.h | 121 | #else | COMMENT |
| LOW | …in/kotlin/org/matrix/vector/manager/ui/MainActivity.kt | 41 | COMMENT | |
| LOW | …in/kotlin/org/matrix/vector/manager/ui/MainActivity.kt | 61 | // arrives *with* a bundle and cannot tell itself apart from a rotation by looking at one: | COMMENT |
| LOW | …/main/kotlin/org/matrix/vector/manager/ui/VectorApp.kt | 81 | // Where the launch intent asked to open. The activity has no back stack to act on, so it leaves | COMMENT |
| LOW | …matrix/vector/manager/ui/screens/home/HomeViewModel.kt | 181 | COMMENT | |
| LOW | …matrix/vector/manager/ui/screens/home/HomeViewModel.kt | 341 | // already in hand when `refreshPresence` ran above — a second read of two | COMMENT |
| LOW | …/vector/manager/ui/screens/modules/ModulesViewModel.kt | 441 | COMMENT | |
| LOW | …ix/vector/manager/ui/screens/modules/ScopeViewModel.kt | 321 | // | COMMENT |
| LOW | …ix/vector/manager/ui/screens/modules/ScopeViewModel.kt | 361 | // | COMMENT |
| LOW | …ix/vector/manager/ui/screens/modules/ScopeViewModel.kt | 461 | // them offers choices the framework will not honour — and the same package appears | COMMENT |
| LOW | …ix/vector/manager/ui/screens/modules/ScopeViewModel.kt | 481 | allApps.value = withFramework | COMMENT |
| LOW | …ix/vector/manager/ui/screens/modules/ScopeViewModel.kt | 901 | val framework = ScopeTarget(SYSTEM_FRAMEWORK_PACKAGE, 0) | COMMENT |
| LOW | …x/vector/manager/data/repository/FrameworkInstaller.kt | 121 | // Built here rather than on the download's own thread so that [cancelDownload] has | COMMENT |
| LOW | …/matrix/vector/manager/data/github/GitHubRepository.kt | 561 | isBot = primary.isBot, | COMMENT |
| LOW | …/main/kotlin/org/matrix/vector/daemon/VectorService.kt | 301 | // stayed blocked after it was uninstalled. Nothing else ever removes it: the CLI does not | COMMENT |
| LOW | …/main/kotlin/org/matrix/vector/daemon/VectorService.kt | 441 | // — and a swipe or the one-hour timeout fires the delete intent whether or not a button was | COMMENT |
| LOW | …/main/kotlin/org/matrix/vector/daemon/VectorService.kt | 461 | // claim and the cancel, the prompt stayed on screen with live buttons that did nothing for the | COMMENT |
| LOW | …/main/kotlin/org/matrix/vector/daemon/VectorService.kt | 481 | NotificationManager.withdrawScopeRequests(packageName).forEach { pending -> | COMMENT |
| LOW | …/main/kotlin/org/matrix/vector/daemon/VectorService.kt | 501 | // Package by package rather than all-or-nothing: the prompt may have been up for an | COMMENT |
| LOW | …org/matrix/vector/daemon/system/NotificationManager.kt | 541 | // alone so the second overwrote the first, and the survivor pointed into a profile that is | COMMENT |
| LOW | …org/matrix/vector/daemon/system/NotificationManager.kt | 581 | .apply { extras.putString("android.substName", BuildConfig.FRAMEWORK_NAME) } | COMMENT |
| LOW | …otlin/org/matrix/vector/daemon/ipc/ModuleAppService.kt | 341 | // background is a uid that keeps being reported active, which is what wakes the delivery again. | COMMENT |
| LOW | …kotlin/org/matrix/vector/daemon/data/ModuleDatabase.kt | 241 | // activated, and nothing else was ever going to take that notice down: it is only marked | COMMENT |
| LOW | …kotlin/org/matrix/vector/daemon/data/ModuleDatabase.kt | 301 | // user does not hold the module, which is what keeps a module installed for one user out of | COMMENT |
| LOW | …in/kotlin/org/matrix/vector/daemon/data/ConfigCache.kt | 181 | val users = userManager?.getRealUsers() ?: emptyList() | COMMENT |
| LOW | …in/kotlin/org/matrix/vector/daemon/data/ConfigCache.kt | 201 | // | COMMENT |
| LOW | …in/kotlin/org/matrix/vector/daemon/data/ConfigCache.kt | 421 | // Against the *current* state, not against the copy taken at the top of this function. A | COMMENT |
| LOW | daemon/src/main/jni/obfuscation.cpp | 1 | #include "obfuscation.h" | COMMENT |
| 6 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …src/main/java/de/robv/android/xposed/XposedBridge.java | 145 | String logStr = org.matrix.vector.util.Log.getStackTraceString(t); | CODE |
| CRITICAL | …matrix/vector/manager/ui/screens/home/HomeViewModel.kt | 487 | else org.matrix.vector.manager.BuildConfig.VERSION_CODE.toLong() | CODE |
| CRITICAL | …matrix/vector/manager/ui/screens/home/HomeViewModel.kt | 488 | org.matrix.vector.manager.data.github.FeedLayout.build( | CODE |
| CRITICAL | …rg/matrix/vector/manager/ui/screens/home/HomeScreen.kt | 498 | private fun androidx.compose.foundation.lazy.LazyListScope.communitySection( | CODE |
| CRITICAL | …/org/matrix/vector/manager/ui/screens/web/WebScreen.kt | 283 | private fun androidx.compose.ui.graphics.Color.luminanceIsDark(): Boolean = | CODE |
| CRITICAL | …rix/vector/manager/ui/screens/modules/ModulesScreen.kt | 902 | private fun androidx.compose.foundation.lazy.LazyListScope.moduleRows( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …/main/kotlin/org/matrix/vector/manager/ui/VectorApp.kt | 112 | // Driving the scaffold's own state rather than dropping the items: hiding the items alone | COMMENT |
| MEDIUM | …/main/kotlin/org/matrix/vector/manager/ui/VectorApp.kt | 118 | // Computed rather than left to the scaffold's default, for two reasons: the floating style | COMMENT |
| MEDIUM | …/main/kotlin/org/matrix/vector/manager/ui/VectorApp.kt | 184 | // After the scaffold on purpose. Back callbacks are dispatched last-registered-first and | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | zygisk/module/customize.sh | 3 | # ========================================================= | COMMENT |
| MEDIUM | zygisk/module/customize.sh | 54 | # ========================================================= | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | zygisk/src/main/cpp/ipc_bridge.cpp | 144 | // Caching these at startup is more efficient and robust than looking them up on every IPC call. | COMMENT |
| MEDIUM | zygisk/src/main/cpp/include/ipc_bridge.h | 10 | // We include the JNI bridge from 'native' to leverage its helper functions. | COMMENT |