# 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