前一篇文章介绍了Android项目基于ARouter的组件化过程,其实大部分中小型项目只需要组件化就足够了,但是大型项目比如淘宝、微信、美团、钉钉、360手机助手等等,这些项目太大太复杂了,项目开发到后期编译一次要花费很多时间。在这样的背景下,插件化实现方式就诞生了。
本文的重点是记录RePlugin的使用,没有什么底层原理性的知识点,接下来就开始我们项目的插件化之旅吧。本篇文章的目标是将ft_login插件化,然后接入到宿主app中,能够从宿主工程的LoadingActivity跳转到插件工程中的LoginActivity。
下图是演示demo的目录结构

一、按RePlugin上介绍的来,先接入主程序。
1、在项目根目录的 build.gradle(注意:不是 app/build.gradle) 中添加 replugin-host-gradle 依赖:
buildscript {
dependencies {
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.3.4'
...
}
}
2、在 app/build.gradle 中应用 replugin-host-gradle 插件,并添加 replugin-host-lib 依赖:
defaultConfig {
//这里配置一定要跟包名一致
applicationId "com.example.test"
//插件化不需要分包
multiDexEnabled false
}
// ATTENTION!!! Must be PLACED AFTER "android{}" to read the applicationId
apply plugin: 'replugin-host-gradle'
/**
* 配置项均为可选配置,默认无需添加
* 更多可选配置项参见replugin-host-gradle的RepluginConfig类
* 可更改配置项参见 自动生成RePluginHostConfig.java
*/
repluginHostConfig {
/**
* 是否使用 AppCompat 库
* 不需要个性化配置时,无需添加
*/
useAppCompat = true
}
dependencies {
compile 'com.qihoo360.replugin:replugin-host-lib:2.3.4'
...
}
最后一步是MyApplicaiton要继承RePluginApplication,并在manifest中添加。
public class MyApplication extends RePluginApplication {
@Override
public void onCreate() {
super.onCreate();
}
}
二、插件工程接入RePlugin
子程序接入步骤
- 接入插件化框架
- 接入到主程序
参考官方文档,先接入插件化框架
1、在项目根目录的 build.gradle(注意:不是 app/build.gradle) 中添加 replugin-plugin-gradle 依赖:
buildscript {
dependencies {
classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.3.4'
...
}
}
2、在 app/build.gradle 中应用 replugin-plugin-gradle 插件,并添加 replugin-plugin-lib 依赖:
apply plugin: 'replugin-plugin-gradle'
repluginPluginConfig {
//当前插件的名字
pluginName = 'ft_login'
//当前插件要继承到哪个宿主工程中
hostApplicationId = 'com.example.test'
//宿主工程的启动activity
hostAppLauncherActivity = 'com.example.test.LoadingActivity'
}
dependencies {
implementation 'com.qihoo360.replugin:replugin-plugin-lib:2.3.4'
}
以上操作完成后再sync工程,可能会报错,是gradle版本的问题,报错之前的版本gradle tools版本是4.0.0,gradle版本是gradle-6.1.1,分别改成3.4.2和5.1.1就好了。
3、插件工程的Activity需要继承PluginActivity
public class LoginActivity extends PluginActivity {
......
}
4、打包插件工程,输入命令./gradlew :ft_login:assembleDebug
5、找到打包好的apk,然后复制到宿主工程特定的目录下


需要注意的是将apk复制到目录/main/assets/plugins下,文件名需要跟插件工程中定义的pluginName字段名保持一致。
宿主工程中的LoadingActivity很简单
package com.example.test;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.qihoo360.replugin.RePlugin;
public class LoadingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading_layout);
handler.sendEmptyMessageDelayed(1, 2000);
}
Handler handler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Intent intent = RePlugin.createIntent("ft_login", "com.example.ft_login.LoginActivity");
//相当于在宿主app主启动另外一个app中的activity,需要加这个参数
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
RePlugin.startActivity(LoadingActivity.this, intent);
finish();
}
};
private boolean hasLogin() {
return false;
}
@Override
public void onBackPressed() {
}
}
接着我满怀激动的心情来启动了app工程,很遗憾,报错了
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/localbroadcastmanager/content/LocalBroadcastManager;
at com.qihoo360.loader2.PmBase.callAppCreate(PmBase.java:656)
at com.qihoo360.loader2.PMF.callAppCreate(PMF.java:84)
at com.qihoo360.replugin.RePlugin$App.onCreate(RePlugin.java:1009)
at com.qihoo360.replugin.RePluginApplication.onCreate(RePluginApplication.java:74)
at com.example.test.MyApplication.onCreate(MyApplication.java:9)
只需要在宿主工程中引入:
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
以上就是插件化集成的过程,下一节我将带着大家一起来看下宿主和插件之间是如何通信的。