关闭

360插件化Replugin爬坑之路

标签: 插件360
1858人阅读 评论(0) 收藏 举报
分类:

前言

继上次爬完了热修复的坑位,中途爬了各种各样的坑。今天我们来说说插件化Replugin的坑位。Replugin刚出的时候我就看过了。第一次看的时候可能心态不好。没看懂= =第二次重头在看,发现蛮简单的,可能一两个小时就搞定了。但是这玩意出来我就知道了。今天才整理。这就可想而知,坑位多的有点可怕。好了。下面,我们一一整理这些各式各样的坑。

主程序接入

gradle的依赖

在整个项目的build.gradle中添加如下代码:

buildscript {
    dependencies {
        classpath 'com.qihoo360.replugin:replugin-host-gradle:2.1.6'
    }
}

library的依赖

在app的build.gradle中添加如下代码:

apply plugin: 'replugin-host-gradle'
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.3.0'
    compile 'com.qihoo360.replugin:replugin-host-lib:2.1.6'
}

repluginHostConfig {
    useAppCompat = true
}

这些务必要加载最底部。防止编译的时候读不到数据。

配置我们的application

关于application这一说,我们可以不用参考官网的做法,直接改成如下代码即可:


/**
 * Created by Angel on 2017/7/12.
 */
public class MainApplication extends RePluginApplication {

    public void onCreate() {
        super.onCreate();
        RePlugin.App.onCreate();
        RePlugin.enableDebugger(this,true);
//        PluginInfo pi = RePlugin.install(Environment.getExternalStorageDirectory()
//                .getAbsolutePath() + "/demo.apk");
//        if (pi != null) {
//            Log.i("plugin----------------", "onCreate: 6666666");
//            RePlugin.preload(pi);
//        }
    }

    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //-------------- 开发的时候不验证签名 -----------
        RePlugin.App.attachBaseContext(this,
                new RePluginConfig()
                        .setVerifySign(false)
                        .setPrintDetailLog(true)
                        .setUseHostClassIfNotFound(true)
                        .setMoveFileWhenInstalling(false));
    }
}

这边我们基本的接入流程走完了。具体运行我们后面在说。

插件接入

关于插件的接入,这就比主程序简单很多了。

gradle的依赖

在整个项目的build.gradle中添加如下代码:

buildscript {
    dependencies {
        classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.1.6'
        ...
    }
}

library的依赖

在app的build.gradle中添加如下代码:

apply plugin: 'replugin-host-gradle'
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.3.0'
    compile 'com.qihoo360.replugin:replugin-plugin-lib:2.1.6'
}

repluginHostConfig {
    useAppCompat = true
}

这些务必要加载最底部。防止编译的时候读不到数据。

关于插件的配置这就差不多了。具体使用后面说。

安装插件

主程序跳转插件的时候,我们需要进行安装插件。而插件,又分为内置插件和外置插件。官方对插件介绍的比较详细,其实笼统的介绍,很简单,就几句话。

内置插件

内置插件自我认为是比较常用的一种。

添加一个内置插件是非常简单的,甚至可以“无需任何Java代码”。只需两步即可:

  1. 将APK改名为:[插件名].jar
  2. 放入主程序的assets/plugins目录

这样,当编译主程序时,我们的“动态编译方案”会自动在assets目录下生成一个名叫“plugins-builtin.json”文件,记录了其内置插件的主要信息,方便运行时直接获取。

外置插件

上面我也说了,内置插件就够用了。用外置的可能,我认为和热更新这块有关联。当然,这也只是我的假想。具体还有什么其他用处,我就不知道了~

外置插件就一句话,把你插件的outputs下面的apk文件,扔进手机文件里面,即可。

关于插件的问题,我介绍的差不多了。下面就是主程序和插件的互相跳转了。

插件的跳转

插件跳转分为主程序跳转插件和插件跳转主程序。而这个跳转和普通的差别也不是很大,一行代码解决的事。

插件跳主程序

 findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName("com.angel.replugin", "com.angel.replugin.MainActivity"));
                startActivity(intent);
            }
        });

这就是一个插件跳转主程序的代码,是不是很简单。下面我们来看下我们的效果图:
这里写图片描述

可以看到我们的标题有明显的抖动,这就说明了。我们是2个进程的跳转,而不是在同一个进程里进行跳转。

主程序跳转插件

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                RePlugin.startActivity(MainActivity.this,
                        RePlugin.createIntent("demo", "com.angel.replugin2.Main"));
            }
        });

也是非常简单的一个代码。当然这边我们需要注意,插件的包名和activity名称不能和主程序的一模一样。
我们来看一遍效果图:
这里写图片描述

这样主程序和插件的互相跳转流畅基本走通了。下面我们稍微来说说我所遇到的那些坑位。

Replugin的坑位

我记得我第一次使用的Replugin的版本是2.1.2.当时出现了这么一个情况。插件跳转主程序可以正常跳转,主程序跳转插件出现activity没有在xml注册的情况。这个问题在2.1.3还是2.1.4中修复了。

