引言:从"稳定能用"到"安全好用"的进化
在ComboLite
的1.0时代,我们完成了最核心的使命:通过 "0 Hook & 0 反射" 的纯净架构,为Android插件化领域提供了一个坚如磐石的、面向未来的稳定基座。然而,正如我在 《ComboLite插件化框架未来开发计划》 中所预告的,一个真正现代化的框架,绝不能仅仅停留在"稳定能用"的层面。
困扰插件化开发者的两大"拦路虎"------地狱般的调试体验 和脆弱的安全模型------始终是制约其大规模、企业级应用的核心障碍。开发者们在繁琐的"打包-安装-验证"循环中耗尽心力,又在缺乏有效权限管控的"裸奔"环境中为应用安全捏一把汗。
今天,ComboLite 2.0
来了。它带着我们对这些核心痛点的深入思考和解决方案,完成了从"稳定基座"到"高效、安全的生产力平台"的关键一跃。这次升级,不仅是为了兑现社区的期待,更是为了重新定义,在2025年,一个现代化的Android插件化框架应该是什么样子。
项目源码 : github.com/lnzz123/Com...
(如果
ComboLite
的设计理念与工程实践获得了你的认可,请不吝给我们一个 Star!)
一、开发体验的革命:从"分钟级"到"秒级"的无缝源码调试
这是ComboLite 2.0
最令人振奋的特性,它将彻底改变您的插件开发工作流。
过去的痛苦:我们失去了什么?
传统插件开发,尤其是采用 library
模块作为插件时,调试流程令人绝望。每一次微小的代码修改,都意味着一场与Gradle和ADB的漫长搏斗,宝贵的开发时间就这样在等待中流逝,创造的激情被消磨殆尽。
现在的变革:packagePlugins
如何化繁为简
我们通过全新的 combolite-aar2apk:1.1.0
Gradle插件,带来了一项颠覆性功能------构建时自动集成。

