Android插件化开发之OpenAtlas插件的安装与卸载、更新与回滚

用过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/下就会有对应的目录生成,如图所示。

Android插件化开发之OpenAtlas插件的安装与卸载、更新与回滚_第1张图片

如果要卸载的话也很简单,只要一句话

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插件的内容如下所示。

Android插件化开发之OpenAtlas插件的安装与卸载、更新与回滚_第2张图片

以及对应的文件夹内容如下

Android插件化开发之OpenAtlas插件的安装与卸载、更新与回滚_第3张图片

更新了一个版本后界面就变得不一样了。记得重启宿主。如图所示。

Android插件化开发之OpenAtlas插件的安装与卸载、更新与回滚_第4张图片

可以看到一些细微的区别,就是上面多了update1。

然后看看对应的文件夹是不是多了一个版本。

Android插件化开发之OpenAtlas插件的安装与卸载、更新与回滚_第5张图片

但是,一旦你更新到新的一个版本后,你突然发现有bug,这时候你想回滚到之前的一个版本怎么办,其实也很简单。

Atlas.getInstance().restoreBundle(new String[]{"com.lizhangqu.test"});

参数是一个字符串数组,可以同时回滚多个插件,这里只回滚了test插件。重启后你发现插件变回原来的样子了。

简简单单的四个操作,安装,卸载,更新,回滚,使得OpenAtlas变得十分灵活。我们可以随心所欲的进行控制,但是唯一的不足就是四大组件必须在宿主清单中注册,这也给了动态更新加大了难度。如果你想能够直接进行安装,更新插件,前提是你不引入新的组件,因为这些组件你必须注册,还有一个解决方法就是如果你的插件只是UI部分,不涉及新的广播,Service,ContentProvider,仅仅是涉及Activity,那么你完全可以使用Fragment进行代替,解决方案见

  • Android插件化开发之解决OpenAtlas组件在宿主的注册问题

当然,如果你有兴趣,也可以阅读这一系列文章

  • Android插件化开发之OpenAtlas初体验
  • Android插件化开发之OpenAtlas生成插件信息列表
  • Android插件化开发之OpenAtlas资源打包工具补丁aapt的编译
  • Android插件化开发之OpenAtlas插件适配
  • Android插件化开发之解决OpenAtlas组件在宿主的注册问题
  • Android插件化开发之OpenAtlas中四大组件与Application功能的验证
  • Android插件化开发之OpenAtlas插件启动方式与插件启动广播

最后,给出源码地址,直接放github上了,反复上传csdn太繁琐了。
- https://github.com/lizhangqu/OpenAtlasDemo

你可能感兴趣的:(android,插件化,安装卸载,更新回滚,OpenAtlas)