我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android插件化之RePlugin项目怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android插件化之RePlugin项目怎么用

这篇文章主要为大家展示了“Android插件化之RePlugin项目怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android插件化之RePlugin项目怎么用”这篇文章吧。

1.什么是RePlugin?

在Android开发领域,有关插件化的讨论一直热度不减。目前市面上的插件化方案虽然很多,但多数只能实现某些功能的插件化,距离开发者的预期尚有相当差距。对此,在近期GMTC全球移动技术大会上,360手机卫士主程序架构负责人张炅轩宣布,360的插件化框架RePlugin已经可以实现“全面插件化”,同时具有出色的稳定性和灵活性,可适用于各种类型的应用上。
“RePlugin预计7月份开源,这将是我们献给安卓世界最好的礼物。”360如是说。

2.RePlugin有什么用?

RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件化方案,由360手机卫士的RePlugin Team研发,也是业内首个提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。

3.RePlugin官方介绍

其主要优势有:

  1. 极其灵活:主程序无需升级(无需在Manifest中预埋组件),即可支持新增的四大组件,甚至全新的插件

  2. 非常稳定:Hook点仅有一处(ClassLoader),无任何Binder Hook!如此可做到其崩溃率仅为“万分之一”,并完美兼容市面上近乎所有的Android ROM

  3. 特性丰富:支持近乎所有在“单品”开发时的特性。包括静态Receiver、Task-Affinity坑位、自定义Theme、进程坑位、AppCompat、DataBinding等

  4. 易于集成:无论插件还是主程序,只需“数行”就能完成接入

  5. 管理成熟:拥有成熟稳定的“插件管理方案”,支持插件安装、升级、卸载、版本管理,甚至包括进程通讯、协议版本、安全校验等

  6. 数亿支撑:有360手机卫士庞大的数亿用户做支撑,三年多的残酷验证,确保App用到的方案是最稳定、最适合使用的

一、集成主工程

在项目根目录的 build.gradle 下添加 RePlugin Host Gradle 依赖:

