360插件化Replugin爬坑之路
前言
继上次爬完了热修复的坑位,中途爬了各种各样的坑。今天我们来说说插件化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代码”。只需两步即可:
- 将APK改名为:[插件名].jar
- 放入主程序的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爬坑之路的更多相关文章
- 关于360插件化Replugin Activity动态修改父类的字节码操作
近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find c ...
- Vue 爬坑之路(十二)—— vue-cli 3.x 搭建项目
Vue Cli 3 官方文档:https://cli.vuejs.org/zh/guide/ 一.安装 @vue/cli 更新到 3.x 之后,vue-cli 的包名从 vue-cli 改成了 @vu ...
- Android 全面插件化 RePlugin 流程与源码解析
转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...
- Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求
Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...
- Vue 爬坑之路(九)—— 用正确的姿势封装组件
迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...
- Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli vue ...
- Tinker爬坑之路
目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- Android插件化-RePlugin项目集成与使用
前言:前一段时间新开源了一种全面插件化的方案-- RePlugin,之前一种都在关注 DroidPlugin 并且很早也在项目中试用了,但最终没有投入到真正的生产环节,一方面是项目中没有特别需要插件化 ...
随机推荐
- Spark checkpoint机制简述
本文主要简述spark checkpoint机制,快速把握checkpoint机制的来龙去脉,至于源码可以参考我的下一篇文章. 1.Spark core的checkpoint 1)为什么checkpo ...
- PAT 1080 Graduate Admission[排序][难]
1080 Graduate Admission(30 分) It is said that in 2011, there are about 100 graduate schools ready to ...
- (2)R中的数据类型和数据结构
R中的数据结构主要面向<线性代数>中的一些概念,如向量.矩阵等.值得注意的是,R中其实没有简单数据(数值型.逻辑型.字符型等),对于简单类型会自动看做长度为1的向量.比如: > b= ...
- java基础知识面试题(41-95)
41.日期和时间:- 如何取得年月日.小时分钟秒?- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?- 如何取得某月的最后一天?- 如何格式化日期?答:问题1:创建java.util.Cal ...
- Java游戏服务器成长之路——你好,Mongo
关于mongo的思考 第一阶段的弱联网游戏已基本完成,截至今天下午,测试也基本差不多了,前端还有一些小bug需要优化,接下来会接入小米,360,百度,腾讯等平台,然后推广一波,年前公司还能赚一笔,而我 ...
- python16_day38【flask】
一.简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预 ...
- 全自动照片美化软件Photolemur mac特别版
今天小编为大家带来的是世界上首个支持全自动照片美化的软件Photolemur mac特别版.Photolemur中文特别版采用了全新的人工智能AI系统,它能够全自动智能的对您的照片进行曝光.亮度.降噪 ...
- http之post和get请求的区别
GET请求 GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 ...
- Java 和 Python 解析动态 key 的 JSON 数据
一.概述 解析JSON过程中,什么情况都可能遇到.遇到特殊的情况,不会怎么办?肯定不是设计的问题,一定是你的姿势不对. 有这样一种JSON需要解析: { "b3444533f6544&quo ...
- QML类型说明-ParallelAnimation
ParallelAnimation ImportStatement: import QtQuick2.2 Inherits: Animation DetailedDescription S ...