这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感

引言:从"稳定能用"到"安全好用"的进化

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插件,带来了一项颠覆性功能------构建时自动集成

正如上图所示,现在你的调试流程被简化为:

  1. 在插件 library 模块中修改代码、设置断点。
  2. 点击 Android Studio 的 "Run" 或 "Debug" 按钮。
  3. 调试开始!

这背后,AppIntegrationPlugin (main/kotlin/com/combo/aar2apk/AppIntegrationPlugin.kt) 插件在后台为你完成了一切。当你构建宿主App时,它会:

  1. 自动触发 :依赖根项目中配置的 buildAllDebugPluginApksbuildAllReleasePluginApks 任务。
  2. 编译打包 :将你在 aar2apk 中声明的所有插件 library 模块,通过 ConvertAarToApkTask (main/kotlin/com/combo/aar2apk/tasks/ConvertAarToApkTask.kt) 编译成独立的APK文件。
  3. 无缝集成PreparePluginAssetsTask (main/kotlin/com/combo/aar2apk/tasks/PreparePluginAssetsTask.kt) 会将这些新鲜出炉的插件APK,直接添加为宿主App构建过程中的一个assets源集

最终,这些插件APK被悄无声息地打包进了最终宿主APK的 assets 目录,而你的工程源码目录却毫发无损,实现了真正的零侵入

如何启用?

两步配置,即可拥有极致体验:

  1. 项目根 build.gradle.kts 中,声明所有插件模块:

    Kotlin

    java 复制代码
    aar2apk {
        modules {
            module(":your-plugin-1")
            module(":your-plugin-2")
        }
        // ...
    }
  2. 宿主 :app 模块build.gradle.kts 中启用集成:

    Kotlin

    c 复制代码
    packagePlugins {
        enabled.set(true)
        buildType.set(PackageBuildType.DEBUG)
        pluginsDir.set("plugins") // APK在assets内的存放目录
    }

最后,在你的 MainActivityViewModel 中,配合 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版本引入了一些重大的破坏性变更,请老用户务必仔细阅读。

  1. 插件二进制不兼容

    由于核心库 combolite-core 的包结构和API进行了大规模重构,所有基于2.0.0之前版本编译的插件,均与此版本不兼容。请务必使用 combolite-aar2apk:1.1.0 或更高版本,对您所有的插件项目进行重新打包。

  2. 元数据配置方式变更

    我们遵循了更标准的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 属性,版本信息取自 versionCodeversionName,同时还支持解析 application 标签下的 label (插件名) 和 icon (图标),配置更直观,能力更丰富。

结语:是时候,用现代化的方式构建动态化应用了

ComboLite 2.0 不仅仅是一次版本更新,它更是我们对"现代化Android开发"理念的一次完整诠释。我们坚信,一个优秀的框架,应该像一把精良的瑞士军刀,不仅要功能强大、坚固可靠,更要让使用者在每一次挥舞时都感到得心应手。

我们已经为您铺平了道路,现在,邀请您亲自踏上这段旅程,体验这份前所未有的开发"爽"感。

📚 ComboLite 深度探索系列文章

相关推荐
alexhilton31 分钟前
Jetpack Compose中的阴影艺术
android·kotlin·android jetpack
闲人编程2 小时前
【指南】为你的开源Python项目编写完善的文档(Sphinx)
python·开源·文档·sphinx·算法改进·codecapsule
奋进的电子工程师3 小时前
如何实现开源组件的安全与合规治理?
安全·开源·代码规范·设计规范·代码复审
百***61874 小时前
Spring的构造注入
android·java·spring
Tom4i4 小时前
Kotlin 中的 inline 和 reified 关键字
android·开发语言·kotlin
yi诺千金4 小时前
Android U 自由窗口(浮窗)——启动流程(system_server侧流程)
android
清空mega7 小时前
第11章 网络编程
android·网络
自动化BUG制造器7 小时前
Android UI 线程不一定是主线程
android
无知的前端7 小时前
一文读懂-Jetpack与AndroidX
android·kotlin·android jetpack
河铃旅鹿9 小时前
Android开发-java版:SQLite数据库
android·数据库·笔记·学习·sqlite