├── README.md ├── pine_api.jar └── source_code.zip /README.md: -------------------------------------------------------------------------------- 1 | # Pinepatch:基于 Pine 的免 Root Hook 框架 2 | 3 | ## 使用方法 4 | 5 | 1. 使用 Pinepatch 打开 APK 文件,例如: 6 | - 在 MT 管理器中点击 APK 文件 7 | - 长按 **查看** 按钮 8 | - 点击 **Pinepatch** 9 | - 即可开始修补 APK 10 | 11 | 2. 修补后的 APK **没有签名**,需要使用 MT 管理器、NP 管理器或其他工具进行签名。 12 | 13 | 3. 签名后即可安装,安装后可以通过模块修改软件的行为。 14 | 15 | 4. **安装模块** 的方法同样是使用 Pinepatch 打开文件。 16 | 17 | ## 模块仓库 18 | 19 | [模块仓库](http://dotcog.ct.ws/pipatch_modules.html) 20 | 21 | ## 模块开发文档 22 | 23 | ### 1. 创建 `manifest.json` 24 | 25 | ```json 26 | { 27 | "package": "$模块包名$", 28 | "version": "$模块版本$", 29 | "label": "$模块名称$", 30 | "description": "$模块介绍$" 31 | } 32 | ``` 33 | 34 | ### 2. 创建 Android 项目并导入 `pine_api.jar` 35 | 36 | 新建文件 `MainHook.java`,放在 Java 工程的根目录下: 37 | 38 | ```java 39 | public class MainHook { 40 | public static void hook(ClassLoader classLoader, ApplicationInfo appInfo, Context context) throws Throwable { 41 | // 这里填写 Hook 代码 42 | } 43 | } 44 | ``` 45 | 46 | ### 3. 示例:让每个 `Activity` 启动时弹出 Toast 47 | 48 | ```java 49 | import top.canyie.pine.*; 50 | import top.canyie.pine.callback.*; 51 | import android.app.*; 52 | import android.widget.*; 53 | 54 | public class MainHook { 55 | public static void hook(ClassLoader classLoader, ApplicationInfo appInfo, Context context) throws Throwable { 56 | Pine.hook(Pine.findMethod(Activity.class, "onCreate", Bundle.class), 57 | new MethodHook() { 58 | @Override 59 | public void afterCall(Pine.CallFrame frame) { 60 | Toast.makeText((Activity) frame.thisObject, "My Toast", Toast.LENGTH_SHORT).show(); 61 | } 62 | } 63 | ); 64 | } 65 | } 66 | ``` 67 | 68 | ### 4. 编译模块 69 | 70 | - 编译后,将生成的 DEX 文件重命名为 `dex`,只要文件末尾是 `dex` 都会识别为dex文件。 71 | - 如果有多个 DEX 文件,需**合并**,并删除 DEX 中多余的类(如 `pine_api` 的类),否则 `pine_api` 会导致模块不生效。 72 | - 最后,将 `dex` 和 `manifest.json` **压缩** 在一起,得到模块安装包。 73 | 74 | ## Pinepatch API 说明 75 | 76 | Pinepatch 提供的 API 与原版 Pine **略有不同**,请自行查看源码。 77 | 78 | 此外,Pinepatch 模块还提供了专门访问 `ContentResolver.query` 的 API: 79 | 80 | ```java 81 | Pine.queryContent(context, "com.exampleapp/example_query"); 82 | ``` 83 | 84 | > **注意**:此处**无需**加前缀 `content://`。 85 | 86 | ## Pinepatch 管理模块功能 87 | 88 | 在 Pinepatch 管理器中,点击模块会自动跳转到**包名与模块包名相同的应用**的 `PiActivity` 界面。 89 | 90 | 例如: 91 | - 一个模块的包名是 `nea.dpi`。 92 | - 在管理器中点击该模块时,会自动跳转到 **包名 `nea.dpi`** 的应用的 **`nea.dpi.PiActivity`** 界面。 93 | 94 | ## 使用Xposed模块 95 | 96 | - 在模块仓库中下载[Pine Xposed.apk](http://jkx.dotcog.nhely.hu/d/pinexposed.apk)和[Pine Xposed.zip](http://jkx.dotcog.nhely.hu/d/pinexposed.zip) 97 | - 将ZIP安装至Pinepatch,APK安装至系统,要使用Xposed模块的应用需要选中Pine Xposed,在管理模块中点击Pine Xposed即可进入Xposed模块作用域 98 | 99 | ## 模块开发实例 100 | 101 | [GitHub 示例项目](https://github.com/dotcog/dpi_setting) 102 | -------------------------------------------------------------------------------- /pine_api.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenpython/Pinepatch/cb1e84eb6d8dc6dc90dc645e5f6014bb394f969b/pine_api.jar -------------------------------------------------------------------------------- /source_code.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenpython/Pinepatch/cb1e84eb6d8dc6dc90dc645e5f6014bb394f969b/source_code.zip --------------------------------------------------------------------------------