手把手教你集成滴滴的插件化框架virtualapk

来源:互联网 发布:网络机顶盒 会员 编辑:程序博客网 时间:2024/05/29 13:21

首先是virtualapk的官方demo:https://github.com/didi/VirtualAPK

然后,开始集成,咱们一步一步来。

第一步:创建一个android项目,这个大家都会我就不截图了。

第二步:修改编译环境,virtualapk对编译环境有很大的限制,我使用的编译环境是:



这两张截图的位置分别是项目根目录下的build.gradle和gradle文件夹下的gradle-wrapper.properties。

    第三步:创建一个插件。

选择New Module

选择Phone&Tablet Module


然后就和创建项目一样了,建议是不要把主类的名称和宿主的类名相同(宿主就是最开始创建的项目)。如果创建一样的话,可能造成跳转页面出现空白。

    第四步:添加依赖。

在项目根目录的build.gradle的dependencies标签下添加

classpath 'com.didi.virtualapk:gradle:0.9.4',也就是这样的

宿主下的build.gradle的dependencies标签下添加

compile 'com.didi.virtualapk:core:0.9.1'


在顶部添加

apply plugin: 'com.didi.virtualapk.host'

插件build.gradle的dependencies标签下添加

compile 'com.didi.virtualapk:core:0.9.1'

在最底部添加

apply plugin: 'com.didi.virtualapk.plugin'
virtualApk {
    packageId = 0x6f
    targetHost = 'E:/AndroidStudioProjects/DidiPluginDemo/app'
    applyHostMapping = true
}


解释一下virtualApk标签下的三个参数:

packageId:插件资源id,避免资源id冲突

targetHost:宿主路径,可以使相对路径也可以是绝对路径

applyHostMapping:表示插件是否开启apply mapping功能

    第五步:

在宿主中新建一个Application继承自Application,并在其中重写attachBaseContext方法,在方法里初始化插件

PluginManager.getInstance(base).init();

一定要注意要在宿主的清单文件中声明自己重写的Application。我就是忘了这件事发现死活成功不了:(

    第六步:

private void loadPlugin(Context base) {        PluginManager pluginManager = PluginManager.getInstance(base);        File apk = new File(Environment.getExternalStorageDirectory(), "plugin.apk");        if (apk.exists()) {            try {                pluginManager.loadPlugin(apk);            } catch (Exception e) {                e.printStackTrace();            }        } else {            Toast.makeText(getApplicationContext(),                    "SDcard根目录未检测到plugin.apk插件", Toast.LENGTH_SHORT).show();        }    }
这个方法是用来加载插件,可以在合适的时候运行它,我是在MainActivity的onCreate方法中调用的。
注意插件的路径、名字一定要正确负责会导致宿主找不到插件导致崩溃。

btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent();                intent.setClassName("com.qujie.pluginapk", "com.qujie.pluginapk.Main2Activity");                startActivity(intent);            }        });

 我在宿主中只实现了简单的跳转,注意插件的包名、类路径一定一定一定要写正确。    第七步:插件中的代码,我只显示了一张图片,所以代码就不贴出来了。    第八步:安装,先来说说使用命令行的:(1).连接手机并编译宿主工程    进入工程目录下,执行gradlew clean iR(2).构建插件并将插件推送到手机sd卡的根目录    执行 gradlew clean assemblePlugin
 adb push appild/outputs/apk/pluginapk-release-unsigned.apk /sdcard/plugin.apk 
    注意第二条命令,其中的pluginapk-release-unsigned.apk是生成的插件名称,位置在插件工程中的build->outputs->apk下,plugin.apk是在宿主中定义好的名称,一定不能写错。
   再来说说另一种方法:
(1).打包安装宿主工程,这个应该都会就不截图了。
(2).生成插件工程:

     双击我标记的选项,等待构建成功就能在插件工程中的build->outputs->apk下找到构建成功的插件apk了,然后手动放到指定好的目录下,注意,插件的名称一定是在宿主中规定好的名称。
插件包均是Release包,不支持debug模式的插件包。
     第九步:运行 

运行成功,撒花。
    以上就是简单的集成过程了,更高大上的操作就需要各位自己研究了。

友情提示:需要在插件工程下的androidTest下创建一个res文件夹,再在下面创建values文件夹,再创建一个string文件,里面随便写点东西,否则可能造成编译不通过,提示找不到R.txt。
    参考文章:
http://www.jianshu.com/p/013510c19391 VirtualAPK插件框架介绍(一)----框架接入
http://www.jianshu.com/p/b78087d0d524 VirtualAPK插件框架简单使用
    最后,奉上源码:
https://github.com/dzghxs/DidiPluginDemo

 
原创粉丝点击