Flutter 学习之旅

插件化RePlugin内置插件和外置插件(入门Demo)及遇到的

2019-09-22  本文已影响0人  王多鱼2

原文地址:
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/ 其他的是黑的

451a0-qgp1k.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放进去

111.png

四:外置插件方法

下载下载插件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();
        }
    }
上一篇下一篇

猜你喜欢

热点阅读