Android 插件开发框架之学习比较
2017-03-09 17:14
399 查看
最近学习了两种Android插件开发框架,他们使用了不同的方式来动态加载插件Apk,总体来说 dynamic-plugin-load框架比较实用。而instrument-plugin-load用一定的局限性,该框架声明可以在插件中启动Activity页面,但本人测试看是不行的,插件中启动Activity时出现错误,提示是否在AndroidManifest.xml中声明该activity。现附上楼主的AndroidStudio版结构介绍:
宿主app的assets/plugin/目录下
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项目地址链接相关文章推荐
- Android 插件框架 xCombine 开发思路简介
- android开发学习(二)——测试概念,junit测试框架, logcat
- WebService学习总结(5)——WebService常见开发框架比较
- Android开发框架/库学习,设计模式之策略模式
- Android 开发框架之okhttp 网络框架的学习
- Android 插件框架 xCombine 开发思路简介
- Android 学习之路和App开发框架
- WebService学习总结(5)——WebService常见开发框架比较
- 六种值得学习的android开发框架
- Android开发框架/库学习,设计模式之工厂模式
- Android比较全面的应用开发框架(涉及网络,数据库,缓存,下载管理等)
- Android插件开发框架 Android-Plugin-Framework
- 浅谈MTK平台下Android开发比较学习笔记
- WebService学习总结(5)——WebService常见开发框架比较
- Android 插件框架 xCombine 开发思路简介
- android 学习 -- 插件形开发,动态部署,消息模型
- Android 插件框架 xCombine 开发思路简介
- Android学习 - 移动web开发框架
- Android开发学习之路-插件安装、检查应用是否安装解决方案