用过Android的同学都知道,手机上的APP可以进行安装,安装完之后可以卸载,安装完后如果有新版本的话可以更新。此外还有一点,就是像windows那样,从win7升级到win10感觉不满意可以回滚到win7。但是回滚功能貌似在Android里是没有的。
OpenAtlas也是如此,在我们的宿主上安装的插件,也是类似这个机制。OpenAtlas为我们提供了很好的插件安装,卸载,更新,回滚的功能。
假设现在你有一个apk,但是前提是这个apk中的四大组件要在你的宿主的清单文件中进行注册,也就是OpenAtlas的初衷不是运行其他的Apk,而是模块化。想将它安装为插件,首先要有这个apk,按照正常流程开发就可以了。
然后我们将它放在sd卡的根目录,假设文件名为test-openatlas-debug.apk,更新代码就是这样子的
try {
File file=new File("/sdcard/test-openatlas-debug.apk");
if (!file.exists()){
Toast.makeText(MainActivity.this, "Test Update pkg not exist", Toast.LENGTH_LONG).show();
}
Atlas.getInstance().installBundle("com.lizhangqu.test1",file);
} catch (BundleException e) {
e.printStackTrace();
}
由于宿主中已经有com.lizhangqu.test这个插件了,所以上面的更新代码将插件安装的位置修改为了com.lizhangqu.test1,installBundle函数的两个参数,第一个是安装的位置,一般传插件的包名就可以了,第二个参数是插件的文件。安装完后对应目录下/data/data/package name/files/storage/下就会有对应的目录生成,如图所示。
如果要卸载的话也很简单,只要一句话
Atlas.getInstance().uninstallBundle("com.lizhangqu.test1");
参数为对应的插件包名,也就是之前安装的第一个参数。
搞定了安装与卸载,我们来看下如何进行插件的更新。插件的更新其实类似于插件的安装。当插件有新版本的时候,我们需要对其进行更新,拿到新apk后,将其放在sd卡根目录,下面进行更新,我们以名为test插件为例。
File file=new File("/sdcard/test-openatlas-debug.apk");
if (!file.exists()){
Toast.makeText(MainActivity.this, "Test Update pkg not exist", Toast.LENGTH_LONG).show();
}
try {
Atlas.getInstance().updateBundle("com.lizhangqu.test",file);
} catch (BundleException e) {
e.printStackTrace();
}
值得注意的是,插件的安装与卸载时不必重启宿主的,但是插件的更新是需要重启宿主的。在更新插件前,test插件的内容如下所示。
以及对应的文件夹内容如下
更新了一个版本后界面就变得不一样了。记得重启宿主。如图所示。
可以看到一些细微的区别,就是上面多了update1。
然后看看对应的文件夹是不是多了一个版本。
但是,一旦你更新到新的一个版本后,你突然发现有bug,这时候你想回滚到之前的一个版本怎么办,其实也很简单。
Atlas.getInstance().restoreBundle(new String[]{"com.lizhangqu.test"});
参数是一个字符串数组,可以同时回滚多个插件,这里只回滚了test插件。重启后你发现插件变回原来的样子了。
简简单单的四个操作,安装,卸载,更新,回滚,使得OpenAtlas变得十分灵活。我们可以随心所欲的进行控制,但是唯一的不足就是四大组件必须在宿主清单中注册,这也给了动态更新加大了难度。如果你想能够直接进行安装,更新插件,前提是你不引入新的组件,因为这些组件你必须注册,还有一个解决方法就是如果你的插件只是UI部分,不涉及新的广播,Service,ContentProvider,仅仅是涉及Activity,那么你完全可以使用Fragment进行代替,解决方案见
当然,如果你有兴趣,也可以阅读这一系列文章
最后,给出源码地址,直接放github上了,反复上传csdn太繁琐了。
- https://github.com/lizhangqu/OpenAtlasDemo