如何看待阿里开源框架的dexposed框架

java(110)
文章来源:开源中国
原文链接:http://www.oschina.net/project/alibaba?sort=view&p=5
来自:IT大佬
阿里的开源项目很多,这也跟@淘宝正明的开源态度密不可分。有很多重量级的项目,例如LVS、Tengine,或者很有实践价值的中间件,今天小编为大家汇总了阿里开源的项目,快来看看吧!
服务框架 Dubbo
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
&JDBC连接池、监控组件 DruidDruid是一个JDBC组件,它包括三部分:&&
代理Driver,能够提供基于Filter-Chain模式的插件体系。
DruidDataSource 高效可管理的数据库连接池。&
SQLParser&
Java的JSON处理器 fastjsonfastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。
分布式文件系统 FastDFS
FastDFS是一个开源的分布式文件系统,她对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。&
淘宝Hadoop作业平台 宙斯Zeus
宙斯(zeus)是什么 宙斯是一个完整的Hadoop的作业平台 从Hadoop任务的调试运行到生产任务的周期调度 宙斯支持任务的整个生命周期。
淘宝分布式数据库 OceanBase
OceanBase是一个支持海量数据的高性能分布式数据库系统,实现了数千亿条记录、数百TB数据上的跨行跨表事务,由淘宝核心系统研发部、运维、DBA、广告、应用研发等部门共同完成。在设计和实现OceanBase的时候暂时摒弃了不紧急的DBMS的功能,例如临时表,视图(view),研发团队把有限的资源集中到关键点上,当前 OceanBase主要解决数据更新一致性、高性能的跨表读事务、范围查询、join、数据全量及增量dump、批量数据导入。
目前OceanBase已经应用于淘宝收藏夹,用于存储淘宝用户收藏条目和具体的商品、店铺信息,每天支持4~5千万的更新操作。等待上线的应用还包括CTU、SNS等,每天更新超过20亿,更新数据量超过2.5TB,并会逐步在淘宝内部推广。
分布式key/value存储系统 Tair
Tair是由淘宝网自主开发的Key/Value结构数据存储系统,在淘宝网有着大规模的应用。您在登录淘宝、查看商品详情页面或者在淘江湖和好友“捣浆糊”的时候,都在直接或间接地和Tair交互。
系统信息采集和监控工具 Tsar
Tsar是淘宝的采集工具,主要用来收集服务器的系统信息(如cpu,io,mem,tcp等)以及应用数据(如squid haproxy nginx等),tsar支持实时查看和历史查看,方便了解应用和服务器的信息!
它类似于sar,能监控和收集服务器和关键应用的信息,支持实时终端显示和集中式数据库存储查询,还能向Nagios发送报警信息。Tsar模块化的设计利于通过开发新模块来扩展新的功能,非常方便。
七天学会NodeJS
七天学会NodeJS是阿里巴巴国际站前端技术部编写的开源文档,用于学习 Node.js。
模块加载框架 SeaJSSea.JS 是一个遵循 CommonJS 规范的模块加载框架,可用来轻松愉悦地加载任意JavaScript模块。 SeaJS 支持的标准模块遵循 Modules/Wrappings 规范的 define 形式,可运行于 Web 浏览器以及 node.JS 等环境中。
分布式消息中间件 Metamorphosis
Metamorphosis (MetaQ) 是一个高性能、高可用、可扩展的分布式消息中间件,类似于LinkedIn的Kafka,具有消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景,在淘宝和支付宝有着广泛的应用,现已开源。
阿里巴巴分布式数据库同步系统 otter
otter 基于数据库增量日志解析,准实时同步到本机房或异地机房mysql/oracle数据库. 一个分布式数据库同步系统。
HTML5 互动游戏引擎 Hilo
Hilo 是阿里巴巴集团开发的一款HTML5跨终端游戏解决方案,ta可以帮助开发者快速创建HTML5游戏。&
JavaScript 模板引擎 Velocity.jsVelocity.js 是velocity模板语法的javascript实现。Velocity&是基于Java的模板引擎,广泛应用在阿里集 体各个子公司。Velocity模板适用于大量模板使用的场景,支持复杂的逻辑运算,包含 基本数据类型、变量赋值和函数等功能。Velocity.js 支持 Node.js 和浏览器环境。
Oracle数据迁移同步工具 yugong
yugong 是阿里巴巴推出的去Oracle数据迁移同步工具(全量+增量,目标支持MySQL/DRDS)08年左右,阿里巴巴开始尝试MySQL的相关研究,并开发了基于MySQL分库分表技术的相关产品Cobar/TDDL(目前为阿里云DRDS产品),解决了单机Oracle无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目因此而诞生,其要解决的目标就是帮助用户完成从Oracle数据迁移到MySQL上,完成去IOE的第一步。
自动化测试解决方案 Macaca
官方网站: 链接 Macaca是一套完整的自动化测试解决方案。 特性: 支持移动端和PC端;支持Native, Hybrid, H5 等多种应用类型;提供客户端工具和持续集成服务。
非侵入式运行期 AOP 框架 Dexposed
Dexposed 是阿里巴巴无线事业部第一个重量级Andorid 开源软件,基于 ROOT 社区著名开源项目&Xposed&改造剥离了 ROOT 部分,演化为服务于所在应用自身的 AOP 框架。它支撑了阿里大部分 App 的在线分钟级客户端 bugfix 和线上调试能力。
Dexposed 的 AOP 是实现了纯非侵入式,没有任何注释处理器,weaver 或者字节码重写程序。Dexposed 的集成非常简单,就像加载一个 JNI 库一样,只需要在初始化的时候插入一行代码。
Android 应用热修复工具 AndFixAndFix 是阿里巴巴开源的 Android 应用热修复工具,帮助 Anroid 开发者修复应用的线上问题。Andfix 是 &Android hot-fix& 的缩写。
AndFix 支持 Android 2.3 - 6.0,ARM 和 x86 架构,dalvik 运行时和 art 运行时。AndFix 的分支是.apatch 文件。
分布式SQL引擎 LealoneLealone 为&HBase&提供一个分布式SQL引擎,尝试将BigTable(HBase)和 RDBMS (H2数据库) 结合的项目。
php框架 WindFrameworkWind Framework是phpwind团队开发的一款php框架。2010年10月份开始投入开发,目前为止已经内部发行了四个版本(0.5,0.8,0.9,1.0)。它源自phpwind社区产品的一次名为&鹊桥&的重构计划。意在重新定义phpwind的架构层次开发模式,使其看起来更清晰,更易于扩展和二次开发。后来在一次讨论中重构计划被分为了两个部分进行。一部分为底层核心框架。另一部分为phpwind社区数据服务中心,插件组件机制。反向代理测试套件
Macaroon 是一个高效的反向代理测试套件,测试框架本身基于python2.7开发,方便跨平台移植;测试例使用格式化描述,做到编程语言无关性。使用 Macaroon能够简便快捷的完成测试场景的构造、线上失效案例的重建及被测软件(DUT)的功能、模块、协议一致性测试等。
基于 Node.js 的自动化持续集成 ReliableReliable&是分布式架构的持续集成系统,由&Macaca&团队的成员开发。适用于集成构建、集成构建等场景。她是典型的主从结构,分为&reliable-master&与&reliable-slave&两部分。
淘宝 React 框架 React Web淘宝前端团队开源项目React Web,通过与React Native一致的API构建Web应用。
跨平台移动开发工具 Weex日,阿里巴巴在Qcon大会上宣布开源跨平台移动开发工具Weex,Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持iOS、安卓、YunOS及Web等多端部署。
Java APNS开源库 apns4japns4j 是 Apple Push Notification Service 的 Java 实现!
淘宝Web服务器 TengineTengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
Web常用UI库 kissykissy 是淘宝一个开源的 JavaScript 库,包含的组件有:日历、图片放大镜、卡片切换、弹出窗口、输入建议等。
Bug管理系统 BugFreeBugFree - 借鉴微软公司软件研发理念、免费且开放源代码、基于Web的精简版Bug管理系统。
Nginx开发从入门到精通nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部原理,但是国内却没有一本关于这方面的书,源于此我们决定自己来写一本。本书的作者为淘宝核心系统服务器平台组的成员,本书写作的思路是从模块开发逐渐过渡到nginx原理剖析。书籍的内容会定期在这里更新,欢迎大家提出宝贵意见,不管是本书的内容问题,还是字词错误,都欢迎大家提交issue(章节标题的左侧有评注按钮),我们会及时的跟进。
消息中间件 RocketMQRocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:能够保证严格的消息顺序提供丰富的消息拉取模式高效的订阅者水平扩展能力实时的消息订阅机制亿级消息堆积能力Metaq3.0 版本改名,产品名称改为RocketMQ
分布式数据层 TDDL
淘宝根据自己的业务特点开发了TDDL(Taobao Distributed Data Layer 外号:头都大了 (C)_Ob)框架,主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制,它是一个基于集中式配置的 jdbc datasource实现,具有主备,读写分离,动态数据库配置等功能。
国产论坛系统 PHPWindPHPWind 论坛系统 是一套采用 php+mysql 数据库 方式运行并可生成 html 页面的全新且完善的强大系统。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱。
通用WEB框架 Webx
Webx是一个在阿里巴巴集团内部广泛使用的,层次化、模块化的一个Web框架。 Webx是基于经典MVC设计模式的WEB框架,推崇页面驱动和约定胜于配置的理念。 Webx是一个基于Spring的组件框架。组件是一个软件包,它可以被其它组件扩展,也可以扩展其它组件。利用这些特性,Webx不仅能够用来开发高度可定制的Web应用(这是它的主要功能),也能够用来帮助你开发高度可扩展的非WEB的应用。
分布式文件系统 TFSTFS(Taobao FileSystem)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,其设计目标是支持海量的非结构化数据。
目前,国内自主研发的文件系统可谓凤毛麟角。淘宝在这一领域做了有效的探索和实践,Taobao File System(TFS)作为淘宝内部使用的分布式文件系统,针对海量小文件的随机读写访问性能做了特殊优化,承载着淘宝主站所有图片、商品描述等数据存储。
分布式核心技术框架 FourinoneFourInOne(中文名字“四不像”)是一个四合一分布式计算框架。
异步文件上传组件 UploaderUploader是非常强大的异步文件上传组件,支持ajax、iframe、flash三套方案,实现浏览器的全兼容,调用非常简单,内置多套主题支持 和常用插件,比如验证、图片预览、进度条等,广泛应用于淘宝网,比如退款系统、爱逛街、二手、拍卖、我的淘宝、卖家中心、导购中心等。
异构数据源数据交换工具 DataX
DataX是一个让你方便的在异构数据源之间交换数据的离线同步框架/工具,实现了在任意的数据处理系统之间的数据交换,目前DataX在淘宝内部每天约有5000道同步任务分布在全天各个时段,平均每天同步数据量在2-3TB。
轻量级分布式数据访问层 CobarClient
Cobar Client是一个轻量级分布式数据访问(DAL)基于iBatis(已更名为MyBatis)和Spring框架实现。
多浏览器兼容性测试整体解决方案 F2etestF2etest 是一个面向前端、测试、产品等岗位的多浏览器兼容性测试整体解决方案。
http压力测试工具 httpsenderhttpsender是一款轻量级的http压力测试工具,由淘宝的测试工程师用Java语言开发完成。它可以指定并发连接数发送指定数目的请求,还可以自定义请求的header头。请求的URL支持通过正则表达式指定范围,同时也支持从文件随机或顺序读取。它还具备验证数据是否完整和错乱等较高级的功能。默认应用环境为Linux。
淘蝌蚪开源平台 taocodetaocode(淘蝌蚪)是淘宝网推出的开源平台。平台本身也是开源的。
阿里Redis缓存服务器 AliRedisAliRedis 是阿里巴巴运维团队基于 Redis 改造的缓存服务器,目前该项目尚未发布。&
binlog的增量订阅&消费组件 canalcanal 是阿里巴巴mysql数据库binlog的增量订阅&消费组件。
移动自动化测试平台 AthrunStorm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这个任务跑起来,并且按7 * 24小时运行起来,一旦中间一个worker 发生意外故障, 调度器立即分配一个新的worker替换这个失效的worker。因此,从应用的角度,JStorm 应用是一种遵守某种编程规范的分布式应用。从系统角度, JStorm一套类似MapReduce的调度系统。 从数据的角度, 是一套基于流水线的消息处理机制。实时计算现在是大数据领域中最火爆的一个方向,因为人们对数据的要求越来越高,实时性要求也越来越快,传统的Hadoop
Map Reduce,逐渐满足不了需求,因此在这个领域需求不断。
分布式计算系统 JStormStorm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这个任务跑起来,并且按7 * 24小时运行起来,一旦中间一个worker 发生意外故障, 调度器立即分配一个新的worker替换这个失效的worker。
因此,从应用的角度,JStorm 应用是一种遵守某种编程规范的分布式应用。从系统角度, JStorm一套类似MapReduce的调度系统。 从数据的角度, 是一套基于流水线的消息处理机制。实时计算现在是大数据领域中最火爆的一个方向,因为人们对数据的要求越来越高,实时性要求也越来越快,传统的Hadoop Map Reduce,逐渐满足不了需求,因此在这个领域需求不断。
关系型数据的分布式处理系统 CobarCobar是关系型数据的分布式处理系统,它可以在分布式的环境下像传统数据库一样为您提供海量数据服务。
淘宝的Linux系统 taolinux基于淘宝多年服务器优化积累, 内核优化经验。
nodejs-kissyKISSY&是淘宝网开发的一款轻巧灵活的JS框架,如今已经是1.1.7版本,并在淘宝网广泛应用,在浏览器端给我们带来更加清新的体验,今天让我们更进一步,我们 发起了nodejs-kissy 项目,你的 KISSY 程序可以无缝移植到服务器端了 。
Dubbo 文档镜像 dubbo-doc-static
dubbo-doc-static 是&Dubbo&的文档镜像。
自动化云测试平台 AutoManAutoMan的前身是tCommon和TAM(taobao-automan),经过对两者不断的优化和扩展,逐步形成现在一套完整的页面自动化平台, 意在提高测试人员的测试效率,测试质量,象踏上“风火轮”那样腾挪驰骋于整个测试过程。
在线分析查询系统 mdrillmdrill是由阿里妈妈开源的一套数据的软件,针对TB级数据量,能够仅用10台机器,达到秒级响应,数据能实时导入,可以对任意的维度进行组合与过滤。
&&&&mdrill作为数据在线分析处理软件,可以在几秒到几十秒的时间,分析百亿级别的任意组合维度的数据。
淘宝定制JVM TaobaoJVM淘宝有几万台Java应用服务器,上千名Java工程师、及上百个Java应用。为此,核心系统研发部专用计算组的工作之一是专注于OpenJDK的优化及定制,根据业务、应用特点及开发者需要,提供稳定,高效和深度定制的JVM版本:Taobao JVM。&
接口文档管理工具 RAP
RAP通过GUI工具帮助WEB工程师更高效的管理接口文档,同时通过分析接口结构自动生成Mock数据、校验真实接口的正确性,使接口文档成为开发流程中的强依赖。有了结构化的API数据,RAP可以做的更多,而我们可以避免更多重复劳动。
异步任务处理系统 TBSchedule由原来的项目taobao-pamirs-schedule 更名为 TBSchedule&分布式哈希表 FastDHTFastDHT 是一个高性能的分布式哈希系统 (DHT) ,使用&Berkeley DB&做数据存储,使用&libevent&做网络IO处理,提供 Java 版的客户端接口包。适合用来存储用户在线、会话等小数据量信息。
异步文件上传组件 KF/Uploader支持ajax、flash、iframe三方案,兼容所有浏览器。配置简单,支持伪属性配置(data-config=’{}’)和配置属性来配置ajax和flash上传方式,带有上传进度显示队列上传,批量上传等待中的文件支持中途取消上传支持上传验证,整合kissy的validation组件不错的扩展性,自由定制按钮和队列模板样式
自动化测试任务调度平台 TOAST
TOAST(Toast Open Automation System for Test) 是一淘广告技术测试团队开发的一套自动化测试任务调度平台。&
java表达式计算 QLExpressQLExpress 是一个轻量级的类java语法规则引擎,作为一个嵌入式规则引擎在业务系统中使用。让业务规则定义简便而不失灵活。让业务人员就可以定义业务规则。支持标准的JAVA语法,还可以支持自定义操作符号、操作符号重载、 函数定义、宏定义、数据延迟加载等。&
淘宝开放平台JAVA版SDK top4java容易维护扩展(不需要修改主类就可以 添加新的API支持)注入型解释器(依据不同的返回格式注入相应的解释器)集中管理请求参数与参数映射以运行时异常的方式来管理错误的响应使用泛型来做强类型编程多协议 扩展支持(REST, RPC, SOAP, etc)
Java 图片处理类库 SimpleImageSimpleImage是阿里巴巴的一个Java图片处理的类库,可以实现图片缩略、水印等处理。
性能分析工具 TProfilerTProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对象创建热点 线程状态分析等数据,为查找系统性能瓶颈提供数据支持。
代码评审工具 Tao-ReviewBoardReviewBoard是一款开源的代码review工具,包括服务器端程序(reveiwboard)和客户端命令行(RBTools)。用户可以通过RBTools的一些列命令在客户端提交request,但是使用和安装都有很多不便。Tao-ReviewBoard是淘宝开发的基于eclipse的reviewboard插件,能很好的解决安装和使用的问题。这个插件已经在淘宝使用近一年,现在工具开源了共享给大家。
基于Svg的图表组件库 KChartsKCharts是基于Svg的图表组件库,兼容IE6+等主流浏览器。基于淘宝js框架KISSY的图表组件库,包含折线图、曲线图、柱状图、散点图、饼图、地图等常用图表。采用kissy的模块加载器,实现按需加载,支持cdn动态合并。KCharts 基于RaphelJs开发,大量的html+css实现了基础grid,流畅的动画,丰富的demo,还有实用的图表在线生成器(Chart Generator),方便初学者实用。
模拟数据生成器 Mock.jsMock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。
表达式解析引擎 SimpleELSimple EL是一个表达式解析引擎。它将表达式解析分成四个部分:预处理、编译、缓存和执行。这四个步骤任意一部分都可以替换,类似设计模式中的Template Method。
GUI的WEB接口管理工具 Rigel Automation
RAP Rigel Automation Platform 是一个GUI的WEB接口管理工具。在RAP中,您可定义接口的URL、请求&响应细节格式等等。通过分析这些数据,RAP提供MOCK服务、测试服务等自动化工具。RAP同时提供大量企业级功能,帮助企业和团队高效的工作。
实时数据传输平台 TimeTunnelTimeTunnel(简称TT)是一个基于thrift通讯框架搭建的实时数据传输平台,具有高性能、实时性、顺序性、高可靠性、高可用性、可扩展性等特点。
tair-client-javatair-client-java 是淘宝&Tair&这个分布式 Key/Value 存储系统的 Java 客户端开发包。
Tair的java客户端使用纯java开发,底层使用mina&通信框架,接口简洁易用。经过生产环境的压力测试,稳定可靠。
富逻辑的模板引擎 xtemplate.jsxtemplate 是独立的富逻辑模板引擎,基于浏览器和 Node.js 的可扩展的模板引擎库。
xtemplate 支持异步控制和继承,包括逻辑表达式,自定义函数等等。
Nginx的TFS模块 nginx-tfsnginx-tfs 是 Nginx 的扩展模块用于访问淘宝的&TFS&文件系统。这个模块实现了TFS的客户端,为TFS提供了RESTful API。TFS的全称是Taobao File System,是淘宝开源的一个分布式文件系统。
redis的java客户端 Tedis
Tedis是另一个redis的java客户端,Tedis的目标是打造一个可在生产环境直接使用的高可用Redis解决方案。
数据中间层 nQuerynQuery 引擎是来自阿里的数据中间层,主要为应对大数据场景的在线查询的三大难题:长数据、宽数据、杂数据, 广泛参考 Big Query、Impala、 PL/SQL、MySQL 、PgSQL、ql.io 等,结合自身业务特点,自行精心 设计、实现的一套类SQL 语言(nSQL)及解析、执行引擎,它有着广泛的应用场景与很强的实用 价值,能对 *SQL 型数据库提供翻译与兼容,对K/V 数据如HBase、OTS 或其他通用的数据源, 它可以作为一个简洁强大的SQL 查询引擎,并以扩展SQL
的创新方式来支持数据JOIN, 结合 NodeJS 框架,完全可以提供统一的SQL接口的高并发、高性能的的在线查询服务,解耦前后端, 极大的降低大数据场景下产品开发复杂度。
持久配置中心 diamonddiamond 是持久配置中心,支持各种持久信息(比如各种规则,数据库配置等)的发布和订阅。
支持缓存线程池的ThreadLocal Transmittable ThreadLocal(TTL)在ThreadLocal的需求场景即是TTL的潜在需求场景,如果你的业务需要『在使用线程池等会缓存线程的组件情况下传递ThreadLocal』则是TTL目标场景。
代理服务器 AnyProxyAnyProxy 是一个基于 Node.js 的代理服务器。代理服务器是个中间人,站在了客户端和服务端中间,双方通信的每个比特,都会滴水不漏地经过它。它控制了完整的请求头、请求体、响应头、响应体,可以在客 户端与服务端都无感知的情况下介入处理所有的流程。只要代理服务器可以实现灵活配置,前端工程师们的奇葩需求就有出头之日了。
DSL语法解析器生成器 dropincc.java
一个简单、好用的语法解析器生成器;
专为java语言环境下,实施DSL方案而设计;
特点:使用纯java语法(Fluent Interface)制定用户的词法、语法规则;jdk1.6 compiler API动态编译为字节码;自动管理字节码、用户无需关心具体生成的解析器源码;专为DSL打造,相对与使用其它常见工具(javacc, antlr等)做DSL解析,代码量急剧下降;上手较为容易,让用户更加关注自身业务内容
需要jdk1.6或以上版本运行,无任何其它依赖
识别LL(*)语法
mysql 代理 myrelay
mysql的代理,支持如下特性:
采用事件驱动、异步、非阻塞的设计模式,性能优秀
采用mysql原生协议,对应用层透明
支持mysql读写分离
提供mysql连接池管理
支持mysql冗余、健康检查
提供mysql的查询日志,方便对应用层进行分析
支持mysql配置动态加载
nginx-http-sysguard
nginx-http-sysguard 是阿里巴巴开发的一个 Nginx 模块,用来保护运行 Nginx 服务器的系统负载和内存使用不会太高。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:246335次
积分:4120
积分:4120
排名:第6046名
原创:48篇
转载:773篇
评论:17条
(1)(25)(2)(1)(198)(280)(155)(92)(64)(12)(19)(1)关注微信公众号:“编码美丽”技术干货实时推荐,欢迎访问我的github:
今天我们来看一下阿里的一个开源框架Dexposed,关于这个框架网上已经有很多解析了,但是都是讲解原理,而且讲的不是很清楚,这里因为工作中的需要就研究了一下,所以这里就先讲解一下这个框架的原理,然后在通过一个例子来看看他如何使用,最后在用它来实现应用的热修复问题。
二、知识点准备
首先在讲解这个框架的时候,我们先来了解几个知识点:
1、关于之前的Xposed框架
我们在很早就知道了这个框架,本来想整理一下顺便说一下这个框架的,但是这个框架网上说的很多,而且也很详细,所以就不做太多的解析了,这里就大致说一下他的中心思想和核心原理。
通过进行设备root之后,替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。
那么这里就引出了一个问题,为什么要替换app_process程序呢?
关于app_process程序网上也有很多讲解了,他其实是一个程序,存放在system/bin目录下的,他的作用就是启动一个程序,比如我们熟知的zygote进程,还有所有app启动,app_process只要找到需要运行程序的main函数也就是入口函数,然后执行,他不仅能执行C/C++程序,也可以执行Java程序,其实在之前我们遇到过一个情况,就是想在Android中运行一个Java程序的jar,其实那个就是用的app_process命令启动的。运行的命令也很简单:
app_process [java-options] cmd-dir start-class-name [options]
我们可以查看他的源码app_main.cpp:
从app_process的main函数(在app_main.cpp里面)可以看出,app_process有两种启动方式:一种是init.rc里面的这种方式,这种方式将会以zygote模式启动com.android.internal.os.ZygoteInit,并将进程名称改为zygote;另外一种是以非zygote模拟启动com.android.internal.os.RuntimeInit,并调用它的main方法,main的最后会执行finishInit,finishInit是一个native方法,这个方法会调用app_process的onStarted方法,在onStarted里面将会调用真正要执行的class:
在这里不想介绍的太多,因为后面会说到Android的一个应用的启动过程的时候,再详细解析。这里我们知道一个点就是Android中的所有程序都是通过app_process命令启动,而且app_process命令还可以启动任何Java程序,比如我们用到的am命令,这个命令Java源码和shell源码位于:Android源码目录\frameworks\base\cmds\
我们可以查看他的java源码内部实现:
指定有一个入口函数main
然后再看看他shell源码:
看到了这里首先设置CLASSPATH变量,就是am.jar的路径,然后开始执行命令,命令中需要指定具体的类名。
这里我们也学会了如何在Android中执行一个jar文件啦。
那么从上面我们分析了app_process命令的作用,那么我们就知道了为什么Xposed框架需要替换app_process命令了:
首先在Android系统中,应用程序进程都是由Zygote进程孵化出来的,而Zygote进程是由Init进程启动的。Zygote进程在启动时会创建一个Dalvik虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的Dalvik虚拟机实例。这也是Xposed选择替换app_process的原因。
Zygote进程在启动的过程中,除了会创建一个Dalvik虚拟机实例之外,还会将Java运行时库加载到进程中来,以及注册一些Android核心类的JNI方法来前面创建的Dalvik虚拟机实例中去。注意,一个应用程序进程被Zygote进程孵化出来的时候,不仅会获得Zygote进程中的Dalvik虚拟机实例拷贝,还会与Zygote一起共享Java运行时库。这也就是可以将XposedBridge这个jar包加载到每一个Android应用程序中的原因。XposedBridge有一个私有的Native(JNI)方法hookMethodNative,这个方法也在app_process中使用。这个函数提供一个方法对象利用Java的Reflection机制来对内置方法覆写。
看到了吧,这就是Xposed框架选择app_proess作为入口的一个原因,因为这个入口有两个好处:
1》、一旦修改了,就可以修改了所有的app
2》、这里的时机是最早的,可以加载所有的东西
上面就简单的分析了一下Xposed框架的实现原理,这个是我们需要了解的第一个知识点。
2、修改非native方法为native方法
第二我们需要了解的知识点是,如何将Android中一个非native方法改成native的,并且可以将这个native方法指定成特定执行的函数。
关于这个知识点,我在之前的一篇文章:
这篇文章就很详细的讲解了我们如何修改系统的获取Mac地址的方法,原理很简单:
将系统的获取Mac地址的方法getMacAddress改成native的,然后指定nativeFunc为dvmResolveNativeMethod这个函数,这个函数是dvm提供的。其中dvmResolveNativeMethod调用了dvmLookupInternalNativeMethod和lookupSharedLibMethod来查找jni中注册的native函数。 dalvik最后将执行得到的java native函数.
通过上面的代码片段,我们了解到要对一个java函数进行hook需要步骤有
[1] 把修改method的属性修改成native
[2] 修改method的registersSize、insSize、nativeFunc、computeJniArgInfo
[3] RegisterNatives注册目标method的native函数
然后我们将系统获取Mac地址的方法getMacAddress和我们自己的一个函数做一次注册:
{“android/net/wifi/WifiInfo”,”getMacAddress”,”()Ljava/lang/S”,(void*)test}
那么这里的test函数就是我们自己想要做事的函数,可以返回任意值啦~~
这个知识点很重要,也是我们今天说的核心知识点
三、原理分析
分析完了上面的两个知识点,下面我们就来正式看看Dexposed框架的原理了,首先我们通过一张图来了解一下:
看到了吧,其实不是很复杂,主要分为Java层和Native层的,
第一、首先我们来分析一下Java层的DexposedBridge.java类
1、hookMethodNative方法:
这个方法是一个native类型的。
参数说明:
1)需要hook的方法对象
2)需要hook的方法所属的类
3)方法的slot值,关于这个slot的含义就是方法中局部变量存储的最小单位,一个Slot可以存放一个32位以内的数据类型.在Java程序编译为Class文件时,在方法的Code属性的max_locals数据项中确定了该方法所需要分配局部变量表的最大容量.
4)额外附加信息,比如我们需要hook方法的回调的对象,hook方法的返回类型,参数类型等信息,下面看到hookMethodNative方法的调用地方。
2、invokeSuperNative和invokeOriginalMethodNative方法
这两个方法也是native的,而且这两个方法比较好理解,就是执行需要hook方法的父类方法和原方法,因为我们在hook住一个方法的时候,肯定需要决定是否要调用父类方法还是原来的方法。
3、handleHookedMethod方法
这个方法是整个Dexposed框架Java层最核心的一个方法,这个方法就是用来替换我们需要hook的那个方法,具体如何替换的等下面说到native层再说。然后这个方法中做了三件事:
1、执行需要hook之前的所有回调方法beforeMethod
2、执行被hook的原生方法
3、执行需要hook之后的所有回调方法afterMethod
这个方法就是我们偷龙转凤的上层核心方法,同时在这里我们可以看到Dexposed框架还有一个好处就是AOP编程,关于AOP的概念就是面向切面编程,能够在我们需要拦截或者hook的一个方法之前或者之后能做些什么,JavaWeb中的Spring框架的一个核心就是AOP编程。
第二、上面分析完了DexposedBridge.java核心类,下面来看一下native层的实现 dexposed.cpp
1、initNative函数
这个初始化函数,主要获取我们在DexposedBridge.java中的一些方法对应的Method对象,后面会用到。
这个方法在JNI_OnLoad这个函数中调用的,我们知道这个函数是当so文件加载的时候就会被调用的。所以一般在这里做初始化操作。在这个方法中还做了哪些事呢?
还有dexposedInfo函数:
这个函数主要获取设备的一些信息,其实他对应的上层Java类就是SystemProperty.java类。
还有就是一个dexposedOnVmCreated函数:
这个函数干了两件事,一件事是获取需要hook的类对象,还有就是执行注册jni函数:
register_com_taobao_android_dexposed_DexposedBridge
这里注册了DexposedBridge.java中的hookMethodNative方法
2、com_taobao_android_dexposed_DexposedBridge_hookMethodNative函数
这个函数做了两件事:
1)、构造出DexposedHookInfo信息:
DexposedHookInfo的结构体信息定义在dexposed.h头文件中。就是需要hook的方法的信息
2)、将需要hook的方法改成native的,然后指定他的nativeFunc为dexposedCallHandler函数
3、dexposedCallHandler函数
这个方法首先获取我们刚刚构造的DexposedHookInfo信息
然后执行dexposedHandleHookedMethod方法
这个方法在initNative中初始化了,就是Java层中DexposedBridge.java中国的handleHookedMethod方法。
好了到这里我们就分析完了native层的代码,下面来总结一下:
1、首先在JNI_OnLoad函数中做了三件事:
1)获取设备信息dexposedInfo
2)注册JNI方法(com_taobao_android_dexposed_DexposedBridge_hookMethodNative)
3)初始化信息(获取Java层DexposedBridge中方法的Method对象)
2、然后在com_taobao_android_dexposed_DexposedBridge_hookMethodNative函数中主要做了两件事:
1)把Java层传递的信息构造成DexposedInfo信息
2)设置hook方法为native,并且指定nativeFunc函数
3、最后在执行第二步中的nativeFunc函数dexposedCallHandler函数中主要做了两件事:
1)获取刚刚构造的DexposedInfo信息
2)调用Java层DexposedBridge.java中的handleHookedMethod方法
所以我们在整个过程中可以看到,先通过JNI注册,从Java世界转到Native世界,然后在native世界中主要修改被hook方法的一些信息,然后在通过反射调用handleHookedMethod回到Java世界。
四、案例分析
1、Hook系统的方法
上面讲解完了Dexposed框架的实现原理,下面就通过例子来看看他的功能,这里我们选择Hook系统的Log类:
这里直接调用DexposedBridge.findAndHookMethod方法来实现的,注意这里做了一个设备的判断,如果是5.0+的话就hook程序本身的showLog方法,如果不是就hook系统的Log中的d方法。
最后一个参数可以看到,是一个回调,就是让我们来操作执行hook方法之前和之后的一些操作,这里在afterHookedMethod方法中将日志消息显示在屏幕中的TextView了,我们运行看一下效果:
这里我们可以成功的hook掉系统的方法。
那么分析到这里,需要总结一下:
1》、Xposed框架是需要root的,他的功能很全,能够hook掉系统方法,同时也可以hook掉其他应用的一些方法。
2》、Dexposed框架是不需要root的,但是他只能hook掉在自己的应用进程中的一些方法,其他应用进程是没办法hook的
所以我们可以对比一下这两个框架各有好处。一般做游戏外挂啥的,Dexposed是做不到的,而Xposed是可以做到的。
2、实现热修复功能
那么分析到这里我们还没有结束,还有我们今天一个重要的知识点,就是如何使用Dexposed框架实现应用热修复,所谓热修复,就是在应用发布之后,在某个模块出现问题,可以在线修复,不需要从新发版。这个之前其实弄过这快,用动态加载技术既可以做到,可以将每个模块做成动态加载的,然后如果哪个模块有问题的话,就在线更新修复之后的模块(一般是dex或者jar的形式),那么既然我们介绍了Dexposed框架,而且知道他能hook掉自己应用进程的方法,那么有一个思路,就是我们可以在线提供一个具备一定协议的模块,然后在这个模块中我们调用DexposedBridge的一些方法,然后hook掉我们应用中出现问题的模块方法,从而达到热修复功能。具体可以看下面一张图:
下面我们来通过一个例子看看,修复应用中一个展示对话框的功能:
首先看一下热修复工程PatchExample
就一个类,修复对话框类:
这个类也够简单吧,但是需要注意的是,每个修复类必须遵从IPatch协议接口。
下面我们编译这个修复包,然后将其copy到需要修复应用的cache目录下:
adb push PatchDemo.apk /sdcard/Android/data/com.taobao.dexposed/cache/
为什么是这个目录呢,下面来分析一下宿主应用中的热修复代码:
看到了吧,这里就这么调用就可以啦,真正我们在使用的时候,应该是从网上下载apk,然后保存到本地进行load操作的。
不过这里我们先不运行,我们先来看看Patch的源码:
这里有一个核心的方法,就是loadAllCallbacks方法:
这里使用了DexFile类,得到apk中的dex文件中所有的类,然后判断哪些类实现了IPatch协议。
最后在调用协议遵从的handlePatch方法。实现热修复功能。
好了分析完了代码之后,下面我们来运行程序看看:
不过我们在修复的过程中遇到了这个错误,其实这个错误我在之前介绍过讲解动态加载那篇文章中说到过,就是我们宿主工程中有了IPatch类的定义,动态修复模块中也引用了这个IPatch类,所以导致相同类被加载了两次的错误。这里我们需要修改的就是修复模块中不要引用宿主模块中已经有的jar,那么这里就有一个问题了,怎么才能编译出一个不包含指定jar的apk包呢?这个在Eclipse中我是没找到好的办法的,最后是ant脚本进行操作的,就是只要保证工程编译通过,同时不要将指定的jar包包含到apk中。具体如何使用ant脚本打包出一个apk,不了解的同学可以参看: 这里就不在做太多的介绍了。
我们修复了之后的apk,然后运行:
看到了吧,这里就修复成功啦~~
项目下载:
五、技术概要
好了到这里我们就讲解完了Dexposed这个框架,已经如何使用这个框架来实现应用的热修复功能。下面来总结一下知识点:
1、Dexposed框架是免root实现hook的,但是他也有局限性就是只能hook本应用中的一些方法。
2、Dexposed框架hook方法的原理,就是首先修改需要hook的方法为native方法,然后在设置nativeFunc值为我们需要处理的函数
然后这个函数在用反射机制调用上层的Java代码即可
3、Dexposed框架实现热修复,是基于hook技术,每个需要修复的模块都需要遵循一个协议,然后采用hook技术,去hook掉需要
修复的方法,实现替换功能。
总结Dexposed框架其实就一句话:
找到比较好的时机(JNI_OnLoad),修改hook方法,然后挂钩上层Java代码,实现偷龙转凤的功能
这里就介绍完了Dexposed框架的一些知识,在实际项目中我们还会遇到一些问题,但是这篇文章只是讲解了这个框架的实现原理,
在实际的使用过程中还是会遇到一些问题的,到时候在进行处理即可。
关注微信公众号,最新Android技术实时推送
转载请注明: &
or分享 (0)}

我要回帖

更多关于 阿里开源ui框架 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信