正如上图所示,现在你的调试流程被简化为:
- 在插件
library
模块中修改代码、设置断点。 - 点击 Android Studio 的 "Run" 或 "Debug" 按钮。
- 调试开始!
这背后,AppIntegrationPlugin
(main/kotlin/com/combo/aar2apk/AppIntegrationPlugin.kt
) 插件在后台为你完成了一切。当你构建宿主App时,它会:
- 自动触发 :依赖根项目中配置的
buildAllDebugPluginApks
或buildAllReleasePluginApks
任务。 - 编译打包 :将你在
aar2apk
中声明的所有插件library
模块,通过ConvertAarToApkTask
(main/kotlin/com/combo/aar2apk/tasks/ConvertAarToApkTask.kt
) 编译成独立的APK文件。 - 无缝集成 :
PreparePluginAssetsTask
(main/kotlin/com/combo/aar2apk/tasks/PreparePluginAssetsTask.kt
) 会将这些新鲜出炉的插件APK,直接添加为宿主App构建过程中的一个assets
源集。
最终,这些插件APK被悄无声息地打包进了最终宿主APK的 assets
目录,而你的工程源码目录却毫发无损,实现了真正的零侵入。
如何启用?
两步配置,即可拥有极致体验:
-
在项目根
build.gradle.kts
中,声明所有插件模块:Kotlin
javaaar2apk { modules { module(":your-plugin-1") module(":your-plugin-2") } // ... }
-
在宿主
:app
模块 的build.gradle.kts
中启用集成:Kotlin
cpackagePlugins { enabled.set(true) buildType.set(PackageBuildType.DEBUG) pluginsDir.set("plugins") // APK在assets内的存放目录 }
最后,在你的 MainActivity
或 ViewModel
中,配合 installPluginsFromAssetsForDebug()
扩展函数,即可在Debug模式下实现插件的自动安装与加载,完成调试闭环。
二、企业级安全体系:为你的开放生态构筑"权限铁壁"
一个只在内部使用的插件化系统和一个需要支撑开放生态(如"插件商店")的系统,其安全要求是天壤之别。ComboLite 2.0
引入了一整套企业级的安全架构,它由权限系统 、校验策略 和崩溃处理三根支柱共同构成。

支柱一:权限系统 (The Law) - API的"访问控制"
我们不再信任任何插件。通过 @RequiresPermission
注解,我们为框架内部所有敏感API都设定了明确的"访问规则"。
Kotlin
kotlin
// in PluginManager.kt
@RequiresPermission(PermissionLevel.HOST, hardFail = true)
suspend fun setValidationStrategy(strategy: ValidationStrategy) { ... }
当插件调用这些API时,PermissionExt.kt
中的 checkApiCaller
方法会通过分析调用堆栈,并对照全局类索引,精准识别出"谁在调用 ",然后交由 AuthorizationManager
进行裁决。
PermissionLevel.HOST
: 只有与宿主签名相同的"天选之子"才能调用。PermissionLevel.SELF
: 默认只允许插件对自己进行操作,权责分明。
支柱二:校验策略 (The Gatekeeper) - 插件的"准入安检"
如何处理未知来源的插件?ComboLite 2.0
将决策权交给了你。通过 PluginManager.setValidationStrategy()
,你可以设置三种不同的"安检"策略:
ValidationStrategy.Strict
: 宁枉勿纵。延续1.0策略,签名不匹配,直接拒绝。ValidationStrategy.UserGrant
: 用户裁决 。签名不匹配时,自动拉起如视频所示的AuthorizationActivity
(kotlin/com/combo/core/security/auth/AuthorizationActivity.kt
),将插件的名称、版本、描述甚至签名Hash全部展示给用户,由用户决定是否放行。ValidationStrategy.Insecure
: 大门敞开。禁用所有校验,仅限调试。
这套机制的核心是 IAuthorizationHandler
接口 (kotlin/com/combo/core/security/auth/IAuthorizationHandler.kt
),它允许你完全替换掉默认的授权UI,深度定制符合你产品风格的授权流程。
支柱三:崩溃处理器 (The Fusebox) - 应用的"自愈"能力
插件总会崩溃,但应用不应该。PluginCrashHandler
(kotlin/com/combo/core/security/crash/PluginCrashHandler.kt
) 在2.0版本中得到了全面增强:
- 全新的崩溃UI : 我们重新设计了
CrashScreen
(kotlin/com/combo/core/ui/CrashScreen.kt
),它不仅界面更友好,还通过内置的StackTraceTextViewer
(kotlin/com/combo/core/ui/component/StackTraceTextViewer.kt
) 提供了带语法高亮的堆栈信息,方便开发者快速定位问题。 - 分级的回调机制 : 现在,你可以通过
setGlobalClashCallback
注册一个全局回调,用于统一的异常上报和处理。同时,插件也可以通过setClashCallback
为自身注册一个专属回调(拥有更高优先级),实现更精细的、差异化的异常处理策略。
这三道防线环环相扣,共同构筑起ComboLite 2.0
坚不可摧的安全生态。
三、重要变更与迁移指南
为了实现架构的跃迁,2.0
版本引入了一些重大的破坏性变更,请老用户务必仔细阅读。
-
插件二进制不兼容
由于核心库 combolite-core 的包结构和API进行了大规模重构,所有基于2.0.0之前版本编译的插件,均与此版本不兼容。请务必使用 combolite-aar2apk:1.1.0 或更高版本,对您所有的插件项目进行重新打包。
-
元数据配置方式变更
我们遵循了更标准的Android规范,废弃了通过 定义插件ID和版本的方式。
迁移前 (Old):
XML
ini<application> <meta-data android:name="plugin.id" android:value="com.example.myplugin" /> <meta-data android:name="plugin.version" android:value="1.0.0" /> <meta-data android:name="plugin.entryClass" android:value="...MyPluginEntry" /> </application>
迁移后 (v2.0):
XML
ini<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myplugin" android:versionCode="1" android:versionName="1.0.0"> <application android:label="我的插件" android:icon="@drawable/plugin_icon"> <meta-data android:name="plugin.entryClass" android:value="...MyPluginEntry" /> </application> </manifest>
现在,插件的ID直接取自
manifest.package
属性,版本信息取自versionCode
和versionName
,同时还支持解析application
标签下的label
(插件名) 和icon
(图标),配置更直观,能力更丰富。
结语:是时候,用现代化的方式构建动态化应用了
ComboLite 2.0
不仅仅是一次版本更新,它更是我们对"现代化Android开发"理念的一次完整诠释。我们坚信,一个优秀的框架,应该像一把精良的瑞士军刀,不仅要功能强大、坚固可靠,更要让使用者在每一次挥舞时都感到得心应手。
我们已经为您铺平了道路,现在,邀请您亲自踏上这段旅程,体验这份前所未有的开发"爽"感。