Legacy Rapid Expansion
SKILL.md
Legacy Rapid Expansion (旧项目快速扩充)
Instructions
- 仅在旧项目加入新功能时使用
- 先填写 Required Inputs(隔离边界、桥接契约、回退方案)
- 依照下方章节顺序套用
- 一次只创建一个隔离区与桥接点
- 完成后对照 Quick Checklist
When to Use
- Scenario B:旧项目加新功能
Example Prompts
- "请依照 Islanding Architecture 创建 modern/ 与 bridge/"
- "用 Hybrid Theming 章节让新 Compose UI 沿用旧 Theme"
- "请用 Feature Toggle 章节设计新功能开关"
Workflow
- 先确认 Required Inputs(隔离范围、bridge API、toggle 策略)
- 创建 Islanding Architecture 与 Bridge Pattern
- 处理 Hybrid Theming 与 Wrapper Activities
- 配置 Feature Toggle 与回滚流程
- 执行 Legacy Gate 并用 Quick Checklist 验收
Practical Notes (2026)
- 新功能必须独立于 legacy 内部实作
- Bridge API 需稳定,避免频繁变更造成扩散
- Feature Toggle 作为上线与回退的唯一入口
- 新旧系统边界必须有 owner,避免“共享无人区”
- 迁移期间每个 bridge 调用都应有埋点便于回滚判断
Minimal Template
目标:
隔离范围:
旧系统依赖:
回滚触发条件:
Bridge 契约:
Toggle 策略:
验收: Quick Checklist
Required Inputs (执行前输入)
隔离范围(新功能边界与 legacy 触点)Bridge 契约(输入/输出/错误码)Feature Toggle 策略(开关位置、默认值、回滚)回滚触发条件(指标阈值与负责人)埋点字段(新旧路径识别)
Deliverables (完成后交付物)
modern/与bridge/目录落地Bridge API文档与使用样例Hybrid theme兼容策略Toggle配置与灰度/回滚脚本Legacy Gate验收记录
Legacy Gate (验收门槛)
./gradlew test
./gradlew connectedDebugAndroidTest
需要在 PR 说明中附新旧路径对照与回滚步骤。
Islanding Architecture (孤岛策略)
在旧架构中切出一块「净土」,新功能完全使用现代架构开发。
目录结构
app/
├── legacy/ # 旧代码 (不动)
│ ├── activities/
│ └── fragments/
├── modern/ # 新代码 (净土)
│ ├── core/
│ │ ├── data/
│ │ ├── domain/
│ │ └── ui/
│ └── feature/
│ └── newfeature/
└── bridge/ # 桥接层
├── LegacyNavigator.kt
└── ModernEntryPoint.kt
Bridge Pattern
// bridge/ModernEntryPoint.kt
object ModernEntryPoint {
fun startNewFeatureActivity(context: Context, params: Bundle) {
val intent = Intent(context, NewFeatureActivity::class.java).apply {
putExtras(params)
}
context.startActivity(intent)
}
fun startCheckoutCompose(context: Context, orderId: String) {
startNewFeatureActivity(
context = context,
params = bundleOf("order_id" to orderId, "entry" to "checkout")
)
}
@Composable
fun NewFeatureScreen(params: Map<String, Any>) {
// 现代 Compose UI
}
}
// 旧代码调用
class LegacyActivity : AppCompatActivity() {
fun onButtonClick() {
ModernEntryPoint.startNewFeatureActivity(this, bundleOf("id" to productId))
}
}
Hybrid Theming
让 Compose UI 沿用旧有的 XML Theme。
MDC-Android Compose Theme Adapter
// build.gradle.kts
dependencies {
implementation("com.google.android.material:compose-theme-adapter:<project-verified-version>")
}
// 使用
@Composable
fun NewFeatureScreen() {
MdcTheme { // 自动桥接 XML Theme
Surface {
// Compose UI 会使用 XML 定义的 colors/typography
}
}
}
渐进式迁移
// 1. 初期:完全沿用 XML Theme
MdcTheme { content() }
// 2. 中期:覆写部分 Token
MdcTheme(
setTextColors = true,
setDefaultFontFamily = true
) { content() }
// 3. 后期:完全使用 Compose Theme
AppTheme { content() }
Wrapper Activities
快速将 Compose Screen 包装供旧有 startActivity 调用。
通用 Wrapper
@AndroidEntryPoint
class ComposeWrapperActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val screenType = intent.getStringExtra(EXTRA_SCREEN_TYPE)
val params = intent.extras ?: Bundle.EMPTY
setContent {
AppTheme {
when (screenType) {
"new_feature" -> NewFeatureScreen(params.toMap())
"settings" -> SettingsScreen()
else -> ErrorScreen()
}
}
}
}
companion object {
private const val EXTRA_SCREEN_TYPE = "screen_type"
fun newIntent(context: Context, screenType: String, params: Bundle = Bundle.EMPTY): Intent {
return Intent(context, ComposeWrapperActivity::class.java).apply {
putExtra(EXTRA_SCREEN_TYPE, screenType)
putExtras(params)
}
}
}
}
Feature Toggle
安全地在 Production 环境开关新功能。
interface FeatureFlags {
val useNewCheckout: Boolean
val enableComposeProfile: Boolean
}
class RemoteFeatureFlags @Inject constructor(
private val remoteConfig: FirebaseRemoteConfig
) : FeatureFlags {
override val useNewCheckout: Boolean
get() = remoteConfig.getBoolean("use_new_checkout")
}
// 使用
class CheckoutNavigator @Inject constructor(
private val context: Context,
private val featureFlags: FeatureFlags
) {
fun navigateToCheckout(orderId: String) {
if (featureFlags.useNewCheckout) {
ModernEntryPoint.startCheckoutCompose(context, orderId)
} else {
context.startActivity(Intent(context, LegacyCheckoutActivity::class.java))
}
}
}
Quick Checklist
- Required Inputs 已填写并冻结(边界/契约/回滚)
- 新功能放在
modern/目录 - 桥接层清晰定义 (bridge/)
- Hybrid Theming 确保视觉一致
- Feature Toggle 控制上线
- 避免新代码依赖旧代码的内部实作
- Legacy Gate 已执行并记录结果