ai-scaffold-pro 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/i18n/en.json
CHANGED
|
@@ -410,6 +410,8 @@
|
|
|
410
410
|
"dim2_action_step3": "Classify by severity: ❌ Fatal (must fix immediately) / ⚠️ Important (should fix soon) / 💡 Suggestion (optional optimization)",
|
|
411
411
|
"dim2_action_step4": "Ask user whether to execute fixes; proceed with corrections after confirmation",
|
|
412
412
|
"dim3_title": "Dimension 3: Implementation Rationality Analysis",
|
|
413
|
+
"dim4_title": "Dimension 4: Performance & Security Check",
|
|
414
|
+
"dim4_desc": "Automatically invoke performance_check skill to detect memory leaks, OOM, ANR, UI lag, and security vulnerabilities. Executes immediately after Dimension 2 scan to ensure comprehensive code quality coverage.",
|
|
413
415
|
"dim3_desc": "Detect **clearly unreasonable** aspects in code implementation, even if they don't violate explicit rule entries:",
|
|
414
416
|
"dim3_table_header": "| # | Check Item | Check Method | Rationality Standard |",
|
|
415
417
|
"dim3_row1": "| 1 | Dead code/unused classes/methods | Search for public classes/methods not referenced by any code | Public classes/methods with no callers, no route targets, no reflection references |",
|
package/i18n/zh.json
CHANGED
|
@@ -410,6 +410,8 @@
|
|
|
410
410
|
"dim2_action_step3": "按严重程度分级:❌ 致命违规(必须立即修正) / ⚠️ 重要违规(应尽快修正) / 💡 改进建议(可选优化)",
|
|
411
411
|
"dim2_action_step4": "询问用户是否执行修正,确认后按修正方案逐项修改",
|
|
412
412
|
"dim3_title": "维度 3:实现合理性分析",
|
|
413
|
+
"dim4_title": "维度 4:性能与安全检查",
|
|
414
|
+
"dim4_desc": "自动调用 performance_check skill 执行内存泄漏、OOM、ANR、卡顿和安全漏洞检测。在维度2扫描后立即执行,确保代码质量全面覆盖。",
|
|
413
415
|
"dim3_desc": "检测代码实现中**明显不合理**的地方,即使这些地方不一定违反了明确的规则条文:",
|
|
414
416
|
"dim3_table_header": "| # | 检查项 | 检查方法 | 合理性判定标准 |",
|
|
415
417
|
"dim3_row1": "| 1 | 死代码/未使用的类/方法 | 搜索未被任何代码引用的 public 类/方法 | 项目中无人调用、无路由指向、无反射引用的公开类/方法即为潜在死代码 |",
|
package/package.json
CHANGED
|
@@ -112,7 +112,36 @@ tools: Read, Grep, Glob, Write, Edit
|
|
|
112
112
|
3. {{t "proactive_correction.dim3_action_step3"}}
|
|
113
113
|
4. {{t "proactive_correction.dim3_action_step4"}}
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
### {{t "proactive_correction.dim4_title"}}
|
|
116
|
+
|
|
117
|
+
{{t "proactive_correction.dim4_desc"}}
|
|
118
|
+
|
|
119
|
+
**自动调用**: 在维度2扫描后,自动调用 `{{DIR}}/skills/performance_check/SKILL.md` 执行性能与安全检查
|
|
120
|
+
|
|
121
|
+
**检查范围**:
|
|
122
|
+
| 检查类型 | 检查项 | 严重度 |
|
|
123
|
+
|---------|---------|--------|
|
|
124
|
+
| 内存泄漏 | Context/Listener/Bitmap/Handler泄漏 | ❌ 致命 |
|
|
125
|
+
| OOM风险 | Bitmap/集合/线程池无限增长 | ❌ 致命 |
|
|
126
|
+
| 启动速度 | Application/首屏加载耗时 | ️ 警告 |
|
|
127
|
+
| ANR风险 | 主线程网络/数据库/IO操作 | ❌ 致命 |
|
|
128
|
+
| 卡顿检测 | RecyclerView/动画/绘制卡顿 | ⚠️ 警告 |
|
|
129
|
+
| 代码安全 | 硬编码密钥/明文存储/HTTP传输 | ❌ 致命 |
|
|
130
|
+
|
|
131
|
+
**执行流程**:
|
|
132
|
+
1. 收集待检查文件列表(从git diff或proactive-correction传入)
|
|
133
|
+
2. 委派performance_check skill逐项扫描
|
|
134
|
+
3. 按严重度分类输出报告(致命 → 警告 → 建议)
|
|
135
|
+
4. 对致命问题提供修复方案
|
|
136
|
+
5. 用户确认后执行修复
|
|
137
|
+
6. 修复后重新扫描验证
|
|
138
|
+
|
|
139
|
+
**与code_review的区别**:
|
|
140
|
+
- `code_review` 关注代码规范和架构约束
|
|
141
|
+
- `performance_check` 关注性能指标和安全漏洞
|
|
142
|
+
- 两者互补,覆盖完整的代码质量检查
|
|
143
|
+
|
|
144
|
+
{{t "proactive_correction.impl_checklist_title"}}
|
|
116
145
|
|
|
117
146
|
{{t "proactive_correction.impl_checklist_header"}}
|
|
118
147
|
|---|---------|---------|------|----------|
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: performance_check
|
|
3
|
+
description: Performance and security audit for code quality. Checks memory leaks, OOM risks, startup speed, ANR, lag, and security vulnerabilities. Auto-triggered by proactive-correction agent.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Performance & Security Check — 性能与安全检查
|
|
7
|
+
|
|
8
|
+
> **触发方式**: 由 `proactive-correction` agent 在维度4中自动调用
|
|
9
|
+
>
|
|
10
|
+
> **检查范围**: 内存泄漏、OOM风险、启动速度、ANR、卡顿、代码安全
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. 内存泄漏检测 (Memory Leak Detection)
|
|
15
|
+
|
|
16
|
+
### 1.1 Android/Java/Kotlin 内存泄漏
|
|
17
|
+
|
|
18
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
19
|
+
|---|--------|---------|--------|
|
|
20
|
+
| ML-1 | Context泄漏 | 检查静态字段持有Activity/Context引用 | ❌ 致命 |
|
|
21
|
+
| ML-2 | 监听器未移除 | 检查onDestroy中是否移除Listener/Observer | ❌ 致命 |
|
|
22
|
+
| ML-3 | Handler泄漏 | 检查Handler是否为静态内部类或使用WeakReference | ❌ 致命 |
|
|
23
|
+
| ML-4 | 静态集合未清理 | 检查static List/Map是否无限增长 | ❌ 致命 |
|
|
24
|
+
| ML-5 | Bitmap未recycle | 检查Bitmap使用后是否调用recycle() | ️ 警告 |
|
|
25
|
+
| ML-6 | Cursor未关闭 | 检查数据库Cursor是否在finally中关闭 | ❌ 致命 |
|
|
26
|
+
| ML-7 | WebView泄漏 | 检查WebView是否在onDestroy中销毁 | ❌ 致命 |
|
|
27
|
+
| ML-8 | 单例持有Activity引用 | 检查单例模式是否持有Activity/View引用 | ❌ 致命 |
|
|
28
|
+
|
|
29
|
+
**检测模式**:
|
|
30
|
+
```kotlin
|
|
31
|
+
// 错误示例
|
|
32
|
+
class MyActivity : Activity() {
|
|
33
|
+
companion object {
|
|
34
|
+
var instance: MyActivity? = null // 静态持有Activity
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override fun onCreate() {
|
|
38
|
+
instance = this // 泄漏!
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ✅ 正确示例
|
|
43
|
+
class MyActivity : Activity() {
|
|
44
|
+
override fun onDestroy() {
|
|
45
|
+
super.onDestroy()
|
|
46
|
+
// 清理所有引用
|
|
47
|
+
listener?.remove()
|
|
48
|
+
handler?.removeCallbacksAndMessages(null)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 1.2 iOS/Swift 内存泄漏
|
|
54
|
+
|
|
55
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
56
|
+
|---|--------|---------|--------|
|
|
57
|
+
| ML-iOS1 | 强引用循环 | 检查delegate/closure是否使用weak | ❌ 致命 |
|
|
58
|
+
| ML-iOS2 | Block循环引用 | 检查Block中是否使用__weak self | 致命 |
|
|
59
|
+
| ML-iOS3 | NotificationCenter未移除 | 检查dealloc中是否removeObserver | ❌ 致命 |
|
|
60
|
+
| ML-iOS4 | Timer未invalidate | 检查Timer使用后是否invalidate | ❌ 致命 |
|
|
61
|
+
| ML-iOS5 | Delegate强引用 | 检查delegate属性是否为weak | ❌ 致命 |
|
|
62
|
+
|
|
63
|
+
### 1.3 C++/NDK 内存泄漏
|
|
64
|
+
|
|
65
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
66
|
+
|---|--------|---------|--------|
|
|
67
|
+
| ML-NDK1 | malloc/free不匹配 | 检查每个malloc是否有对应的free | ❌ 致命 |
|
|
68
|
+
| ML-NDK2 | new/delete不匹配 | 检查每个new是否有对应的delete | ❌ 致命 |
|
|
69
|
+
| ML-NDK3 | JNI LocalRef泄漏 | 检查LocalRef使用后是否DeleteLocalRef | ❌ 致命 |
|
|
70
|
+
| ML-NDK4 | 异常路径未释放 | 检查goto/error路径是否释放资源 | ❌ 致命 |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 2. OOM风险检测 (Out of Memory Risk)
|
|
75
|
+
|
|
76
|
+
### 2.1 Bitmap OOM
|
|
77
|
+
|
|
78
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
79
|
+
|---|--------|---------|--------|
|
|
80
|
+
| OOM-1 | 大图未压缩 | 检查Bitmap加载是否使用inSampleSize | 致命 |
|
|
81
|
+
| OOM-2 | 频繁创建Bitmap | 检查循环中是否创建Bitmap | ❌ 致命 |
|
|
82
|
+
| OOM-3 | 未使用图片缓存 | 检查是否使用Glide/Picasso/Fresco | ️ 警告 |
|
|
83
|
+
| OOM-4 | 内存泄漏的Bitmap | 检查Bitmap是否被静态引用 | ❌ 致命 |
|
|
84
|
+
|
|
85
|
+
**检测模式**:
|
|
86
|
+
```kotlin
|
|
87
|
+
// ❌ 错误示例 - 直接加载大图
|
|
88
|
+
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.huge_image)
|
|
89
|
+
|
|
90
|
+
// ✅ 正确示例 - 采样加载
|
|
91
|
+
val options = BitmapFactory.Options().apply {
|
|
92
|
+
inSampleSize = calculateInSampleSize(this, reqWidth, reqHeight)
|
|
93
|
+
}
|
|
94
|
+
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.huge_image, options)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 2.2 集合OOM
|
|
98
|
+
|
|
99
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
100
|
+
|---|--------|---------|--------|
|
|
101
|
+
| OOM-5 | List无限增长 | 检查List是否无限制add | ❌ 致命 |
|
|
102
|
+
| OOM-6 | 缓存无上限 | 检查LruCache是否设置maxSize | ❌ 致命 |
|
|
103
|
+
| OOM-7 | 字符串拼接 | 检查循环中是否使用+拼接字符串 | ⚠️ 警告 |
|
|
104
|
+
|
|
105
|
+
### 2.3 线程OOM
|
|
106
|
+
|
|
107
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
108
|
+
|---|--------|---------|--------|
|
|
109
|
+
| OOM-8 | 线程池无界 | 检查ThreadPoolExecutor是否设置maxPoolSize | ❌ 致命 |
|
|
110
|
+
| OOM-9 | 频繁创建线程 | 检查是否使用Thread而非线程池 | ️ 警告 |
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 3. 启动速度优化 (Startup Speed)
|
|
115
|
+
|
|
116
|
+
### 3.1 Application初始化
|
|
117
|
+
|
|
118
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
119
|
+
|---|--------|---------|--------|
|
|
120
|
+
| ST-1 | Application.onCreate耗时 | 检查onCreate中是否有耗时操作 | 致命 |
|
|
121
|
+
| ST-2 | 同步初始化过多 | 检查是否所有SDK都在主线程初始化 | ❌ 致命 |
|
|
122
|
+
| ST-3 | 未使用懒加载 | 检查是否可以延迟初始化的组件 | ️ 警告 |
|
|
123
|
+
| ST-4 | ContentProvider阻塞 | 检查自定义ContentProvider的onCreate | ❌ 致命 |
|
|
124
|
+
|
|
125
|
+
**优化建议**:
|
|
126
|
+
```kotlin
|
|
127
|
+
// 错误示例 - 所有初始化在Application
|
|
128
|
+
class MyApplication : Application() {
|
|
129
|
+
override fun onCreate() {
|
|
130
|
+
super.onCreate()
|
|
131
|
+
SDK1.init(this) // 耗时100ms
|
|
132
|
+
SDK2.init(this) // 耗时200ms
|
|
133
|
+
SDK3.init(this) // 耗时150ms
|
|
134
|
+
// 总耗时450ms,严重拖慢启动!
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ✅ 正确示例 - 延迟初始化
|
|
139
|
+
class MyApplication : Application() {
|
|
140
|
+
override fun onCreate() {
|
|
141
|
+
super.onCreate()
|
|
142
|
+
// 只初始化必需的SDK
|
|
143
|
+
EssentialSDK.init(this)
|
|
144
|
+
|
|
145
|
+
// 其他SDK延迟到首页展示后
|
|
146
|
+
lifecycle.addObserver(object : DefaultLifecycleObserver {
|
|
147
|
+
override fun onResume(owner: LifecycleOwner) {
|
|
148
|
+
// 延迟初始化非必需SDK
|
|
149
|
+
thread { OptionalSDK.init(this@MyApplication) }
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 3.2 首屏加载
|
|
157
|
+
|
|
158
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
159
|
+
|---|--------|---------|--------|
|
|
160
|
+
| ST-5 | 首屏同步网络请求 | 检查onCreate中是否有网络请求 | ❌ 致命 |
|
|
161
|
+
| ST-6 | 布局层级过深 | 检查XML布局嵌套层级(>5层) | ⚠️ 警告 |
|
|
162
|
+
| ST-7 | 首屏加载大图 | 检查首屏是否加载未压缩图片 | ❌ 致命 |
|
|
163
|
+
| ST-8 | 未使用异步加载 | 检查数据加载是否在主线程 | ❌ 致命 |
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 4. ANR检测 (Application Not Responding)
|
|
168
|
+
|
|
169
|
+
### 4.1 主线程耗时操作
|
|
170
|
+
|
|
171
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
172
|
+
|---|--------|---------|--------|
|
|
173
|
+
| ANR-1 | 主线程网络请求 | 检查是否在主线程执行HTTP请求 | ❌ 致命 |
|
|
174
|
+
| ANR-2 | 主线程数据库操作 | 检查是否在主线程执行SQL查询 | 致命 |
|
|
175
|
+
| ANR-3 | 主线程文件IO | 检查是否在主线程读写文件 | ❌ 致命 |
|
|
176
|
+
| ANR-4 | 主线程复杂计算 | 检查是否在主线程执行耗时计算 | ❌ 致命 |
|
|
177
|
+
| ANR-5 | 主线程sleep | 检查是否有Thread.sleep在主线程 | ❌ 致命 |
|
|
178
|
+
| ANR-6 | 锁竞争阻塞 | 检查synchronized块是否耗时>5s | ❌ 致命 |
|
|
179
|
+
|
|
180
|
+
**检测模式**:
|
|
181
|
+
```kotlin
|
|
182
|
+
// ❌ 错误示例 - 主线程网络请求
|
|
183
|
+
class MainActivity : AppCompatActivity() {
|
|
184
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
185
|
+
super.onCreate(savedInstanceState)
|
|
186
|
+
val response = httpClient.execute(request) // ANR风险!
|
|
187
|
+
updateUI(response)
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// ✅ 正确示例 - 异步网络请求
|
|
192
|
+
class MainActivity : AppCompatActivity() {
|
|
193
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
194
|
+
super.onCreate(savedInstanceState)
|
|
195
|
+
lifecycleScope.launch {
|
|
196
|
+
val response = withContext(Dispatchers.IO) {
|
|
197
|
+
httpClient.execute(request)
|
|
198
|
+
}
|
|
199
|
+
updateUI(response)
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 4.2 Broadcast/Service阻塞
|
|
206
|
+
|
|
207
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
208
|
+
|---|--------|---------|--------|
|
|
209
|
+
| ANR-7 | BroadcastReceiver耗时 | 检查onReceive中是否有耗时操作 | ❌ 致命 |
|
|
210
|
+
| ANR-8 | Service onStartCommand耗时 | 检查Service是否在主线程执行耗时任务 | ❌ 致命 |
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 5. 卡顿检测 (UI Lag/Jank)
|
|
215
|
+
|
|
216
|
+
### 5.1 RecyclerView卡顿
|
|
217
|
+
|
|
218
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
219
|
+
|---|--------|---------|--------|
|
|
220
|
+
| LAG-1 | onBindViewHolder耗时 | 检查是否在主线程执行复杂操作 | ❌ 致命 |
|
|
221
|
+
| LAG-2 | 未使用ViewHolder复用 | 检查onCreateViewHolder频率 | ❌ 致命 |
|
|
222
|
+
| LAG-3 | 嵌套RecyclerView | 检查是否有多层RecyclerView嵌套 | ⚠️ 警告 |
|
|
223
|
+
| LAG-4 | 图片未异步加载 | 检查是否在onBind中同步加载图片 | ❌ 致命 |
|
|
224
|
+
| LAG-5 | 频繁notifyDataSetChanged | 检查是否使用notifyItemInserted等精确更新 | ⚠️ 警告 |
|
|
225
|
+
|
|
226
|
+
### 5.2 动画卡顿
|
|
227
|
+
|
|
228
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
229
|
+
|---|--------|---------|--------|
|
|
230
|
+
| LAG-6 | 属性动画复杂 | 检查是否同时执行多个属性动画 | ️ 警告 |
|
|
231
|
+
| LAG-7 | 未使用硬件加速 | 检查View是否设置setLayerType | 💡 建议 |
|
|
232
|
+
| LAG-8 | 过度绘制 | 检查布局是否有过多背景叠加 | ⚠️ 警告 |
|
|
233
|
+
|
|
234
|
+
### 5.3 绘制卡顿
|
|
235
|
+
|
|
236
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
237
|
+
|---|--------|---------|--------|
|
|
238
|
+
| LAG-9 | onDraw耗时 | 检查自定义View的onDraw是否耗时>16ms | ❌ 致命 |
|
|
239
|
+
| LAG-10 | invalidate频繁 | 检查是否过度调用invalidate | ️ 警告 |
|
|
240
|
+
| LAG-11 | 布局测量耗时 | 检查onMeasure/onLayout是否复杂 | ❌ 致命 |
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 6. 代码安全检测 (Security)
|
|
245
|
+
|
|
246
|
+
### 6.1 敏感数据泄露
|
|
247
|
+
|
|
248
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
249
|
+
|---|--------|---------|--------|
|
|
250
|
+
| SEC-1 | 硬编码密钥 | 检查代码中是否有API Key/Secret | ❌ 致命 |
|
|
251
|
+
| SEC-2 | 明文存储密码 | 检查SharedPreferences是否明文存密码 | ❌ 致命 |
|
|
252
|
+
| SEC-3 | Log泄露敏感信息 | 检查Log中是否打印Token/密码 | ❌ 致命 |
|
|
253
|
+
| SEC-4 | WebView明文传参 | 检查WebView URL是否包含敏感参数 | ❌ 致命 |
|
|
254
|
+
| SEC-5 | Clipboard敏感数据 | 检查是否复制密码到剪贴板 | ❌ 致命 |
|
|
255
|
+
|
|
256
|
+
**检测模式**:
|
|
257
|
+
```kotlin
|
|
258
|
+
// 错误示例 - 硬编码密钥
|
|
259
|
+
object Config {
|
|
260
|
+
const val API_KEY = "sk-123456789abcdef" // 危险!
|
|
261
|
+
const val API_SECRET = "secret_key_here" // 危险!
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ✅ 正确示例 - 从安全位置读取
|
|
265
|
+
object Config {
|
|
266
|
+
val API_KEY: String
|
|
267
|
+
get() = BuildConfig.API_KEY // 从BuildConfig读取
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### 6.2 加密与传输安全
|
|
272
|
+
|
|
273
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
274
|
+
|---|--------|---------|--------|
|
|
275
|
+
| SEC-6 | HTTP明文传输 | 检查是否使用HTTPS | ❌ 致命 |
|
|
276
|
+
| SEC-7 | 弱加密算法 | 检查是否使用MD5/DES等弱加密 | 致命 |
|
|
277
|
+
| SEC-8 | 证书校验跳过 | 检查是否trustAllCertificates | ❌ 致命 |
|
|
278
|
+
| SEC-9 | 随机数不安全 | 检查是否使用Random而非SecureRandom | ⚠️ 警告 |
|
|
279
|
+
|
|
280
|
+
### 6.3 权限安全
|
|
281
|
+
|
|
282
|
+
| # | 检查项 | 检测方法 | 严重度 |
|
|
283
|
+
|---|--------|---------|--------|
|
|
284
|
+
| SEC-10 | 过度权限申请 | 检查是否申请不必要的危险权限 | ️ 警告 |
|
|
285
|
+
| SEC-11 | 运行时权限未检查 | 检查使用前是否检查权限 | ❌ 致命 |
|
|
286
|
+
| SEC-12 | Exported组件未保护 | 检查Activity/Service是否误设exported=true | ❌ 致命 |
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## 7. 检查执行流程
|
|
291
|
+
|
|
292
|
+
### 7.1 触发条件
|
|
293
|
+
|
|
294
|
+
由 `proactive-correction` agent 在以下场景自动调用:
|
|
295
|
+
|
|
296
|
+
1. **代码修改完成后** - 扫描修改的文件是否存在性能问题
|
|
297
|
+
2. **plan_mode每步完成后** - 纠错检查点扫描
|
|
298
|
+
3. **用户明确要求** - "检查性能问题" / "性能审查"
|
|
299
|
+
4. **定期全量扫描** - proactive-correction维度4扫描
|
|
300
|
+
|
|
301
|
+
### 7.2 检查流程
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
1. 收集待检查文件列表
|
|
305
|
+
├─ 从 git diff 获取变更文件
|
|
306
|
+
├─ 或从 proactive-correction 传入文件列表
|
|
307
|
+
|
|
308
|
+
2. 按优先级逐项检查
|
|
309
|
+
├─ 第一优先级: ❌ 致命问题 (内存泄漏、ANR、OOM)
|
|
310
|
+
├─ 第二优先级: ⚠️ 警告问题 (启动速度、卡顿)
|
|
311
|
+
└─ 第三优先级: 💡 建议优化 (代码安全、最佳实践)
|
|
312
|
+
|
|
313
|
+
3. 输出检查报告
|
|
314
|
+
├─ 按严重度分类
|
|
315
|
+
├─ 每个问题包含: 位置、原因、修复方案
|
|
316
|
+
└─ 统计问题数量
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### 7.3 输出格式
|
|
320
|
+
|
|
321
|
+
```markdown
|
|
322
|
+
## 🔍 Performance & Security Check
|
|
323
|
+
|
|
324
|
+
**检查范围**: [文件列表]
|
|
325
|
+
**检查结果**: ✅ 通过 / ⚠️ N 警告 / N 致命问题
|
|
326
|
+
|
|
327
|
+
### ❌ 致命问题
|
|
328
|
+
|
|
329
|
+
**问题 1**: [问题标题]
|
|
330
|
+
- **位置**: `file:line`
|
|
331
|
+
- **类型**: [内存泄漏/ANR/OOM/安全]
|
|
332
|
+
- **原因**: [问题原因说明]
|
|
333
|
+
- **当前代码**:
|
|
334
|
+
```kotlin
|
|
335
|
+
// 问题代码
|
|
336
|
+
```
|
|
337
|
+
- **修复方案**:
|
|
338
|
+
```kotlin
|
|
339
|
+
// 修复后代码
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### ⚠️ 警告
|
|
343
|
+
|
|
344
|
+
### 💡 建议优化
|
|
345
|
+
|
|
346
|
+
### ✅ 通过检查项
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## 8. 平台特定检查
|
|
352
|
+
|
|
353
|
+
### 8.1 Android 平台
|
|
354
|
+
|
|
355
|
+
- **StrictMode检测**: 使用StrictMode检测主线程IO和网络
|
|
356
|
+
- **LeakCanary集成**: 建议集成LeakCanary自动检测内存泄漏
|
|
357
|
+
- **Method Profiling**: 使用Android Profiler分析耗时方法
|
|
358
|
+
- **Layout Inspector**: 检查布局层级和过度绘制
|
|
359
|
+
|
|
360
|
+
### 8.2 iOS 平台
|
|
361
|
+
|
|
362
|
+
- **Instruments检测**: 使用Leaks/Allocations工具检测内存
|
|
363
|
+
- **Time Profiler**: 分析耗时方法调用
|
|
364
|
+
- **Main Thread Checker**: 检测主线程违规操作
|
|
365
|
+
|
|
366
|
+
### 8.3 Flutter 平台
|
|
367
|
+
|
|
368
|
+
- **DevTools检测**: 使用Flutter DevTools分析性能
|
|
369
|
+
- **Widget重建**: 检查不必要的Widget重建
|
|
370
|
+
- **Isolate使用**: 检查耗时操作是否使用Isolate
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## 9. 修复验证
|
|
375
|
+
|
|
376
|
+
### 9.1 修复后验证
|
|
377
|
+
|
|
378
|
+
修复性能问题后,必须:
|
|
379
|
+
|
|
380
|
+
1. **重新扫描**: 运行performance_check验证问题已解决
|
|
381
|
+
2. **性能测试**: 使用工具验证性能指标改善
|
|
382
|
+
3. **回归检查**: 确认修复未引入新问题
|
|
383
|
+
|
|
384
|
+
### 9.2 性能指标要求
|
|
385
|
+
|
|
386
|
+
| 指标 | 要求 | 检测方法 |
|
|
387
|
+
|------|------|---------|
|
|
388
|
+
| 冷启动时间 | < 2秒 | adb shell am start -W |
|
|
389
|
+
| 首屏渲染 | < 1秒 | 手动计时或工具 |
|
|
390
|
+
| 内存占用 | < 应用限制 | Android Studio Profiler |
|
|
391
|
+
| 帧率 | ≥ 55 FPS | GPU渲染模式分析 |
|
|
392
|
+
| ANR率 | < 0.1% | Firebase/友盟统计 |
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
**版本**: v1.0.0
|
|
397
|
+
**最后更新**: 2026-05-31
|
|
398
|
+
**维护者**: ai_scaffold 团队
|
|
@@ -472,6 +472,20 @@ const platformVars = await getPlatformVars(detection.platform, lang);
|
|
|
472
472
|
{{PLATFORM_SUGGESTION_CHECKS}}
|
|
473
473
|
```
|
|
474
474
|
|
|
475
|
+
#### performance_check/SKILL.md
|
|
476
|
+
**直接复制模板文件**,无需修改:
|
|
477
|
+
```bash
|
|
478
|
+
cp {{DIR}}/skills/performance_check/SKILL.md.template {{DIR}}/skills/performance_check/SKILL.md
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
该skill包含完整的性能与安全检查能力:
|
|
482
|
+
- 内存泄漏检测(Android/iOS/C++)
|
|
483
|
+
- OOM风险检测(Bitmap/集合/线程池)
|
|
484
|
+
- 启动速度优化(Application/首屏加载)
|
|
485
|
+
- ANR检测(主线程耗时操作)
|
|
486
|
+
- 卡顿检测(RecyclerView/动画/绘制)
|
|
487
|
+
- 代码安全(敏感数据/加密/权限)
|
|
488
|
+
|
|
475
489
|
### 3.4 生成 references/ 文档
|
|
476
490
|
|
|
477
491
|
**Step 1**: 脚本已生成 `_scan.json`(在Phase 1.1完成)
|
|
@@ -675,6 +689,7 @@ graph TD
|
|
|
675
689
|
技能文件:
|
|
676
690
|
- [ ] {{DIR}}/skills/plan_mode/SKILL.md 已生成
|
|
677
691
|
- [ ] {{DIR}}/skills/code_review/SKILL.md 已生成
|
|
692
|
+
- [ ] {{DIR}}/skills/performance_check/SKILL.md 已生成(性能与安全检查)
|
|
678
693
|
- [ ] plan_mode 中包含平台特定的任务模板
|
|
679
694
|
|
|
680
695
|
Agent文件:
|
|
@@ -720,7 +735,7 @@ Agent文件:
|
|
|
720
735
|
|
|
721
736
|
📊 生成统计:
|
|
722
737
|
- 规则文件: 2 个 (project_rule.md, conflict_resolution.md)
|
|
723
|
-
- 技能文件:
|
|
738
|
+
- 技能文件: 3 个 (plan_mode, code_review, performance_check)
|
|
724
739
|
- Agent文件: {3或4} 个 (arch-review, resource-sync, proactive-correction{{#if HAS_NDK}}, cpp-memory-review{{/if}})
|
|
725
740
|
- 引用文档: {N+2} 个 ({N}个模块 + dependencies.md + conventions.md)
|
|
726
741
|
- Hook脚本: 2 个
|