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



拆轮子之动态加载DynamicLoadApk

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

Android开源插件工具DL(dynamic-load-apk)学习心得

今天研究了一下由任玉刚提供的开源Android插件化工具,个人觉得挺不错的,下面分享下本人整理的一些事项。 原文引荐:APK动态加载框架DL解析 http://blog.csdn.net/singw...
  • shizhesx
  • shizhesx
  • 2015年07月07日 15:19
  • 1322

插件化-360的DroidPlugin与RePlugin研究及集成

Android插件化:从入门到放弃- http://blog.csdn.net/smallspot/article/details/52221049 RePlugin接入指南- https://gi...
  • ShareUs
  • ShareUs
  • 2017年07月05日 16:39
  • 1663

dynamic-load-apk(android模块化,热更新,插件化)

  • 2016年12月30日 10:47
  • 13.02MB
  • 下载

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

示例 收益 1. 可以进行增量更新。小哥写了个bug,怎么办?用增量更新就可以了。很高端吧。 2. 可以减小包得大小。 3. 可以分组件开发。 方案调研...
  • u011319826
  • u011319826
  • 2015年11月02日 16:03
  • 741

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

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

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

singwhatiwanna/dynamic-load-apk https://github.com/singwhatiwanna/dynamic-load-apk DL : ...
  • wds1181977
  • wds1181977
  • 2016年06月17日 16:13
  • 1035

A Novel Fingertip Design for Slip Detection Under Dynamic Load Conditions

  • 2015年05月04日 19:40
  • 1.55MB
  • 下载

关于dynamic-load插件式开发

dynamic-load插件式开发可以访问没有安装的APK中的类,也就是APK无需安装就可以被打开。具体原理有相关文档参考  http://blog.csdn.net/singwhatiwanna/a...
  • u012303938
  • u012303938
  • 2015年05月21日 15:25
  • 950

How to Load a Java Native/Dynamic Library (DLL)

(MS Windows) How to Load a Java Native/Dynamic Library (DLL) There are several ways to make it pos...
  • u013543480
  • u013543480
  • 2014年11月12日 11:38
  • 812
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AndroidStudio配置dynamic-load-apk随笔
举报原因:
原因补充:

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