AndroidStudio配置dynamic-load-apk随笔

原创 2015年11月20日 08:52:28

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

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 插件化(一)] DynamicLoadApk的用法

1 简介Android大型项目中为了减小apk的体积,可以采用插件化的方法,即一些不常用的功能独立成插件,当用户需要的使用的时候再从服务器上下载回来,动态加载。这样就避免了为了满足所有用户需求而把功能...

Android studio 导入另外一个项目作为依赖包问题集锦!!!

本篇文章主要用来记录导入项目作为依赖的问题集锦!!  昨天导师给了个任务,就是把AS的一个项目导入到另外一个项目中作为library,跟之前把github上的开源项目导入到工程中作为依赖是一样...

Android DynamicLoadApk 开源插件开发项目代码剖析

目前的代码的目录结构是: 1、com.ryg.dynamicload.internal 2、com.ryg.dynamicload.service 3、com.ryg.dynamicload 4、co...

拆轮子之动态加载DynamicLoadApk

本篇文章demo地址动态加载是什么应用在运行的时候通过加载一些本地不存在的可执行文件实现一些特定的功能,Android中动态加载的核心思想是动态调用外部的Dex文件,极端的情况下,Android AP...

Android 插件平台技术 <一> 基本介绍和dynamic-load-apk介绍

示例 收益 1. 可以进行增量更新。小哥写了个bug,怎么办?用增量更新就可以了。很高端吧。 2. 可以减小包得大小。 3. 可以分组件开发。 方案调研...

dynamic-load-apk动态加载框架 无需安装apk可由宿主调起

singwhatiwanna/dynamic-load-apk https://github.com/singwhatiwanna/dynamic-load-apk DL : ...

Apk插件化,基于Dynamic-load-apk进行的上层封装

本框架是建立在 Dynamic-load-apk进行的上层封装。增加插件动态加载到libs目录和针对模块Service的注入.源码地址:ApkDynamicFramework。插件化框架简介 插件化是...

Unable to load dynamic library '/usr/lib64/php/modules/json.so'

[root@slave modules]# php -m PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AndroidStudio配置dynamic-load-apk随笔
举报原因:
原因补充:

(最多只允许输入30个字)