
【免费下载链接】morphe-patches Human-made patches for Morphe项目地址https://gitcode.com/gh_mirrors/mor/morphe-patches点击查看免费下载morphe-patches 是一个为 MorpheAndroid 应用修改工具提供人工编写补丁的开源项目覆盖 60 款应用的 Premium 解锁、去广告、Pro 会员等功能。本文将从架构视角带你快速看懂它的Gradle 多模块组织方式与Kotlin 补丁开发 DSL的设计思路——即使你从没用过 smali 字节码也能建立清晰的认知地图。 项目顶层目录速览整个仓库的模块划分非常清晰每个目录各司其职目录 / 文件角色定位patches/核心模块Kotlin 编写的字节码/资源补丁主体patches/pairip/Pairip 付费墙数据文件JSON驱动代码生成patches/stub/Android API 存根stub供补丁编译期使用extensions/Java 编写的 Android 库扩展按应用分子目录buildSrc/构建期代码生成逻辑JTE 模板 Gradle 任务gradle/libs.versions.toml版本目录Version Catalog统一管理依赖版本patches-list.json自动生成的补丁清单发布产物禁止手改 核心结论先行patches是大脑Kotlin DSL 声明要改什么extensions是手脚Java 代码真正执行逻辑buildSrc是工厂把 JSON 数据变成可编译代码。️ Gradle 多模块组织约定插件 版本目录1. 根配置settings.gradle.kts项目的宪法在 settings.gradle.kts。它做了几件关键的事plugins { id(app.morphe.patches) version 1.3.4 // ① 约定插件集中定义各模块公共配置 } settings { extensions { defaultNamespace hoodles.morphe.extension // ② 默认 Java 包名 proguardFiles(rootProject.projectDir.resolve(extensions/proguard-rules.pro).toString()) } } include(:patches:stub) // ③ 显式包含的模块 几个设计要点约定插件Convention Pluginapp.morphe.patches把所有模块共用的 Gradle 配置AGP、Kotlin 版本、R8 规则等封装起来各子模块的build.gradle.kts因此极度精简——例如 extensions/fotmob/build.gradle.kts 只有不到 10 行动态模块发现除了显式include(:patches:stub)外patches与extensions下的子目录由插件自动识别注册新增一个应用的补丁 新增一个目录无需修改根配置注释里明确提醒 proguard 路径必须解析为绝对路径否则子目录扩展会找不到混淆规则——这是多模块组织中最容易踩的坑之一。2. 版本目录gradle/libs.versions.toml所有第三方依赖版本集中收敛在 gradle/libs.versions.toml例如[versions] morphe-patcher 1.14.1 morphe-patches-library 1.8.0-dev.1 jte 3.2.4 jelf 0.12.0各模块通过libs.xxx访问器引用见 patches/build.gradle.kts升级依赖只需改一处。buildSrc/settings.gradle.kts 还让buildSrc复用同一份版本目录保证构建脚本侧依赖与主工程侧版本一致。3. 构建加速gradle.propertiesgradle.properties 开启了构建缓存、并行构建与 2GB 堆内存org.gradle.caching true org.gradle.parallel true org.gradle.jvmargs -Xms512M -Xmx2048M这对动辄几十个扩展子模块的项目而言是必要的性能保障。 Kotlin 补丁开发 DSL声明式编写字节码补丁patches模块是全书精华。得益于morphe-patches-library提供的 DSL写补丁像填表单而不是手写 smali。以 Windy 应用的 Premium 解锁为例 patches/src/main/kotlin/hoodles/morphe/patches/windy/premium/EnablePremiumPatch.ktval enablePremiumPatch bytecodePatch( name Enable Premium, description Enables some app features locked behind the subscription paywall... ) { compatibleWith(Compat.WINDY) // ① 声明兼容哪个 App 的哪些版本 dependsOn(extensionPatch) // ② 声明依赖先注入扩展代码 execute { // ③ 真正做什么 IsPremiumForWidgetFingerprint.method.returnEarly(true) // 让判断方法直接返回 true ShouldInterceptRequestFingerprint.method.apply { addInstructions(instructions.size - 1, ...) // 注入 smali 指令 } } }DSL 的三个关键抽象DSL 构件作用通俗理解bytecodePatch { }构建一个字节码补丁对象一张施工单目标 施工内容Fingerprint通过特征字符串、方法名定位目标方法在迷宫里找到那扇门的指纹execute { }拿到目标后的修改动作具体的改动指令配套的指纹定义非常简洁见 patches/src/main/kotlin/hoodles/morphe/patches/windy/premium/Fingerprints.ktobject IsPremiumForWidgetFingerprint : Fingerprint( strings listOf(subscription, , premium), // 方法内引用的字符串特征 returnType Z // 返回 boolean )为什么用 Fingerprint 而不是硬编码方法签名因为混淆后的类名/方法名每次构建都会变而方法体里引用了哪些字符串、返回类型是什么这类特征相对稳定——这是此类补丁项目的通用生存法则。补丁间依赖dependsOn 表达组合关系注意上面的dependsOn(extensionPatch)bytecodePatch改 App 本身与extensionPatch把本仓库的 Java 类注入 App是两层独立补丁DSL 通过依赖图把它们串成流水线。类似地sharedExtensionPatch、activityOnCreateExtensionHook等工厂函数见 patches/all/misc/extension/沉淀了各应用反复使用的注入套路。⚙️ Pairip 代码生成buildSrc 里的补丁工厂对 Bend、Bunpo、Lightroom 等使用 Pairip 付费 SDK 的应用作者没有手写重复代码而是做了一套数据驱动的代码生成patches/pairip/xxx.json ──► buildSrc 的 GeneratePairipExtensionTask (每个 App 一份) │ ▼ extensions/__generated__/xxx/ (自动生成的 Java 扩展 stub 模块)数据模型buildSrc/src/main/kotlin/hoodles/morphe/codegen/pairip/JavaCodegenData.kt 用kotlinx-serialization反序列化 JSON生成任务GeneratePairipExtensionTask.kt 遍历patches/pairip/*.json用JTE 模板引擎渲染出PairipHook.java、stub 类、build.gradle.kts与AndroidManifest.xml输出到extensions/__generated__/每款 App 只需维护一份 JSON如 patches/pairip/bend.json即可得到一个完整的扩展模块——新增一款 Pairip 应用的边际成本趋近于零。这也是 README.md 表格里 严格版本锁定与 arm64-v8a 限制标记的来源生成代码绑定了特定版本的 Pairip 符号。 补丁清单与版本化发布补丁清单自动生成patches/build.gradle.kts 注册了generatePatchesList任务构建时把所有bytecodePatch的元数据名称、描述、兼容包名、目标版本、依赖导出为 patches-list.json。文件头部明确警告此文件由 semantic-release 自动更新手动编辑会破坏发布流程自动化发布package.json 引入semantic-release全家桶按提交规范自动打 tag、生成 CHANGELOG.md、回合并版本分支publish任务依赖generatePatchesList保证清单与代码同步版本号单一来源version 1.45.0定义在 gradle.properties与清单文件中的version字段一致。️ 一图看懂请求流转Gradle 构建patches模块编译 Kotlin DSL 补丁 → 生成patches-list.json同时buildSrc任务把pairip/*.json生成为扩展代码extensions/*作为 Android 库编译Morphe Manager 拉取本仓库作为远程源 → 依据清单展示可用补丁 → 在目标 APK 上执行字节码/资源/扩展注入。✅ 总结这套架构值得新手借鉴的 5 个点约定插件收敛配置子模块build.gradle.kts越薄越好公共规则放插件Version Catalog 统一管理版本gradle/libs.versions.toml一处升级全局生效目录即模块新增应用 新增目录动态注册零配置改动DSL 封装领域知识bytecodePatch Fingerprint让找方法 改指令变成声明式表单数据驱动 模板生成重复性最高的场景Pairip用 JSON JTE 生成代码人类只维护数据。想动手细读建议路线settings.gradle.kts → patches/build.gradle.kts → EnablePremiumPatch.kt → GeneratePairipExtensionTask.kt一条线走下来即可掌握全貌。赞分享【免费下载链接】morphe-patches Human-made patches for Morphe项目地址https://gitcode.com/gh_mirrors/mor/morphe-patches点击查看免费下载相关推荐Gradle Kotlin DSL 示例项目深度解析Gradle Kotlin DSL 示例项目深度解析 前言 Gradle Kotlin DSL 是 Gradle 构建工具的一种新型脚本编写方式它使用 KotSSHFS-Win项目组织架构理解子模块、补丁和构建系统SSHFS Win项目组织架构理解子模块、补丁和构建系统 SSHFS Win项目是Windows平台上实现SSH文件系统的开源解决方案让用户能够像访问本地磁存储网络Elastic APM 实战教程在 Kubernetes 中监控 Node.js 应用性能的完整指南 Elastic APM 实战教程在 Kubernetes 中监控 Node.js 应用性能的完整指南 Elastic APMApplication P创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考