1、VirtualApk介绍:
virtualApk是滴滴出行自主研发的一款优秀的插件化框架,拥有入侵性底、兼容性优秀和功能完备的优点。也正因为是这些优点让我在接触插件化形式开发选中了VirtualApk为切入点。VirtualApk在解耦方面,VirtualAPK是开源方案的首选,推荐大家使用。
VirtualApk项目地址:https://github.com/didi/VirtualAPK
2、为什么写这篇文章:
首先,这篇文章只是作为我的使用记录,这一次使用完后不知道什么时候会再次使用,所以为了避免自己对VirtualApk的遗忘,写了这一边“备忘录”。这篇文章没有源码介绍;没有架构分析;也没有实现方式,只是罗列步骤介绍如何使用VirtualApk框架。如果想要知道这些知识的大神们,后面的就不用看了,没什么技术含量,关于这方面的内容找度娘直接搜索有很多。
3、切入正题:
接下来,正式开始整合Android项目使用VirtualApk的步骤。
说一下名词:
宿主项目:要接入插件的承载项目。
插件项目:作为插件被宿主项目所使用的项目。
首先,创建项目。项目中包含默认的Module-->app。暂时把它作为宿主项目。
然后,配置宿主项目:
在工程根目录下
build.gradle
中添加:在App的
build.gradle
中顶部添加在App的
build.gradle
中compile
添加
4、宿主项目的代码编写:
第一步:
创建class文件,集成Application类:
重写TestApplication类的attachBaseContent方法:
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); PluginManager.getInstance(base).init(); }PluginManager.getInstance(base).init();// 这行代码是对VirtualApk的初始化第二步:
编写Activity内容:为界面创建一个按钮,为按钮添加onClick事件,触发启动插件Activity操作。
注意:在触发启动插件之前,需要提前加载插件。
private void loadPlugin() { //注意在Androidmanifest.xml文件中添加文件读取权限 String _path = Environment.getExternalStorageDirectory().getAbsolutePath().concat("/" + "plugin.apk"); File _file = new File(_path); mFileExists = _file.exists(); if (mFileExists) { try { PluginManager.getInstance(this).loadPlugin(_file); } catch (Exception _e) { mFileExists = false; } } }Button点击触发事件内容:
if (mFileExists) { intent.setClass(this, TestActivity.class); intent.setClassName("com.musi.pluginapp", "com.musi.pluginapp.PluginActivity"); startActivity(intent); } else { Toast.makeText(FirstActivity.this, "文件包不存在!", Toast.LENGTH_SHORT).show(); return; }到此,宿主配置完成。
5、插件项目配置
为当前Project添加plugin Module:
第一步:
在插件项目根目录下
build.gradle
中顶部添加依赖以及插件配置信息
第二步:界面编写:
用于区分宿主界面启动插件界面成功,在插件界面添加了一个TextView,text内容写上当前界面是插件Activity的界面。
第三步:呃。。。没了 插件项目配置完成了。
6、构建插件
使用git构建:进入项目插件项目根目录,点击右键Git Bash Here
输入:
./gradlew clean assemblePlugin 或者 gradle clean assemblePlugin
我就呵呵了,没成功,查找资料,结果gradle可以全自动构建一键搞定:
双击assemblePlugin直接构建完成,完成后插件目录地址:..(插件项目根目录)\build\outputs\plugin\release
这里有个坑:在进行插件构建时,如果宿主项目没有被运行过或者说被构建过,进行插件构建才能成功。
还有一个坑:资源共享问题,插件项目资源和宿主项目资源的id不能相同,直白一点就是名字不能项目。宿主项目的MainActivity启动插件项目的MainActivity。由于两个Activity所引用的布局资源文件的名字都是layout_main.xml,导致虽然插件Activity被启动成功,但是所引用的布局文件却是宿主项目的layout_main.xml。
将这个插件放置到android手机固定的位置,这个位置在宿主项目中按钮点击事件启动插件时会用到。
插件放到固定目录 运行宿主程序,点击按钮,启动插件Activity。