插件化RePlugin内置插件和外置插件(入门Demo)及遇到的
原文地址:
RePlugin github地址https://github.com/Qihoo360/RePlugin
demo地址:https://github.com/androidforme/RePluginDemo_1
plugin1.jar,plugin2.apk 在demo里;
先看效果
我图片gif制作 链接https://www.aconvert.com/cn/video/mp4-to-gif/ 其他的是黑的
一:主程序接入
第 1 步:添加 RePlugin Host Gradle 依赖
在项目根目录的 build.gradle(注意:不是 app/build.gradle) 中添加 replugin-host-gradle 依赖:
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.4'
}
坑点一:
按照 RePlugin 文档对 build.gradle 进行配置之后,进行 Gradle Sync,报错:
No signature of method: com.android.build.gradle.internal.scope.VariantScopeImpl.getMergeAssetsTask()
is applicable for argument types: () values: []
若出现上述错误: 用 classpath 'com.android.tools.build:gradle:3.1.0';其他的行不行要自己试
也可以看这篇文章https://www.jianshu.com/p/bc79ba98662f更具体说明;
第 2 步:添加 RePlugin Host Library 依赖
在 app/build.gradle 中应用 replugin-host-gradle 插件,并添加 replugin-host-lib 依赖:
android {
// ATTENTION!!! Must CONFIG this to accord with Gradle's standard, and avoid some error...
}
// ATTENTION!!! Must be PLACED AFTER "android{}" to read the applicationId
//一定要写在android {}后
apply plugin: 'replugin-host-gradle'
/**
* 配置项均为可选配置,默认无需添加
* 更多可选配置项参见replugin-host-gradle的RepluginConfig类
* 可更改配置项参见 自动生成RePluginHostConfig.java
*/
repluginHostConfig {
/**
* 是否使用 AppCompat 库
* 不需要个性化配置时,无需添加
*/
useAppCompat = true
/**
* 背景不透明的坑的数量
* 不需要个性化配置时,无需添加
*/
countNotTranslucentStandard = 6
countNotTranslucentSingleTop = 2
countNotTranslucentSingleTask = 3
countNotTranslucentSingleInstance = 2
}
dependencies {
implementation 'com.qihoo360.replugin:replugin-host-lib:2.2.4'
...
}
第 3 步:配置 Application 类
让工程的 Application 直接继承自 RePluginApplication。
如果您的工程已有Application类,则可以将基类切换到RePluginApplication即可。或者您也可以用“非继承式”接入。
public class MainApplication extends RePluginApplication {
}
既然声明了Application,自然还需要在AndroidManifest中配置这个Application。
<application
android:name=".MainApplication"
... />
坑点二:
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/content/LocalBroadcastManager;
主工程引用的 androidx,就一直报上面的错。目前还不知道如何兼容,我就对着demo改成一致了
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
implementation 'com.qihoo360.replugin:replugin-host-lib:2.2.4'
}
改成
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.qihoo360.replugin:replugin-host-lib:2.2.4'
}
二:插件接入
第 1 步:添加 RePlugin Plugin Gradle 依赖
在项目根目录的 build.gradle(注意:不是 app/build.gradle) 中添加 replugin-plugin-gradle 依赖:
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.4'
}
第 2 步:添加 RePlugin Plugin Library 依赖
在 app/build.gradle 中应用 replugin-plugin-gradle 插件,并添加 replugin-plugin-lib 依赖:
apply plugin: 'replugin-plugin-gradle'
dependencies {
compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.4'
...
}
三:插件别名 (我个人认为用别名比较方便。包名有点长)
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.qihoo360.plugin.name"
android:value="plugin1" />
<meta-data
android:name="com.qihoo360.plugin.version.ver"
android:value="99" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
坑点三:
不知道是我的问题还是上面,
<meta-data /> 一定要写在 <activity 前 ,也就是最前面; demo也是这样。 我开始写在后面,就是取不到别名;
三:内置插件
我们在assets中创建Directory,命名为plugins,将插件.jar放进去
四:外置插件方法
下载下载插件apk文件到sdcard中,然后加载;
PluginInfo info = RePlugin.install(Environment.getExternalStorageDirectory() + "/" + pluginName + ".apk");
一定要加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
测试,若没有apk地址;可以预先丢入sdcard中;// 模拟器目录 /mnt/shell/0下;
222.png
开启插件方法
private void startActivity(String pluginName, String className) {
//第一个参数是插件的包名,第二个参数是插件的Activity。
Intent intent = RePlugin.createIntent(pluginName, className);
if (!RePlugin.startActivity(MainActivity.this, intent)) {
Toast.makeText(getBaseContext(), "启动失败", Toast.LENGTH_LONG).show();
}
}