您的位置:

virtualapk插件化框架

一、简介

VirtualAPK(以下简称VA,具体内容可访问官网 https://github.com/didi/VirtualAPK )是一款基于Android插件化原理实现的插件化框架。与传统单一APK的开发模式不同,VA将整个APP拆分成多个独立的插件,提供了更多的灵活性和可扩展性,以满足多样化、高变化性、快速等需求。

VA相比传统的插件化框架DexClassLoader,VA通过hook掉AssetManager和Resources来达到无缝替换的目的,适用于多种场景,如:商业化APP逐渐复杂,需求变得多样化;不同模块之间业务重复度高,难以管理;多方合作、协同开发,代码冲突,代码热更新等等。

二、优势

1.灵活性 - 通过插件化,将整个应用分为小而独立的部分,新功能可打包成一个插件,旧功能也可作为独立的插件运行,有利于针对某些业务,持续迭代、快速升级等。

2.可扩展性 - VA提供了多种灵活的扩展接口,如:IActivityDelegate、IApplicationDelegate、IInstrumentation等,能够在某个地方通过接口嵌入进去一些自己的逻辑代码,丰富了原本的应用。

3.安全性 - VA在启动时会先验证插件的签名信息和包名信息,保证不被非法类库利用。

4.使用简单 - VA提供了类似系统API的高层封装,整个API设计和使用方法都非常简单。只需要一行代码即可运行插件。

三、使用教程

1.集成VirtualAPK

在主工程中加入VA,并且在清单文件中声明VirtualAPKService组件。


dependencies {
    implementation 'com.didi.virtualapk:core:x.y.z'
}


   
    
    

    
    

   

2.构建插件

插件是开发应用中各模块独立打包的产物,其中,对VA插件的工程要求是包含Activity、Service的代码和对应的资源文件,如AndroidManifest.xml、res、assets、libs等,同时,需要拷贝主工程清单中的配置。在Gradle配置文件中,需要在构建类型中增加以下内容,具体可以参考VA官网的示例。


android {
    defaultConfig {...}

    // ...
    buildTypes {
        plugin {
            initWith buildTypes.debug
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = [file("$projectDir/src/main/libs")]
            assets.srcDirs = [file("$projectDir/src/main/assets"), file("$projectDir/build/generated/assets")]
            res.srcDirs = [file("$projectDir/res")]
            manifest.srcFile "$projectDir/AndroidManifest.xml"
        }
        plugin {
            jniLibs.srcDirs = [file("$projectDir/src/main/libs")]
            assets.srcDirs = [file("$projectDir/src/main/assets"), file("$projectDir/build/generated/assets")]
            res.srcDirs = [file("$projectDir/res")]
            manifest.srcFile "$projectDir/AndroidManifest.xml"
        }
    }
}

3.加载插件

在主工程中运行插件需要通过VA加载对应的插件,代码如下:


if (null == virtualAPK) {
    virtualAPK = new VirtualAPK(this);
    virtualAPK.addVirtualApk(virtualApkPath);
}
Intent intent = new Intent();
intent.setClassName(pluginPackage, "com.example.plugin_module.MainActivity");
virtualAPK.startActivity(intent);

四、总结

VirtualAPK是一款灵活性和可扩展性强的插件化框架,在一定程度上解决了商业化APP在开发和维护过程中遇到的种种问题,能够提高开发效率,降低维护成本,方便快捷地将新功能快速地推向市场。