一、简介
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在开发和维护过程中遇到的种种问题,能够提高开发效率,降低维护成本,方便快捷地将新功能快速地推向市场。