# TinkerClaude **Repository Path**: developer_wind/TinkerClaude ## Basic Information - **Project Name**: TinkerClaude - **Description**: Tinker热修复 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-01 - **Last Updated**: 2026-06-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TinkerDemo — Tinker 热修复完整示例项目 基于 [Tinker](https://github.com/Tencent/tinker) **1.9.15.2**(最新版,2025-07)构建的完整 Android 热修复演示项目,使用 **Java** 语言开发。 ## 功能支持矩阵 | 修复类型 | 支持 | 说明 | |---------|------|------| | **Dex(代码)** | ✅ | 全量 dex 差量替换,jar 模式 | | **So 库** | ✅ | lib/armeabi-v7a、arm64-v8a 等 | | **resources.arsc** | ✅ | 资源表整体替换 | | **drawable / mipmap(图片)** | ✅ | VectorDrawable、PNG 均可 | | **layout(布局 XML)** | ✅ | 活动/Fragment 布局可替换 | | **values(strings/colors/dimens)** | ✅ | 值资源全类型可替换 | | **anim / xml** | ✅ | 动画、XML 配置可替换 | | **raw/** | ✅ | 原始资源文件可替换 | | **assets/** | ✅ | assets 目录文件可替换 | --- ## 项目结构 ``` TinkerDemo/ ├── app/ │ ├── build.gradle # Tinker 插件 + 依赖配置 │ ├── proguard-rules.pro # Tinker 专用混淆规则 │ └── src/main/ │ ├── AndroidManifest.xml # TinkerPatchService 注册 │ ├── assets/ │ │ └── demo_assets_text.txt # ★ 可热修复的 assets 演示 │ ├── res/ │ │ ├── anim/demo_patch_anim.xml # ★ 可热修复的动画 │ │ ├── drawable/ic_demo_patch.xml# ★ 可热修复的图标 │ │ ├── raw/demo_raw_text.txt # ★ 可热修复的 raw 资源 │ │ └── values/ │ │ ├── strings.xml # ★ demo_patchable_text │ │ ├── colors.xml # ★ demo_patchable_color │ │ └── dimens.xml # ★ demo_patchable_text_size │ └── java/com/example/tinkerdemo/ │ ├── app/ │ │ ├── SampleApplication.java # TinkerApplication 壳(不可修复) │ │ └── SampleApplicationLike.java # 真正的 Application 逻辑(可修复) │ ├── loader/ │ │ ├── TinkerManager.java # Tinker 初始化管理 │ │ ├── TinkerPatchService.java # 补丁合成 Service(:patch 进程) │ │ ├── PatchResultService.java # 合成结果处理 │ │ └── SamplePatchListener.java # 补丁请求拦截器 │ ├── reporter/ │ │ ├── SampleLoadReporter.java # 加载结果上报 │ │ └── SamplePatchReporter.java # 合成结果上报 │ ├── ui/ │ │ ├── MainActivity.java # 主界面 │ │ └── ResourceDemoActivity.java # 资源修复演示页 │ └── util/ │ └── PatchFileUtils.java # 补丁文件工具 ├── keystore/ # ⚠️ 需要先执行 gen_keystore.sh 生成 ├── patch/base/ # 基准包存放目录(构建后自动生成) ├── scripts/ │ ├── gen_keystore.sh # 生成演示 keystore │ └── patch_workflow.sh # 补丁构建完整流程脚本 └── build.gradle # 根项目配置 ``` --- ## 快速开始 ### 第一步:生成 Keystore ```bash chmod +x scripts/gen_keystore.sh ./scripts/gen_keystore.sh ``` ### 第二步:构建基准包(模拟线上已发布版本) ```bash ./gradlew clean assembleRelease ``` 构建完成后手动保存以下文件(或用脚本自动完成): ```bash mkdir -p patch/base cp app/build/outputs/apk/release/app-release.apk patch/base/ cp app/build/outputs/mapping/release/mapping.txt patch/base/ # R.txt(资源 ID 稳定性,AGP 8+ 路径) cp app/build/intermediates/stable_resource_ids_output/release/stableIds.txt patch/base/R.txt ``` ### 第三步:安装基准包到设备 ```bash adb install -r app/build/outputs/apk/release/app-release.apk ``` ### 第四步:修改代码 / 资源(模拟 Bug 修复) **代码修复示例(修改 Java 逻辑):** ```java // 修改任意业务逻辑代码,Tinker 会在 dex 层面做差量 ``` **资源修复示例:** ```xml 【补丁版本 v1.0.1】Bug 已修复! ``` ```xml #E91E63 ``` ### 第五步:构建补丁包 ```bash ./gradlew tinkerPatchRelease ``` 补丁文件输出目录: ``` app/build/outputs/tinkerPatch/release/ ├── patch_unsigned.apk # 未签名 ├── patch_signed.apk # 已签名(zip 压缩) └── patch_signed_7zip.apk # 已签名(7zip 压缩,推荐,体积最小) ``` ### 第六步:推送补丁并加载 ```bash # 推送到设备外部存储 adb push app/build/outputs/tinkerPatch/release/patch_signed_7zip.apk /sdcard/patch_signed_7zip.apk # 打开 App → 点击「从外部存储加载补丁」→ 重启 App ``` --- ## 核心代码说明 ### Application 壳 vs ApplicationLike ``` SampleApplication(TinkerApplication 子类) │ │ 壳类,不含业务逻辑,不可被热修复 │ 必须配置在 tinkerPatch.dex.loader 中 │ └──► SampleApplicationLike(DefaultApplicationLike 子类) │ │ 真正的 Application 代理,包含所有业务初始化 │ 可以被热修复 │ └──► onBaseContextAttached() → TinkerManager.installTinker() ``` ### 补丁加载流程 ``` 用户触发 → TinkerManager.loadPatch(path) → TinkerInstaller.onReceiveUpgradePatch() → SamplePatchListener.patchCheck() ← 前置校验 → 启动 TinkerPatchService(:patch 进程) → UpgradePatch 合成 dex/so/res → PatchResultService.onPatchResult() → 冷重启 App → attachBaseContext 时 Tinker 加载补丁 → SampleLoadReporter.onLoadResult() ``` ### 资源修复原理 Tinker 资源修复基于 **全量替换**: 1. 生成补丁时对比新旧 APK 的 `resources.arsc`,找出所有变更 2. 补丁包内包含差量后的完整资源(added / modified / largeModified) 3. App 重启后,Tinker 用 `AssetManager` 替换方案注入新的 resources.arsc 4. `applyResourceMapping` 保证资源 ID 不变,避免 ID 错乱 --- ## 注意事项 | 事项 | 说明 | |------|------| | AndroidManifest | **不支持**热修复(不能新增 Activity/Service/Provider) | | Application 壳 | 必须在 `loader` 列表中排除,否则补丁无效 | | 签名一致 | 基准包与补丁包必须使用**相同 keystore 签名** | | TINKER_ID | 每次发布新基准包必须修改,用于版本校验 | | shrinkResources | 必须设为 `false`,否则 Tinker 资源修复失败 | | Google Play | Google Play 开发者协议禁止动态下发可执行代码,海外应用请注意 | | Samsung Android 5.0 | 部分三星 Android 5.0(API 21)机型不支持 | --- ## 版本信息 - Tinker:**1.9.15.2**(2025-07-07 最新版) - compileSdk:34 - minSdk:21 - AGP:8.2.2 - Gradle:8.x