关闭

AndroidStudio配置dynamic-load-apk随笔

200人阅读 评论(0) 收藏 举报
分类:

本文仅纪录配置实用的要点以及概述其实现机制,想完整的了解请移步

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/此文)



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1863次
    • 积分:58
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档