前言

继上次爬完了热修复的坑位,中途爬了各种各样的坑。今天我们来说说插件化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到底出在谁身上= =

360插件化Replugin爬坑之路的更多相关文章

  1. 关于360插件化Replugin Activity动态修改父类的字节码操作

    近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find c ...

  2. Vue 爬坑之路(十二)—— vue-cli 3.x 搭建项目

    Vue Cli 3 官方文档:https://cli.vuejs.org/zh/guide/ 一.安装 @vue/cli 更新到 3.x 之后,vue-cli 的包名从 vue-cli 改成了 @vu ...

  3. Android 全面插件化 RePlugin 流程与源码解析

    转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...

  4. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...

  5. Vue 爬坑之路(九)—— 用正确的姿势封装组件

    迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...

  6. Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli vue ...

  7. Tinker爬坑之路

    目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...

  8. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  9. Android插件化-RePlugin项目集成与使用

    前言:前一段时间新开源了一种全面插件化的方案-- RePlugin,之前一种都在关注 DroidPlugin 并且很早也在项目中试用了,但最终没有投入到真正的生产环节,一方面是项目中没有特别需要插件化 ...

随机推荐

  1. EasyUI Resizable 可调整尺寸

    通过 $.fn.resizable.defaults 重写默认的 defaults. 用法 通过标记创建可调整尺寸(resizable)对象. <div class="easyui-r ...

  2. OPENSSL编程 (secure shell, ssh)

    很好的 OPENSSL编程 教程,名字就叫“OPENSSL编程” 它里面还有很多关于密码学的东西. http://www.pengshuo.me http://www.pengshuo.me/2014 ...

  3. golang 复制对象的正确做法

    需求 实际运用种,传参是一对象指针,现在如何最简便地复制一对象? 实现 坑:&*  先拿到值再指针? package main import ( "time" " ...

  4. rewrite or internal redirection cycle while processing "/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/jenkins/

    折腾了很久,跟nginx配置没有关系.最终是把php版本从7.1降到5.6才解决的,是跟tp3.2匹配的

  5. 使用scikit-learn 估计器分类

    本章的几个概念: 估计器(estimator) 用于分类.聚类和回归分析          转换器(transformer):用于数据预处理回来数据转换          流水线(pipeline): ...

  6. 6.3 Controllers -- Managing Dependencies Between Controllers

    1. 有时候,特别是当嵌套资源的时候,我们需要两个controllers之间的某种连接.让我们拿这个router当做例子: app/router.js var Router = Ember.Route ...

  7. 72. Edit Distance(编辑距离 动态规划)

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to  ...

  8. (ZT)谷歌大脑科学家 Caffe缔造者 贾扬清 微信讲座完整版

    一.讲座正文:大家好!我是贾扬清,目前在Google Brain,今天有幸受雷鸣师兄邀请来和大家聊聊Caffe.没有太多准备,所以讲的不好的地方还请大家谅解.我用的ppt基本上和我们在CVPR上要做的 ...

  9. hdu1700 Points on Cycle

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=1700 题目: Points on Cycle Time Limit: 1000/1000 MS ...

  10. 2017-2018-2 20165207 实验三《敏捷开发与XP实践》实验报告

    java 实验三 实验报告 实验内容 代码规范 不规范的代码可能妨碍阅读,在粘贴下来老师在云班课中设置的提交点一的代码之后,我首先使用了IDEA中Code选项卡的Reformat Code功能规范代码 ...