面向切面编程AOP(Xposed,Dexposed,日志自动埋点框架),面向对象编程OOP,面向接口interface编程

本文详细介绍了面向切面编程(AOP)和面向对象编程(OOP)的概念及其应用场景,对比了两者之间的区别与联系,并深入探讨了AOP在Android平台上的实现方式,包括动态代理技术和非侵入式编程框架Dexposed。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

> AOP,OOP,interface
 1.AOP是Aspect Oriented Programming的缩写,中译文为面向切向编程。
 2.OOP,即ObjectOriented Programming,面向对象编程。
 3.接口interface,面向接口的编程方式是面向对象设计的一个原则。

  面向接口编程与面向实现编程。面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。
  OOP和AOP都是方法论。我记得在刚学习C++的时候,最难学的并不是C++的语法,而是C++所代表的那种看问题的方法,即OOP。同样,今天在AOP中,我发现其难度并不在利用AOP干活,而是从AOP的角度来看待问题,设计解决方法。这就是为什么我特意强调AOP是一种方法论的原因!
  在OOP的世界中,问题或者功能都被划分到一个一个的模块里边。每个模块专心干自己的事情,模块之间通过设计好的接口交互。OOP的精髓是把功能或问题模块化,每个模块处理自己的家务事。但在现实世界中,并不是所有问题都能完美得划分到模块中。

面向切面(AOP)原理是动态代理。实现AOP依赖的技术:JDK动态代理。在运行时,动态地将代码切入到类的指定方
法、指定位置上的编程思想就是面向切面的编程。从技术上来说,AOP基本上是通过代理机制实现的。
 静态代理和动态代理本质区别:你是否需要修改源代码(不包含测试类),就可以控制代理内容的变化。
 静态代理:程序写好之后,你想修改代理过程,就必须修改源代码。

动态代理:程序写好后,你更改代理过程。只需要修改代理对象(分身)。

-- AOP面向切面编程,实际上就是通过预编译或者动态代理技术在不修改源代码的情况下给原来的程序统一添加功能的一种技术。我们看几个关键词:
  第一个是“动态代理技术”,这个就是Spring Aop实现底层技术;
  第二个“不修改源代码”,这个就是Aop最关键的地方,也就是我们平时所说的非入侵性;
  第三个“添加功能”,不改变原有的源代码,为程序添加功能。

-- Xposed,Dexposed(AOP框架)

无侵入的运行期AOP框架Dexposed- https://github.com/alibaba/dexposed
Xposed框架实现- https://github.com/rovo89/Xposed

  基于ROOT社区著名开源项目Xposed改造剥离了ROOT部分,演化为服务于所在应用自身的AOP框架。它支撑了阿里大部分App的在线分钟级客户端bugfix和线上调试能力。无侵入运行期AOP框架Dexposed,该框架基于AOP思想。
  Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器,编织器或者字节码重写器。Dexposed实现的hooking,不仅可以hook应用中的自定义函数,也可以hook应用中调用的Android框架的函数。
  AOP(Aspect Oriented Programming),也就是面向方面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  AOP一般应用在日志记录,性能统计,安全控制,事务处理,异常处理等方面,它的主要意图是将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
  Dexposed支持从Android2.3到4.4(除了3.0)的所有dalvid运行时arm架构的设备,稳定性已经经过实践检验。
-- Dexposed典型的使用场景:
1.AOP编程
2.插桩(例如测试,性能监控等)
3.在线热更新,修复严重的,紧急的或者安全性的bug
4.SDK hooking以提供更好的开发体验

 基于AOP和AspectJ的日志自动埋点方法、统计app的一些日志 android上使用aspectj在编译期更改日志类的字节码达到相似目的;android的AOP框架打日志;安卓的日志类
(android.util.Log)只提供日志输出功能,并无提供日志过滤、文件记录等常用功能.
深入理解Android之AOP(AspectJ)- https://blog.youkuaiyun.com/innost/article/details/49387395
AspectJ- http://www.eclipse.org/aspectj/ 
  Spring Aop的底层技术使用了动态代理。AOP核心调用过程,通过调用AOP代理类,开始一个一个调用后面的(前置)通知/拦截器链条,完成之后在调用目标方法,最后回来的时候
接着调用(后置、结束)通知/拦截器链条。
  jdk动态代理、cglib动态代理。

> AOP框架
徒手撸框架--实现Aop- https://segmentfault.com/a/1190000013029652
方便的打印函数调用和耗时日志,Method call logging based on dexposed- https://github.com/promeG/XLog
A lightweight android logger support auto tag, file logging and show logs on screen- https://github.com/allenz8512/zlog
Jake Wharton写的Gradle插件,下载和管理Android SDK- https://github.com/JakeWharton/sdk-manager-plugin

-- Android ASM自动埋点方案实践- https://www.jianshu.com/p/9039a3e46dbc
Android字节码插件,编译期间动态修改代码,改造添加全埋点日志采集功能模块,对常见控件进行监听处理- https://github.com/JieYuShi/Luffy
  Google官方在Android Gradle的1.5.0 版本以后提供了 Transfrom API, 允许第三方 Plugin 在打包 dex 文件之前的编译过程中操作 .class 文件,我们做的就是实现Transform进行.class文件遍历拿到所有方法,修改完成对原文件进行替换。
  通过Transform提供的api可以遍历所有文件,但是要实现Transform的遍历操作,得通过Gradle插件来实现。
  编写Gradle插件可能需要一点Goovy知识,具体编写直接用java语言写也可以,Goovy是完全兼容java的,只截取插件入口部分实现PluginEntry.groovy。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值