360 RePlugin 初探
大概
在项目整合的过程中,要使用到插件化,听说360的RePlugin 还不错,所以就按照文档学习了一下,在此记录一下里面的坑。
项目地址:https://github.com/Qihoo360/RePlugin
首先,我们需要Replugin有一个简单的认识,它是一个框架,你开发的app可以作为插件直接安装到宿主app中,直接完美运行。而这个插件可以随时安装和卸载,非常方便。对于需要频繁更新的app或者使用频率比较低的模块,可以使用RePlugin,做到及时更新和用时加载。而且它的文档看上去还比较清晰,而且都是中文的,这个国内的人应该都比较喜欢。
所以我们需要提取两个重量级的概念:宿主APP和插件APP。
宿主APP主要是个壳子,用来作为插件app运行的容器
而插件APP可以是我们开发的一个个模块,然后你把模块扔到宿主app中安装,解压,然后就可以用其中的业务了。
配置
新建项目,项目根目录build.gradle中配置如下信息:版本随时查看官网
buildscript {ext.kotlin_version = '1.3.20'repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.1.4'classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"//这个是用于生成宿主app的gradle插件classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.4'//这个是用于生成插件app的gradle插件classpath "com.qihoo360.replugin:replugin-plugin-gradle:2.2.4"// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}
宿主APP
我们现在将app module作为宿主app,因此需要将app build.gradle做如下配置:
android {.....
}//启用宿主插件
apply plugin: 'replugin-host-gradle'repluginHostConfig {/*** 是否使用 AppCompat 库* 不需要个性化配置时,无需添加*/useAppCompat = true/*** 背景不透明的坑的数量* 不需要个性化配置时,无需添加*/countNotTranslucentStandard = 6countNotTranslucentSingleTop = 2countNotTranslucentSingleTask = 3countNotTranslucentSingleInstance = 2
}dependencies {//.... 其他配置//引用relugin-host-lib 宿主 implementation 'com.qihoo360.replugin:replugin-host-lib:2.2.4'}
此时需要配置repluginHostConfig,宿主配置,抄一下即可。但是 apply plugin: 'replugin-host-gradle'
的位置必须要在android{}
模块下面,这是Replugin必须的,至于为什么,官方wiki中描述为 防止出现无法读取applicationId,导致生成的坑位出现异常
。
然后配置Application,有两种方式:
public class MainApplication extends RePluginApplication {}
或者:
public class MainApplication extends Application {@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);RePlugin.App.attachBaseContext(this);....}@Overridepublic void onCreate() {super.onCreate();RePlugin.App.onCreate();....}@Overridepublic void onLowMemory() {super.onLowMemory();/* Not need to be called if your application's minSdkVersion > = 14 */RePlugin.App.onLowMemory();....}@Overridepublic void onTrimMemory(int level) {super.onTrimMemory(level);/* Not need to be called if your application's minSdkVersion > = 14 */RePlugin.App.onTrimMemory(level);....}@Overridepublic void onConfigurationChanged(Configuration config) {super.onConfigurationChanged(config);/* Not need to be called if your application's minSdkVersion > = 14 */RePlugin.App.onConfigurationChanged(config);....}
}
build 之后,我这边报了一个错误:
No signature of method: com.android.build.gradle.internal.scope.VariantScopeImpl.getMergeAssetsTask()
is applicable for argument types: () values: []
查了资料,是说我的gradle版本存在问题,这个应该是比较尴尬的问题了,也是比较头疼的问题了。解决方案基本如下,强制规定gradle版本:
//更改gradle版本classpath 'com.android.tools.build:gradle:3.1.4'//gradle/wrapper/gradle-wrapper.properties 下更改distributionUrl路径 distributionUrl=https://services.gradle.org/distributions/gradle-4.4-all.zip
编译通过之后,即可安装,成为了宿主app。
插件APP
我们在项目中新建一个module oneplugin作为子app,作为插件App。在oneplugin的build中需要配置一下插件。
android {defaultConfig {applicationId "com.xing.oneplugin"//....}
}dependencies {//.... 其他依赖// 用于插件的replugin-plugin-libimplementation 'com.qihoo360.replugin:replugin-plugin-lib:2.2.4'
}//这个和宿主的不一样
//应用到插件中的
//也需要用到android{}配置下面
apply plugin: 'replugin-plugin-gradle'//插件配置
repluginPluginConfig {//插件名pluginName = "plugin1"//宿主app的包名hostApplicationId = "com.xing.pluginlearn"//宿主app的启动activityhostAppLauncherActivity = "com.xing.pluginlearn.MainActivity"}
然后先尝试将oneplugin安装一下,得到如下图:
然后将oneplugin打包apk出来
。
然后我的问题就出现这里:
我先选择了oneplugin模块,尝试使用build --> Build Bundle(s)/ APK(s) --> Build APK(s)
打包之后,但是在接下来的操作中,一直没有运行成功,后来检查中发现,原来这种打包方法,一直打的是app module的包,而我们需要oneplugin包应该怎么打呢? 有两种方法:
- 直接使用gradle命令
gradlew :oneplugin:assembleRelease
然后可以在oneplugin\build\outputs\apk\release
获取到oneplugin release版本
- 选择Build Variants 选择release版本,然后点击运行,其实可以在相同的路径下找到release版本包的:
宿主&插件安装
获取到chajianapp之后,需要将它导入手机内存卡中(这次是最简单的模式,默认从内存卡中安装),现在来修改宿主app代码:
主界面如下:
对应的三个方法分别为:
//安装插件private fun loadPlugin() {//安装插件 ///sdcard/oneplugin-debug.apk 是插件路径pluginInfo = RePlugin.install("/sdcard/oneplugin-debug.apk")if(pluginInfo != null) {//预加载插件RePlugin.preload(pluginInfo)Toast.makeText(this,"install success", Toast.LENGTH_LONG).show()}else{Toast.makeText(this, "uninstall !!!", Toast.LENGTH_LONG).show()}}//启动插件fun startActivityForPlugin(view:View) {val intent = Intent()//参数一: 我插件包的包名//参数二: 我插件包里面需要启动的类intent.component = ComponentName("com.xing.oneplugin","com.xing.oneplugin.MainActivity")RePlugin.startActivity(this, intent)}// 卸载插件fun unInstall(view:View) { // 此处pugin1 是我定义插件包里面build.gradle repluginPluginConfig#pluginNameval result = RePlugin.uninstall("plugin1")Log.i("TAG","uninstall result : $result" )}
然后我们看图:
最终,我们完成了此次的插件化加载。按照教程来说并不是很难,主要是有些坑比较坑爹,这一次也初步完成了RePlugin初次探究,接下来的时间里面,我们会深入探讨一下RePlugin深层次的用法。
项目的练习地址为:https://github.com/Microhx/PluginLearn
360 RePlugin 初探相关推荐
- 360 Replugin运行配置(一)
主程序接入Replugin 1. 添加Replugin Host Gradle依赖 在项目根目录里的build.gradle(不是app/build.gradle)中添加replugin-host-g ...
- 360 RePlugin插件化-项目接入
RePlugin是一套完整的.稳定的.适合全面使用的,占坑类插件化方案,由360手机卫士的RePlugin Team研发,也是业内首个提出"全面插件化"(全面特性.全面兼容.全面使 ...
- 10分钟快速集成360 RePlugin
1.下载官网demo https://github.com/Qihoo360/RePlugin/tree/master 2.创建宿主程序 host (1)build.gradl (Project) ...
- 360手机卫士插件化RePlugin今日开源,官方全面解读
作者:张炅轩,360手机卫士·客户端技术专家 写在前面 "RePlugin将在6月底开源,这将是我们献给安卓世界最好的礼物."当我们宣布这一消息时,心中的激动,无以言表.是的,三年 ...
- 【原创】360购物小蜜的背后:探推荐引擎初探
360购物小蜜的背后:探推荐引擎初探 作者:jxy (360电商技术组) 相信经常上网的小伙伴,已经习惯了网站为大家做出的各种个性化推荐:京东会推荐你喜欢的电子设备,淘宝会推荐你爱吃的零食,爱奇艺为你 ...
- android 360replugin,360插件框架RePlugin的坑
6月30号360新开源了一个插件开发框架RePlugin,然而文档不全,根据360的文档你做出来的项目一编译就是一大堆错误,因为很多需要配置的东西在360的插件开发文档里根本就没有,我在这里记录一下给 ...
- Android自定义View初探(二)——仿360垃圾清理
明天就是五一劳动节了,在这里先祝各位程序猿劳动节快乐,别在加班了! 自从尝试过写自定义View(Android自定义View初探(一)--饼图)之后,每当看到别人的应用时,总是在想别人的实现方式,或许 ...
- 360 java插件设置_360插件化方案RePlugin初体验
前天跟朋友聊天提到他们要做个跟360插件化方案类似的框架,领导让他们先了解一下360的实现思路,我也就跟着尝试了一下. RePlugin 是一套完整的.稳定的.适合全面使用的,占坑类插件化方案,由36 ...
- 360私有云平台Elasticsearch服务初探
Elasticsearch Elasticsearch 是一款基于Apache Lucene框架构建的开源的.分布式的.可扩展的.(准)实时的文档存储和搜索引擎.在提供搜索服务以及日志分析方面已经日趋 ...
- 360度全景VR摄像机初探
本文结合OpenGLES的知识,在IOS平台上对于VR全景视屏的制作原理做了初步的探索. 源码地址:点这里
最新文章
- 创业计划书模板(周鸿祎口述)
- AI时代的GitHub,这个陆奇看好的方向,终于有人做了
- 学python的心得体会-Python学习心得
- linux常用命令以及相关说明
- 使用 mock 数据在本地运行 SAP Fiori Elements 应用的工作原理
- bzoj 1015 并查集
- Why is processing a sorted array faster than an unsorted array?
- 企业战略咨询方法:学习SWOT分析
- python表格写操作单元格合并
- 2016年事记与感悟
- linux下LAMP环境的搭配
- Node on Mac 初步
- gmoj 6842. 【2020.11.5提高组模拟】淘淘蓝蓝之扮猪吃愉悦
- 事务故障、介质故障、系统故障恢复方法及区别
- python逆向切片理解
- 模拟电路设计(39)---一文搞懂直流电源EMI滤波器
- 【自动驾驶摸爬滚打路】自动驾驶仿真软件SCANeR 001初相识
- Re23:读论文 How Does NLP Benefit Legal System: A Summary of Legal Artificial Intelligence
- 1.ffmpge的移植
- MySQL中针对SQL语句优化
热门文章
- php如何打包成apk,windows下PHP批量生成打包android程序APK
- Excel VBA函数和过程调用方法总结(跨文件调用函数和过程)
- 辐射定标、辐射校正、大气校正、正射校正概念
- [lammps教程]OVITO绘制原子应力云图
- access建立er图_关于ER图的快速生成 | 学步园
- 图解TCPIP 学习笔记(一)
- 《普林斯顿微积分读本》 第二章 三角学回顾
- oracle同音字模糊查询,已释甲骨文会意字研究.pdf
- 泰文Unicode编码表及排版规则
- 「Font」- 设置 Fallback 字体(如果字体 A 中不存在某个字符,则从字体 B 中加载该字符) @20210212