AndroidStudio配置dynamic-load-apk随笔
2015-11-20 08:52
489 查看
本文仅纪录配置实用的要点以及概述其实现机制,想完整的了解请移步
http://blog.csdn.net/singwhatiwanna/article/details/39937639
2 新建一个插件project,比如plugin,注意这里不能导入lib库方式,而是将host下面lib编译后生成的jar包导入,路径在lib库的build/intermediates/bundles中debug或者release的classes.jar,如果没有,请先运行一次host。 导入之后,我们在打包时并不能加这个jar打包,所以需要忽略这个jar,所以需要将其引用的jar改为Provided。不过这里存在一个问题,那就是如果plugin引用了多个jar包时,如果宿主里有同样jar的还好,如果没有该怎么办?(百度说可以单独改变某一个jar的scope属性,但是我没试过)另外如果你的使用的gradle版本不高,可以将其plugin设置为1.0.0,然后通过new
module-new jar/aar 方式导入aar,并将其单独provided即可(针对高版本会编译warning导致失败)aar位于lib库的build/outputs/arr中;修改plugin版本的的地方:android plugin Version一列
好了,至于plugin的那个jar忽略问题,如果有人知道怎么解决不吝赐教
好了后面就简单谈下其实现机制,其实并不是很复杂,细节可以看原文,这里我只概述下其实现机制;
如果你是看了作者一些列的文章的话,作者对于其加载apk的实现机制已经做了专门的叙述,只是没有说的透明;阅读例中宿主的代码, 你会发现宿主调用插件apk,唯一的限制在于需要用其自定义的manager启动DLIntent,然后你认真的看下其DLIntent的定向机制(setClass),就很容易发现,虽然最终还是走了默认的startActivity方式,通过系统启动新的activity,但所有加载的插件界面,仅有二种activity。这也是为什么要在宿主的mainfest中定义的原因(因为能通过默认的方式启动了),之后的一些细节就是对资源文件(包括so)的使用。
最后,这里,针对插件开发系列参考文章:
目前流行的二种插件app加载方式(二种没有太深入framework层的实现方式):
1 使用反射机制修改类加载器
2 使用代理的方式
第一种方式去加载时,原理是通过反射系统的类加载器实现动态的load apk,好处之一是你不需要管理插件activity的生命周期(和普通的activity基本一样),但是需要你预先在宿主apk里声明插件的activity,而由于调用的系统类加载器的大量方法,和系统耦合性很强,可能需要随着系统的升级而更新。
第二种方式,原理看名称就知道了,简而言之,所有插件activity在宿主眼中都是一个代理activity(即所有插件的activity的实现逻辑均有代理activity展现),你只需要在宿主中第一个约定好的代理activity即可,不足之处是插件的activity的生命周期完全有代理托管,实现起来想对复杂
同时以上二种方式加载,都会涉及到插件apk中资源的引用问题,一般来说二者都是通过反射系统的addAssert方法去动态添加资源,但同理,涉及到了系统的方法,总是会存在维护风险
参考资料: http://blog.csdn.net/lephones/article/details/40357935 第一种加载方式的使用说明 http://blog.csdn.net/singwhatiwanna/article/details/22597587 第二种方式的探究,已在github开源,即本文试用的 http://blog.csdn.net/jiangwei0910410003/article/details/48104455 对以上二种均有涉
https://github.com/houkx/android-pluginmgr 这个开源的应用算是比较有名了,上面的二种方式有所区别,主要是通过 大量反射+拦截欺骗 的方式实现动态加载 https://github.com/Qihoo360/DroidPlugin 360开源的一个比较成熟的动态加载技术框架,与以上不同之处在于,它一方面对插件的acitvity进行了代理,注意,这个代理是动态的,即不需要你对宿主的androidmainest.xml文件做任何修改,它的核心思想是对整个application进行了拦截并替换了所有的方法,同时也对插件中的activity生命周期进行了管理,算是目前为止改的很大的一种方式(可以参考http://blogs.360.cn/blog/proxydelegate-application/此文)
http://blog.csdn.net/singwhatiwanna/article/details/39937639
环境:android studio 1.5 Preview2 + win10 + github最新DL源码,其实gitcub上对于 其在android studio的编译已经做了描述,这里我仅对使用过程中遇到的问题做记录,另外360开源的的DroidPlugin也很不错,如果只是想拿来用的话,和配置dl没什么差别。
1 新建一个宿主project,比如Host(app),通过import module方式导入lib库(目录dynamic-load-apk-master\DynamicLoadApk\lib),打开project structure 可以看到app下面多了你导入的lib,选择app的dependencies,添加依赖库lib。 选择lib的dependencies,将其libs引用的jar改为Provided,默认是Compile(解决host和lib同时引导v4包冲突问题)2 新建一个插件project,比如plugin,注意这里不能导入lib库方式,而是将host下面lib编译后生成的jar包导入,路径在lib库的build/intermediates/bundles中debug或者release的classes.jar,如果没有,请先运行一次host。 导入之后,我们在打包时并不能加这个jar打包,所以需要忽略这个jar,所以需要将其引用的jar改为Provided。不过这里存在一个问题,那就是如果plugin引用了多个jar包时,如果宿主里有同样jar的还好,如果没有该怎么办?(百度说可以单独改变某一个jar的scope属性,但是我没试过)另外如果你的使用的gradle版本不高,可以将其plugin设置为1.0.0,然后通过new
module-new jar/aar 方式导入aar,并将其单独provided即可(针对高版本会编译warning导致失败)aar位于lib库的build/outputs/arr中;修改plugin版本的的地方:android plugin Version一列
好了,至于plugin的那个jar忽略问题,如果有人知道怎么解决不吝赐教
好了后面就简单谈下其实现机制,其实并不是很复杂,细节可以看原文,这里我只概述下其实现机制;
如果你是看了作者一些列的文章的话,作者对于其加载apk的实现机制已经做了专门的叙述,只是没有说的透明;阅读例中宿主的代码, 你会发现宿主调用插件apk,唯一的限制在于需要用其自定义的manager启动DLIntent,然后你认真的看下其DLIntent的定向机制(setClass),就很容易发现,虽然最终还是走了默认的startActivity方式,通过系统启动新的activity,但所有加载的插件界面,仅有二种activity。这也是为什么要在宿主的mainfest中定义的原因(因为能通过默认的方式启动了),之后的一些细节就是对资源文件(包括so)的使用。
最后,这里,针对插件开发系列参考文章:
目前流行的二种插件app加载方式(二种没有太深入framework层的实现方式):
1 使用反射机制修改类加载器
2 使用代理的方式
第一种方式去加载时,原理是通过反射系统的类加载器实现动态的load apk,好处之一是你不需要管理插件activity的生命周期(和普通的activity基本一样),但是需要你预先在宿主apk里声明插件的activity,而由于调用的系统类加载器的大量方法,和系统耦合性很强,可能需要随着系统的升级而更新。
第二种方式,原理看名称就知道了,简而言之,所有插件activity在宿主眼中都是一个代理activity(即所有插件的activity的实现逻辑均有代理activity展现),你只需要在宿主中第一个约定好的代理activity即可,不足之处是插件的activity的生命周期完全有代理托管,实现起来想对复杂
同时以上二种方式加载,都会涉及到插件apk中资源的引用问题,一般来说二者都是通过反射系统的addAssert方法去动态添加资源,但同理,涉及到了系统的方法,总是会存在维护风险
参考资料: http://blog.csdn.net/lephones/article/details/40357935 第一种加载方式的使用说明 http://blog.csdn.net/singwhatiwanna/article/details/22597587 第二种方式的探究,已在github开源,即本文试用的 http://blog.csdn.net/jiangwei0910410003/article/details/48104455 对以上二种均有涉
https://github.com/houkx/android-pluginmgr 这个开源的应用算是比较有名了,上面的二种方式有所区别,主要是通过 大量反射+拦截欺骗 的方式实现动态加载 https://github.com/Qihoo360/DroidPlugin 360开源的一个比较成熟的动态加载技术框架,与以上不同之处在于,它一方面对插件的acitvity进行了代理,注意,这个代理是动态的,即不需要你对宿主的androidmainest.xml文件做任何修改,它的核心思想是对整个application进行了拦截并替换了所有的方法,同时也对插件中的activity生命周期进行了管理,算是目前为止改的很大的一种方式(可以参考http://blogs.360.cn/blog/proxydelegate-application/此文)
相关文章推荐
- Android Activity加载Fragment的一般简易方法
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
- Android progressBar 自定义圆形旋转图片
- Android应用程序安装过程源代码分析
- android 屏幕分辨率
- Android JNI调用函数命名原则规范
- 【Android】 新建项目 "错误: 程序包R不存在" 的解决方法
- 怎样使android的view动画循环弹动
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android-AsyncTask初体验
- 使用AndFix进行Hot fix
- Android Layout的属性
- Android项目使用support v7时遇到的各种问题
- 【转】Android通过Wifi来调试你的应用
- android 回调接口学习(自定义Dialog 获取数据数据回调)
- Android中的文件操作
- Android JNI开发之NDK环境的搭建
- Android 开发之JNI学习笔记
- Android JNI学习之Concepts
- ExpandableListView(可展开的列表组件)的说明以及其用法