Android 插件开发框架之学习比较

最近学习了两种Android插件开发框架,他们使用了不同的方式来动态加载插件Apk,总体来说 dynamic-plugin-load框架比较实用。而instrument-plugin-load用一定的局限性,该框架声明可以在插件中启动Activity页面,但本人测试看是不行的,插件中启动Activity时出现错误,提示是否在AndroidManifest.xml中声明该activity。现附上楼主的AndroidStudio版结构介绍:


AndroidStudio清晰结构图

dynamic-plugin-load

该框架能够动态加载插件Apk,并可以实现插件中跳转Activity,前提是插件Apk中的Activity页面要继承DLBasePluginActivity或DLBasePluginFragmentActivity,启动方式需要使用DLIntent,并在宿主app中声明两种代理Activity或者service:
    宿主AndroidManifest.xml声明:
        <!--dynamic-load-lib配置-->
        <activity android:name="com.penck.dynamic.DLProxyActivity">
            <intent-filter>
                <action android:name="com.ryg.dynamicload.proxy.activity.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.penck.dynamic.DLProxyFragmentActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.ryg.dynamicload.proxy.fragmentactivity.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

     插件Activity启动方式:
        DLIntent dlIntent = new DLIntent(getPackageName(), SecondActivity.class);
        startPluginActivityForResult(dlIntent,0);

instrument-plugin-load

该框架也可以动态加载插件Apk,但在测试时只能启动主Activity,不能在插件中启动另一个Activity,
显示错误是没有在宿主app Manifest.xml中声明activity。使用该框架也需要在宿主AndroidManifest.xml
声明:
    宿主AndroidManifest.xml声明:
     <activity android:name="com.penck.manager.DynamicActivity" />

plugin-apk和plugin-apk2

两个测试用的插件Apk,在工程主目录运行命令gradlew.bat assembleRelease,就会自动生成apk文件并发到
宿主app的assets/plugin/目录下

library

该module仅仅为了测试宿主app从插件apk中获取信息,并另附两种gradle打jar包的方法:
//将library打包成jar包 在工程根目录目录执行 gradlew.bat library:makeJar即可
task makeJar(type: Copy) {
    delete 'build/libs/library.jar'
    from('build/intermediates/bundles/release/')
    into('build/libs/')
    include('classes.jar')
    rename('classes.jar', 'library.jar')
}

makeJar.dependsOn(build)

//使用terminal在工程根目录目录执行中输入gradlew library:jarRelease 同样可以生成
//两种方法生成的jar包中包含的资源不一样,大小也不一样,可以打开看看
//library:jarRelease方法包含了Android资源在里面
android.libraryVariants.all { variant ->
    def name = variant.buildType.name
    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
        return; // Skip debug builds.
    }
    def task = project.tasks.create "jar${name.capitalize()}", Jar
    task.dependsOn variant.javaCompile
    task.from variant.javaCompile.destinationDir
    artifacts.add('archives', task);
}

Demo


这里写图片描述

GitHub

GitHub项目地址链接

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值