buildscript {  repositories {    jcenter()  }  dependencies {    classpath 'com.android.tools.build:gradle:2.3.3'    // 1、添加RePlugin Host Gradle依赖    classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1'  }}

在 app/build.gradle 下添加 RePlugin Host Library 依赖(为了更清晰的表示出代码添加的位置,将原有代码也一并贴出):
apply plugin: 'com.android.application'

android {  compileSdkVersion 26  buildToolsVersion "26.0.1"  defaultConfig {    applicationId "cn.codingblock.repluginstudy"    minSdkVersion 21    targetSdkVersion 26    versionCode 1    versionName "1.0"    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"  }  buildTypes {    release {      minifyEnabled false      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'    }  }}apply plugin: 'replugin-host-gradle'// 集成 RePlugin 添加的配置// 集成 RePlugin 添加的配置repluginHostConfig {  useAppCompat = true // 如果项目需要支持 AppComat,则需要将此配置置为 true  // 如果应用需要个性化配置坑位数量,则需要添加以下代码进行配置//  countNotTranslucentStandard = 6//  countNotTranslucentSingleTop = 2//  countNotTranslucentSingleTask = 3//  countNotTranslucentSingleInstance = 2}dependencies {  compile fileTree(dir: 'libs', include: ['*.jar'])  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {    exclude group: 'com.android.support', module: 'support-annotations'  })  compile 'com.android.support:appcompat-v7:26.+'  compile 'com.android.support.constraint:constraint-layout:1.0.2'  compile 'com.qihoo360.replugin:replugin-host-lib:2.2.1' // 集成 RePlugin 添加的配置  testCompile 'junit:junit:4.12'}

以上代码有三点需要注意:

  1. 需要将 apply plugin: 'replugin-host-gradle' 放在 android {...} 之后。

  2. 如果项目需要支持 AppComat,则需要将 repluginHostConfig 的 userAppCompat 置为 true。

  3. 如果应用需要个性化配置坑位数量,则需要在 repluginHostConfig 中添加以下代码进行配置:

countNotTranslucentStandard = 6countNotTranslucentSingleTop = 2countNotTranslucentSingleTask = 3countNotTranslucentSingleInstance = 2

让工程的 Application 直接继承自 RePluginApplication:

public class MyApplication extends RePluginApplication { }

当然,同时不要忘了在 AndroidManifest 对 MyApplication 的相关配置。

说明:有时候由于项目原有结构的需要,我们可能不能直接使用继承 RePluginApplication 的方式,这个问题看来 RePlugin 开发者也想到了,所以还特地多了一种选择,下面是项目的 Application 不继承 RePluginApplication 的方式:

public class MyApplication extends Application {  @Override  protected void attachBaseContext(Context base) {    super.attachBaseContext(base);    RePlugin.App.attachBaseContext(this);  }  @Override  public void onCreate() {    super.onCreate();    RePlugin.App.onCreate();  }  @Override  public void onLowMemory() {    super.onLowMemory();    RePlugin.App.onLowMemory();  }  @Override  public void onTrimMemory(int level) {    super.onTrimMemory(level);    RePlugin.App.onTrimMemory(level);  }  @Override  public void onConfigurationChanged(Configuration newConfig) {    super.onConfigurationChanged(newConfig);    RePlugin.App.onConfigurationChanged(newConfig);  }}

二、集成插件

新建一个工程做为插件APP,这里为了方便起见,直接在主工程中新建了一个 Module。

同集成主工程类似,在根目录的 build.gradle 添加 RePlugin Plugin Gradle 依赖(若是单独创建插件工程,则不需要添加注释1下面的代码):

buildscript {  repositories {    jcenter()  }  dependencies {    classpath 'com.android.tools.build:gradle:2.3.3'    // 1、添加RePlugin Host Gradle依赖(主工程用)    classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1'    // 2、添加RePlugin Plugin Gradle依赖(插件工程用)    classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.1'  }}

在 app/build.gradle 中添加 replugin-plugin-gradle 插件和 replugin-plugin-lib 依赖:

apply plugin: 'com.android.application'android {  ...}apply plugin: 'replugin-plugin-gradle' // 集成 RePlugin 添加的配置dependencies {  compile fileTree(dir: 'libs', include: ['*.jar'])  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {    exclude group: 'com.android.support', module: 'support-annotations'  })  compile 'com.android.support:appcompat-v7:26.+'  compile 'com.android.support.constraint:constraint-layout:1.0.2'  compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' // 集成 RePlugin 添加的配置  testCompile 'junit:junit:4.12'}

三、管理插件

RePlugin 对插件定义两种方式一种是外置插件、一种是内置插件。

  1. 外置插件:即从网络下载或者从SD卡中获得的,以 .apk 结尾。

  2. 内置插件:内置于 APP 之中,并随 APP 一并发版,需要将插件 apk 改成 .jar 结尾放入主程序的assets/plugins目录。

(一)外置插件的安装(升级)、启动、卸载

安装插件:

PluginInfo pluginInfo = RePlugin.install(Environment.getExternalStorageDirectory().getPath().toString() + "/plugin1.apk");System.out.println(pluginInfo);

同时别忘了添加文件读写的权限。 输出日下:

复制代码 代码如下:


10-30 16:10:23.769 20280-20280/cn.codingblock.repluginstudy I/System.out: PInfo { <cn.codingblock.plugin1:1(4)> [APK] [DEX_EXTRACTED] processes=[] js={"pkgname":"cn.codingblock.plugin1","name":"cn.codingblock.plugin1","low":10,"high":10,"ver":1,"verv":2814792716779521,"path":"\/data\/user\/0\/cn.codingblock.repluginstudy\/app_p_a\/-347346251.jar","type":11,"frm_ver":4} dex=/data/data/cn.codingblock.repluginstudy/app_p_od/-347346251.dex nlib=/data/data/cn.codingblock.repluginstudy/app_p_n/-347346251 }

安装成功了! (升级插件也是用 install() 方法,不可降级,同本版可覆盖安装)

启动插件

先来看一下 RePlugin.java 中启动插件相关的源码

public static Intent createIntent(String pluginName, String cls) {  Intent in = new Intent();  in.setComponent(createComponentName(pluginName, cls));  return in;}public static boolean startActivity(Context context, Intent intent) {  // TODO 先用旧的开启Activity方案,以后再优化  ComponentName cn = intent.getComponent();  if (cn == null) {    // TODO 需要支持Action方案    return false;  }  String plugin = cn.getPackageName();  String cls = cn.getClassName();  return Factory.startActivityWithNoInjectCN(context, intent, plugin, cls, IPluginManager.PROCESS_AUTO);}

根据 RePlugin 的 startActivity() 和 createIntent() 方法注释中的示例可知,启动插件需要先用插件的名字和目标Activity的全路径创建一个 Intent,然后调用 RePlugin.startActviity() 启动即可:

Intent intent = RePlugin.createIntent("Plugin1", "cn.codingblock.plugin1.MainActivity");if (!RePlugin.startActivity(MainActivity.this, intent)) {  Toast.makeText(mContext, "启动失败", Toast.LENGTH_LONG).show();}

点击按钮,输出如下:

10-30 16:21:02.464 20280-20280/cn.codingblock.repluginstudy D/RePlugin.ws001: start activity: intent=Intent { cmp=Plugin1/cn.codingblock.plugin1.MainActivity } plugin=Plugin1 activity=cn.codingblock.plugin1.MainActivity process=-214748364810-30 16:21:02.464 20280-20280/cn.codingblock.repluginstudy D/RePlugin.ws001: start activity: intent=Intent { cmp=Plugin1/cn.codingblock.plugin1.MainActivity } plugin=Plugin1 activity=cn.codingblock.plugin1.MainActivity process=-2147483648 download=true10-30 16:21:02.464 20280-20280/cn.codingblock.repluginstudy D/RePlugin.ws001: plugin=Plugin1 not found, start download ...10-30 16:21:02.469 20280-20280/cn.codingblock.repluginstudy D/RePlugin.ws001: isNeedToDownload(): V5 file not exists. Plugin = Plugin1

启动失败了!(插件名称确实是:Plugin1,而不是 plugin1 )

把 ==createIntent() 方法的第一参数换成插件的包名 cn.codingblock.plugin1 ==试一试,居然可以了。

但是,注释总不会这样赤裸裸的坑我们吧!

卸载插件

RePlugin.uninstall("Plugin1");

点击卸载,输入如下:

10-30 16:31:21.988 5006-5006/cn.codingblock.repluginstudy D/RePlugin.ws001: MP.pluginUninstall ... pluginName=Plugin110-30 16:31:21.988 5006-5006/cn.codingblock.repluginstudy D/RePlugin.ws001: Not installed. pluginName=Plugin1

没卸载成功?哈哈,这个简单,原套路把参数换成包名,果然可以了:

10-30 16:41:46.179 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: MP.pluginUninstall ... pluginName=cn.codingblock.plugin110-30 16:41:46.202 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: sendIntent pr=cn.codingblock.repluginstudy intent=Intent { act=ACTION_UNINSTALL_PLUGIN (has extras) }10-30 16:41:46.203 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: Clear plugin cache. pn=cn.codingblock.plugin110-30 16:41:46.204 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: removeInfo plugin table: info=PInfo { <cn.codingblock.plugin1:1(4)> [APK] processes=[] js={"pkgname":"cn.codingblock.plugin1","name":"cn.codingblock.plugin1","low":10,"high":10,"ver":1,"verv":2814792716779521,"path":"\/data\/user\/0\/cn.codingblock.repluginstudy\/app_p_a\/-347346251.jar","type":11,"frm_ver":4,"used":true} dex=/data/user/0/cn.codingblock.repluginstudy/app_p_od/-347346251.dex nlib=/data/user/0/cn.codingblock.repluginstudy/app_p_n/-347346251 } rc=true10-30 16:41:46.204 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: cached filename: cn.codingblock.plugin1 -> null10-30 16:41:46.275 10193-10263/cn.codingblock.repluginstudy V/RenderScript: 0xb34e8000 Launching thread(s), CPUs 4

启动插件那里毕竟在官方教程里面找不到,但是 Plugin.uninstall() 方法传入插件名即可这可是官方文档说的,这次不会是官方文档和源码注释合起伙来坑我们把? 经过多次试验后,有个有趣的发现:对于启动插件创建 Intent 的createIntent() 方法和 卸载插件的 RePlugin.uninstall() 方法,如果项目是使用继承 RePluginApplication 方式的话,参数传包名才生效;如果不是继承的方式传插件名才生效!(本人是在一款小米3手机上试验的,由于并没有广泛测试,所以不保证其他手机也是这个套路)这真是奇了葩了!

卸载插件时有一点需要注意:如果插件正在运行,则不会立即卸载插件,而是将卸载诉求记录下来。直到所有“正在使用插件”的进程结束并重启后才会生效。(引自官方说明)

(二)内置插件

添加内置插件非常简单,首先在主工程的 assets 目录下创建一个 plugins 文件夹,然后将要作为插件的 apk 后缀名改成 .jar 并放入到新建的 plugins 文件夹下,剩下的事情就不用管了,交给 RePlugin 即可,也就说,框架会自动加载插件。

  1. 内置插件无需开发者安装,启动方式和外置插件一致,但不可删除。

  2. 内置插件可通过 RePlugin.install() 升级(需要先将升级包下载好),升级后等同于外置插件。

以上是“Android插件化之RePlugin项目怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android插件化之RePlugin项目怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android插件化之RePlugin项目怎么用

这篇文章主要为大家展示了“Android插件化之RePlugin项目怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android插件化之RePlugin项目怎么用”这篇文章吧。1.什么是R
2023-05-30

Maven Web项目怎么使用Cargo插件实现自动化部署

这篇文章主要讲解了“Maven Web项目怎么使用Cargo插件实现自动化部署”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Maven Web项目怎么使用Cargo插件实现自动化部署”吧!M
2023-07-05

vue项目中怎么使用pinyin转换插件

今天小编给大家分享一下vue项目中怎么使用pinyin转换插件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用pinyin
2023-06-29

使用Composer插件来优化项目依赖管理的技巧

如何使用Composer插件来管理项目依赖引言:在现代软件开发中,依赖管理是一个关键的任务。随着项目越来越复杂,可能会涉及到许多不同的库和框架。为了更好地管理这些依赖项,Composer成为了许多开发人员首选的工具。除了Composer本身
使用Composer插件来优化项目依赖管理的技巧
2023-12-26

jQuery插件之artDialog怎么使用

要使用artDialog插件,你需要先引入jQuery库和artDialog插件的JS和CSS文件。1. 首先,在你的HTML页面中引入jQuery库:```html```2. 接下来,引入artDialog插件的JS和CSS文件:```h
2023-09-15

.net之validator插件怎么使用

要使用.NET的Validator插件,您需要遵循以下步骤:首先,确保您已经在您的项目中引用了合适的Validator插件。常见的.NET Validator插件包括`jQuery Validation`、`unobtrusive jQue
2023-10-26

Android项目中Manifest.xml文件有什么用

Android项目中Manifest.xml文件有什么用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Android 中Manifest.xml文件每一个And
2023-05-31

IDEA插件Statistic怎么实现快速分辨烂项目

这篇“IDEA插件Statistic怎么实现快速分辨烂项目”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“IDEA插件Stat
2023-06-28

ContentProvider怎么在Android项目中使用

ContentProvider怎么在Android项目中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、概念及说明ContentProvider定义:内容提供者是一个An
2023-05-31

listfragment怎么在Android项目中使用

本篇文章给大家分享的是有关listfragment怎么在Android项目中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、fragment简介我对fragment的理解
2023-05-31

ViewDragHelper怎么在Android项目中使用

本篇文章为大家展示了 ViewDragHelper怎么在Android项目中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ViewDragHelper是support.v4下提供的用于处理拖拽滑
2023-05-30

怎么使用Android Studio开发Gradle插件

这篇文章主要介绍了怎么使用Android Studio开发Gradle插件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。插件类型Gradle的插件一般有这么几种:一种是直接在
2023-05-30

怎么将so文件导入到Android Studio项目

今天就跟大家聊聊有关怎么将so文件导入到Android Studio项目,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、采用最简单直接的方式导入s0文件:在app下新建jniLib
2023-05-30

AIDL文件怎么在Android Studio项目中创建

AIDL文件怎么在Android Studio项目中创建?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Android系统中,跨进程通信是非常普遍的事情,它用到了Binde
2023-05-31

Android 项目怎么使用RecyclerView实现一个点击事件

这篇文章给大家介绍Android 项目怎么使用RecyclerView实现一个点击事件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述随着Android L版本的发布,RecyclerView已经逐渐地取代了Li
2023-05-31

Flex代码格式化插件怎么用

这篇文章主要为大家展示了“Flex代码格式化插件怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Flex代码格式化插件怎么用”这篇文章吧。Flex代码格式化工具在对Flex进行编码的时候,如
2023-06-17

怎么进行WordPress插件开发之创建、停用、删除插件

这篇文章主要介绍了怎么进行WordPress插件开发之创建、停用、删除插件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。插件存放目录wp-content/plugins创建一
2023-06-06

用 Node.js 原生插件点亮你的项目:性能优化、稳定性提升

用 Node.js 原生插件点亮你的项目,性能优化、稳定性提升。Node.js 原生插件可以帮助你显著提升项目性能,并增强项目的稳定性,本文将为你介绍如何使用 Node.js 原生插件,以及在实际项目中如何使用它们来优化性能和提升稳定性。
用 Node.js 原生插件点亮你的项目:性能优化、稳定性提升
2024-02-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录