Project/
├── app/ ← 宿主壳工程(必须发版)
│ └── KuiklyApplication
├── shared-base/ ← 必须内置在 App 的基础模块
│ └── User / Theme / 基础 Module
└── shared-business/ ← 可动态下发的业务模块
├── home/ ← 独立 dex/aar
├── detail/
├── publish/
└── activity/ ← 最常变
| 平台 | 产物 | 限制 |
|---|---|---|
| Android | dex / aar | 几乎无限制(自定义 ClassLoader) |
| iOS | KMP 字节码 + 解释器 | Apple 审核:不能下发可执行代码 |
| HarmonyOS | so | 依赖系统能力支持 |
| Web / 小程序 | js bundle | 同 Web 标准 |
SDK 初始化 + Module 注册 + 全局 Store 初始化
触发 KuiklyCoreEntry.triggerRegisterPages → 启动 KuiklyActivity
构建 BuildTree → diff RenderTree
原生层创建 View,屏幕首次刷新(first paint)
数据加载、入场动画、PV 埋点
用户能看到完整内容(first meaningful paint)
if (ctx.firstLoading) {
renderSkeleton().invoke(this) // 骨架屏立即渲染
} else {
renderRealContent().invoke(this)
}
class KuiklyApplication : Application() {
override fun onCreate() {
super.onCreate()
ModuleRegistry.register("Toast") { ToastModule() } // 启动必需
Handler(Looper.getMainLooper()).postIdle { // 延后到 idle
ModuleRegistry.register("Camera") { CameraModule() }
ModuleRegistry.register("Push") { PushModule() }
}
}
}
override fun body() = {
renderHero(ctx).invoke(this) // 首屏,立即渲染
if (ctx.deferredLoaded) { // 折叠以下,pageDidAppear 后再挂
renderRecommend(ctx).invoke(this)
renderComments(ctx).invoke(this)
}
}
Kuikly 提供帧监控 API:
acquireModule<DeviceInfoModule>(...).addFrameRateListener { fps ->
if (fps < 50f) KLog.w("Perf", "Low fps: $fps")
}
| 元凶 | 表现 | 解法 |
|---|---|---|
| item 渲染太重 | 滚动卡,每个 item 创建慢 | 简化 item 布局,抽公共组件 |
| observable 颗粒度太粗 | 一字段变化引起整 List 刷 | 按 item 粒度拆 observable |
| 主线程被堵 | 图片同步解码 / 网络回调直接刷 UI | 用 Image 组件,回调 dispatchers.Main |
| 原因 | 解法 |
|---|---|
| NotificationListener 没解绑 | pageWillDestroy 里 removeNotificationListener |
| Timer 没 cancel | pageWillDestroy 里 timer.cancel(taskId) |
| 全局 Store 持有 Pager 引用 | 避免 GlobalStore.currentPage = this |
| 图片缓存爆炸 | LRU 限制大小(框架默认有) |
| 招数 | 说明 |
|---|---|
| 1. 只打必要 ABI | armeabi-v7a + arm64-v8a 即可 |
| 2. 启用 R8/ProGuard | 去除未使用代码,平均 30% 减包 |
| 3. 大图放 CDN | 不打进 APK |
| 4. 业务模块走动态化 | 非核心页面下发 |
| 5. 资源压缩 + WebP | PNG → WebP 平均省 30% |
数据来源:腾讯官方 2025 年公布。Kuikly 在「包体 + 内存」上的优势明显,符合"原生渲染 + KMP 编译"的架构特点。