一、簡介
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在開發和維護過程中遇到的種種問題,能夠提高開發效率,降低維護成本,方便快捷地將新功能快速地推向市場。
原創文章,作者:KMZNU,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/332319.html