第二个问题就是在主程序跳转插件时出现activity not found。外置插件不执行如下代码:

  if (pi != null) {
            Log.i("plugin----------------", "onCreate: 6666666");
            RePlugin.preload(pi);
        }

这里会出现pi一直为null的情况,具体自己可以去尝试,应该是2.1.4还是1.5中的问题。

最后一个问题就是在2.1.6中我出现了如下情况:
这里写图片描述

然后我就去对比了官方的介绍文档,各种配置啊,嗯,明明没毛病么。你让我咋改。然后我就请教了当时和我一直搞这玩意的小伙伴。因为他成功了。我没成功。然后对比了下代码,嗯,的确没问题。我:&%@##@@¥……….

最后发现代码的确没有问题,导致的问题如下:
这里写图片描述

这边我当时配置的是gradle版本是2.2.2改成2.3.3就可以了。最后运行,binggo。搞定了。

总结

对于Replugin这玩意,虽然360测试了三年多。但是感觉坑也蛮多了。当然还有什么插件跳转插件,以及各种调用和传值的问题。虽然具体不知道插件化的好处是什么,在我所知的范围内。我唯一能够知道的估计也就是,合作开发的时候用插件化,这样可以明显知道这个bug到底出在谁身上= =

0
0
查看评论

360开源的插件化框架Replugin深度剖析

概要: 一、关于ClassLoader 的知识回顾 和 Replugin中ClassLoader 二、Hook 系统ClassLoader 的原理分析 三、Hook 系统ClassLoader 的思想及总结 ClassLoader知识回顾 Class...
  • zz901214
  • zz901214
  • 2017-12-02 14:03
  • 323

Android 360开源全面插件化框架RePlugin 实战

1 RePlugin 介绍RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件化方案,由360手机卫士的RePlugin Team研发,也是业内首个提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。其主要优势有:极其灵活:主程序无需升级(无需在Manifest中预埋组件),即可支...
  • qiyei2009
  • qiyei2009
  • 2017-10-14 20:15
  • 693

Android 插件化框架 RePlugin 使用心得

0.先附上一篇原理讲解  http://www.jianshu.com/p/18530be5dcdd 这应该算是给作者打的广告吧。如有涉及侵权,请通知我立刻删除。 1.应用场景 Android开发人员不多,又要求使用插件化开发的模式。(简单点讲就是自己需...
  • qq_30878303
  • qq_30878303
  • 2017-12-21 10:42
  • 269

插件化-360的DroidPlugin与RePlugin研究及集成

Android插件化:从入门到放弃- http://blog.csdn.net/smallspot/article/details/52221049 RePlugin接入指南- https://github.com/Qihoo360/RePlugin/wiki/%E4%B8%BB%E7%A8%8B...
  • ShareUs
  • ShareUs
  • 2017-07-05 16:39
  • 1922

实验三(2) SQL查询(排序、集函数和分组子句的应用)

试验目的: 一、学习查询结果的排序 二、学习使用集函数的方法,完成统计 等查询。 三、学习使用分组子句   一、学习查询结果的排序 1、查询全体学生信息,结果按照年龄降 序排序 select *  from student order...
  • jbx929205249
  • jbx929205249
  • 2011-11-15 17:57
  • 1204

vue爬坑——入门坑

vue爬坑——入门坑问题1:父子页面路由模块之间的调用(非数据交互)解1:首先要了解路由的层级,其中index.html为顶级路由,App.vue为二级路由。其次需要知道路由的重定向redirect。最后需要注意的是父子路由需要调用时,父路由必须要有<router-view></r...
  • boy599237255
  • boy599237255
  • 2017-11-28 12:37
  • 94

APP插件化/组件化框架分析

VirtualAPK插件框架简单使用如感觉排版看着不舒服,可移步【APP插件化/组件化框架分析】。最近一段时间在研究插件化和组件化实现方案,今天也算整理一下笔记记录一下,记得之前讲述过一篇关于组件化的文章【Android 组件化之初探】,刚好对应着阿里的Atlas组件化框架,今天主要做个大致的介绍,...
  • u012532559
  • u012532559
  • 2017-11-22 21:16
  • 259

Vue 爬坑之路(四)—— 与 Vuex 的第一次接触

在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/6266038.html 但是如果是大型项目,很多时候都需要在子组件之间传递数据,使...
  • bbsyi
  • bbsyi
  • 2017-09-08 18:25
  • 344

android插件化框架-Replugin

Replugin是360开源的一款插件化框架,同样过多的资料就不在这展现了,github上有最完整的官网介绍。 github地址:https://github.com/DroidPluginTeam/DroidPlugin 宿主接入工作 project的gradle中加入: classpath ...
  • qq_25412055
  • qq_25412055
  • 2017-11-20 14:28
  • 124

Vue 爬坑之路(五)—— 组件进阶

组件(Component)是 Vue.js 最强大的功能之一,之前的文章都只是用到了基本的封装功能,这次将介绍一些更强大的扩展。   一、基本用法 在使用 vue-cli 创建的项目中,组件的创建非常方便,只需要新建一个 .vue 文件,然后在 中写好 HTML 代码,...
  • bbsyi
  • bbsyi
  • 2017-09-08 18:26
  • 191