服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android框架RePlugin使用详解

Android框架RePlugin使用详解

2022-03-10 15:21wardenlzr Android

这篇文章给大家分享了Android 插件化框架 RePlugin使用心得,对此有兴趣的朋友参考学习下。

0.先附上一篇原理讲解

http://www.tuohang.net/article/230734.html

这应该算是给作者打的广告吧。如有涉及侵权,请通知我立刻删除。

1.应用场景

Android开发人员不多,又要求使用插件化开发的模式。(简单点讲就是自己需要写宿主APP,还有N多个插件需要开发)

如下图:

Android框架RePlugin使用详解

360官方给的Demo是宿主一个工程,插件一个工程,并且工程的build.gradle文件中添加宿主和插件对应所需要的依赖,多人开发时,每个人或多个人维护一个宿主工程或者插件工程,都没有什么问题,但是一个人需要同时维护宿主和多个插件时,来回切换工程调试以及打包就异常头疼了。。。

2.一个工程配置宿主和插件的所有依赖

2.1工程的build.gradle文件中添加

?
1
2
3
4
5
6
7
8
9
10
11
12
buildscript {
 ...
 dependencies {
  classpath 'com.android.tools.build:gradle:2.3.3'
  //插件化框架 宿主工程所需依赖
  classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.0'
   //插件化框架 插件工程所需依赖
  classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.0'
  ...
 }
 ...
}

2.2宿主app的build.gradle文件中添加

//replugin插件化框架,这一行建议就放在dependencies 的上面,千万不要放在android{...}的上面
apply plugin: 'replugin-host-gradle'

?
1
2
3
4
5
6
7
8
dependencies {
 compile fileTree(include: ['*.jar'], dir: 'libs')
 ...
 releaseCompile project(path: ':library的moudle名字', configuration: 'release')
   debugCompile project(path: ':library的moudle名字', configuration: 'debug')
 compile 'com.qihoo360.replugin:replugin-host-lib:2.2.0'
 ...
}

2.3插件moudle对应的build.gradle文件中添加

//replugin插件化框架,这一行建议就放在dependencies 的上面,千万不要放在android{...}的上面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
apply plugin: 'replugin-plugin-gradle'
repluginPluginConfig {
 pluginName = "你自己的插件名字"
 hostApplicationId = "宿主包名"
 hostAppLauncherActivity = "宿主包名.MainActivity"
}
 
dependencies {
 ...
 releaseCompile project(path: ':library的moudle名字', configuration: 'release')
 debugCompile project(path: ':library的moudle名字', configuration: 'debug')
 compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.0'
 ...
}

3.宿主及所有插件使用到的library,这里建议自己做成一个moudle,配置方法上面的代码理由了 (library的moudle名字)
如有依赖的冲突,在对应moudle中添加

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
android{
 ...
 configurations.all {
 resolutionStrategy.eachDependency { DependencyResolveDetails details ->
  def requested = details.requested
  if (requested.group == 'com.android.support') {
   if (!requested.name.startsWith("multidex")) {
    details.useVersion '25.3.1'//这里可根据个人需要改成自己想要的版本
   }
  }
 }
}
...
}

4.关于调试以及成品包。

调试时有几个moudle,就安装几个应用,调用的地方

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (!BuildConfig.DEBUG) {//非Debug,成品包
 if (RePlugin.isPluginInstalled("插件包名")) {
  //已安装
  Intent intentHasInstall = RePlugin.createIntent("插件包名" ,
    "插件包名.MainActivity");
  intentHasInstall.putExtras(bundle);
  RePlugin.startActivity(mContext, intentHasInstall);
  }else{//没有安装,自己写下载的代码}
}else {//debug模式
Intent intent1 = new Intent();
intent1.setComponent(new ComponentName("插件包名", "插件包名.MainActivity"));
intent1.putExtras(bundle);
startActivity(intent1);
}

5.关于FileProvider

5.1这个首先公用library的那个moudle要有一个公用的Utils,并且每个moudle(插件或宿主)都初始化此工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public final class Utils {
 private static Context context;
 /**
  * 初始化工具类
  *
  * @param context 上下文
  */
 public static void init(@NonNull final Context context) {
  Utils.context = context.getApplicationContext();
 }
 
 /**
  * 获取ApplicationContext
  *
  * @return ApplicationContext
  */
 public static Context getContext() {
  if (context != null) return context;
  throw new NullPointerException("请保证你已经初始化过!");
 }
}

5.2每个moudle(插件或宿主)的manifest文件中都添加

?
1
2
3
4
5
6
7
8
9
<provider
 android:name="android.support.v4.content.FileProvider"
 android:authorities="对应moudle的包名.fileProvider"
 android:grantUriPermissions="true"
 android:exported="false">
 <meta-data
  android:name="android.support.FILE_PROVIDER_PATHS"
  android:resource="@xml/file_paths" />
</provider>

需使用FileProvider时:以获取文件URI为例

File mTmpFile = new File("你自己的文件路径");
Uri uri= FileProvider.getUriForFile(Utils.getContext(), Utils.getContext().getPackageName() + ".fileProvider", mTmpFile);

Utils.getContext().getPackageName(),重点是这个方法;

a.debug时,获取的对应插件的包名,通过每个moudle的manifest配置中对应的fileProvider找到文件;

b.release时,Utils.getContext().getPackageName()获取的只会是宿主的fileProvider,这时自然可以通过宿主manifest配置对应的fileProvider找到文件;

原文链接:https://blog.csdn.net/qq_30878303/article/details/78860947

延伸 · 阅读

精彩推荐
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09