一、VirtualAPK 介绍
VirtualAPK 是我们推出的一款Android平台上的插件化方案,通过VirtualAPK,可以让APP无需重新发版即可上线新功能。
之所以做这件事,是因为传统的开发流程中,APP进行版本迭代的时候,有着严格的时间周期的要求,必须在规定的时间点完成功能开发,也必须在规定的时间点完成渠道投放,这就让APP的版本迭代有了一定的限制,无法做到APP的随时更新,于是我们开发了VirtualAPK,通过VirtualAPK,APP发版将不再有时间点的限制,可以随心所欲地按需更新。
为了实现这一功能,我们首先将一个APP拆成两个部分,分别为宿主和插件,其中宿主中没有或者只有少量无需更新的逻辑,而所有的业务逻辑代码则位于插件中,每次APP更新的时候,我们只需要更新插件即可。在技术上,通过Android的动态加载机制来加载插件,并完成了对各个版本Android系统的拦截,使得插件的开发和传统的Android开发保持一致,支持插件的代码、资源访问,并支持四大组件。
二、集成过程
遇到的问题:
1. 可以跳转,但是跳转到了宿主的activity?
原因:插件布局文件名称与宿主页面名称一致;
2. 可以跳转,生命周期也执行了,但是白板?
问题:编译失败的问题
3. Error:A problem occurred configuring project ':app_plugin'. > The directory of host application doesn't exist!
解决办法:修改宿主路径;
4. Error:A problem occurred configuring project ':app_plugin'. > Can't find D:\workspaceghnice\RPluguin\VAHostDemo\app\build\VAHost\Host_R.txt, please check up your host application need apply com.didi.virtualapk.host in build.gradle of host application
解决办法:在App的工程模块的build.gradle添加使用gradle插件;
同时clean project;
5. Can't find D:\workspaceghnice\RPluguin\VAHostDemo\app\build\VAHost\versions.txt
在4的基础上 rebuild project;
6. Error:A problem occurred configuring project ':app_plugin'. > Failed to notify project evaluation listener. > com/android/builder/dependency/ManifestDependency
修改项目gradle 版本为2.1.3 (原来是2.2.3)
7. Error:Execution failed for task ':app_plugin:transformClassesAndResourcesWithStrippedForRelease'. > Cannot cast object 'null' with class 'org.codehaus.groovy.runtime.NullObject' to class 'java.util.Set'
解决办法:在宿主gradle 加 core 依赖;
8. 提示:宿主可以是debug,插件必须是release。你在buildTye里面加个release。
9.PackageParser: Unknown element under : meta-data at /storage/emulated/0/va_plugin.apk Binary XML file line #11
android.content.res.Resources$NotFoundException: File res/mipmap-xxhdpi-v4/ic_launcher.png from xml type layout resource ID #0x7f030000
解决办法:将插件的清单文件使用的laucher 放在drawable 目录;
10. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
前提:宿主和插件的布局文件名称已经是不一致的。
11. Error:Execution failed for task ':app_plugin:transformClassesAndResourcesWithStrippedForRelease'. > Cannot cast object 'null' with class 'org.codehaus.groovy.runtime.NullObject' to class 'java.util.Set'
解决办法:将插件工程与宿主工程单独开来;
三、参考
介绍文档:
1. infoq http://www.infoq.com/cn/news/2017/06/VirtualAPK-opensource
2. http://geek.csdn.net/news/detail/130917
3. 官网:https://github.com/didi/VirtualAPK