Android AOP(二):AspectJ在Android中实现Aop

Android AOP 三剑客:APT AspectJ Javassist 概述 AOP三剑客各自作用的位置 APT 注解处理器(Java5 中的Annotation Processing Tool),注解现在已经比较常见,使用广泛,可以为我们提供准确的切入点。教程参见 代表框架:DataBinding、Dagger2、EventBus3、DBFlow、AndroidAnnotation等 AspectJ主要任务是在编译期注入代码 代表框架:Hugo(Jak... 阅读详情

AspectJ

AspectJ实际上是对AOP编程思想的一个实践,当然,除了AspectJ以外,还有很多其它的AOP实现,例如ASMDex,但目前最好、最方便的,依然是AspectJ。

AOP的用处非常广,从Spring到Android,各个地方都有使用,特别是在后端,Spring中已经使用的非常方便了,而且功能非常强大,但是在Android中,AspectJ的实现是略阉割的版本,并不是所有功能都支持,但对于一般的客户端开发来说,已经完全足够用了。

在Android上集成AspectJ实际上是比较复杂的,不是一句话就能compile,但是,鄙司已经给大家把这个问题解决了,大家现在直接使用这个SDK就可以很方便的在Android Studio中使用AspectJ了。Github地址如下:

https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx

另外一个比较成功的使用AOP的库是Jake大神的Hugo:

https://github.com/JakeWharton/hugo

AOP 能做什么?

持久化
性能监控
数据校验
缓存
…

1.引入 AspectJ

app/build.grade加入以下配置项,app和library配置相同:

import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main

apply plugin: 'com.android.library'

android {
    compileSdkVersion 26



    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }



}

repositories {
    jcenter()
    mavenCentral()
}

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'org.aspectj:aspectjtools:1.8.9'
        // 如果是android library 要加上
        classpath 'org.aspectj:aspectjweaver:1.8.9'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'org.aspectj:aspectjrt:1.8.9'
//    compile 'com.android.support:appcompat-v7:27.1.1'
}

android.libraryVariants.all { variant ->
    JavaCompile javaCompile = variant.javaCompile
    javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.8",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", android.bootClasspath.join(
                File.pathSeparator)]

        MessageHandler handler = new MessageHandler(true)
        new Main().run(args, handler)

        def log = project.logger
        for (IMessage message : handler.getMessages(null, true)) {
            switch (message.getKind()) {
                case IMessage.ABORT:
                case IMessage.ERROR:
                case IMessage.FAIL:
                    log.error message.message, message.thrown
                    break
                case IMessage.WARNING:
                case IMessage.INFO:
                    log.info message.message, message.thrown
                    break
                case IMessage.DEBUG:
                    log.debug message.message, message.thrown
                    break
            }
        }
    }
}

2.AspectJ 语法

JPoint:代码可注入的点,比如一个方法的调用处或者方法内部、“读、写”变量等。
Pointcut:用来描述 JPoint 注入点的一段表达式,比如:调用 Animal 类 fly 方法的地方,call(* Animal.fly(..))。
Advice:常见的有 Before、After、Around 等,表示代码执行前、执行后、替换目标代码,也就是在 Pointcut 何处注入代码。
Aspect:Pointcut 和 Advice 合在一起称作 Aspect。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

3.使用

统计一下某个方法的运行时间

public class StopWatch {
    private long startTime;
    private long endTime;
    private long elapsedTime;

    public StopWatch() {
        //empty
    }

    private void reset() {
        startTime = 0;
        endTime = 0;
        elapsedTime = 0;
    }

    public void start() {
        reset();
        startTime = System.nanoTime();
    }

    public void stop() {
        if (startTime != 0) {
            endTime = System.nanoTime();
            elapsedTime = endTime - startTime;
        } else {
            reset();
        }
    }

    public long getTotalTimeMillis() {
        return (elapsedTime != 0) ? TimeUnit.NANOSECONDS.toMillis(endTime - startTime) : 0;
    }

}
public class DebugLog {
    private DebugLog() {}

    /**
     * Send a debug log message
     *
     * @param tag Source of a log message.
     * @param message The message you would like logged.
     */
    public static void log(String tag, String message) {
//        Log.i(tag, message);
        System.out.print(message);
    }
}
@Retention(RetentionPolicy.CLASS)
@Target({ ElementType.CONSTRUCTOR, ElementType.METHOD })
public @interface DebugTrace {}
@Aspect
public class TraceAspect {

    private static final String POINTCUT_METHOD =
            "execution(@com.example.libraryaspectj.DebugTrace * *(..))";

    private static final String POINTCUT_CONSTRUCTOR =
            "execution(@com.example.libraryaspectj.DebugTrace *.new(..))";

    @Pointcut(POINTCUT_METHOD)
    public void methodAnnotatedWithDebugTrace() {}

    @Pointcut(POINTCUT_CONSTRUCTOR)
    public void constructorAnnotatedDebugTrace() {}

    @Around("methodAnnotatedWithDebugTrace() || constructorAnnotatedDebugTrace()")
    public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getName();

        final StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Object result = joinPoint.proceed();
        stopWatch.stop();

        DebugLog.log(className, buildLogMessage(methodName, stopWatch.getTotalTimeMillis()));
        Log.i("*** yang",buildLogMessage(methodName, stopWatch.getTotalTimeMillis()));
        return result;
    }

    /**
     * Create a log message.
     *
     * @param methodName A string with the method name.
     * @param methodDuration Duration of the method in milliseconds.
     * @return A string representing message.
     */
    private static String buildLogMessage(String methodName, long methodDuration) {
        StringBuilder message = new StringBuilder();
        message.append("methodName --> ");
        message.append(methodName);
        message.append(" --> ");
        message.append("[");
        message.append(methodDuration);
        message.append("ms");
        message.append("]");

        return message.toString();
    }
}

然后在app中的某activity

...
    @DebugTrace
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_list);
...

即会打印出 I/* yang: Libraryaspectj –> onCreate –> [82ms]

以上就是对aspectj的简单实现后续展开都是遵循aspectj语法的使用

aspecjt文档

KEITHLEY 2182A + 6220/6221 系列测试系统软件 6221型与2182A型相结合,是业界最完整的差分电导测量解决方案 阅读详情

相关推荐

新代永久解锁西门子smart S7-200PLC 上传程序步骤

西门子 SMART S7-200 PLC 程序上传步骤 打开编程软件 或左下角依次打开 程序 所有程序 Siemens Automation Simatic STEP 7-MicroWIN SMART V2.4 STEP 7-MicroWIN SMART 技术交流 plcjiesuo1 2. 确认plc电源端以及输入电压; 3.用网线连接plc与电脑技术交流 plcjiesuo1 4.plc通电; 5.打开编程软件,双击通讯 6.按照...

m0_60773720的博客 2万+

【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )

一、AspectJ 下载、 二、拷贝 aspectjrt.jar 到 Android Studio、 三、配置 Gradle 和 Gradle 插件版本、 四、配置 Gradle 构建脚本、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2216

Materials - UE5中的PivotPainter

可以使用3DS Max Script中的脚本(Pivot Painter)对模型进行处理,让每个Element都有自己的Pivot Point,来方便控制和制作一些特殊的顶点动画效果;

GT的虚幻引擎文档 1289

Android中简单使用aspectj

Android自定义注解

u012556114的博客 1434

告别昂贵硬件!用Unity3D 2023 + ROS2 Humble搭建你的第一个SLAM仿真实验室(保姆级教程)

本文提供了一份详细的教程,介绍如何使用Unity3D 2023和ROS2 Humble搭建SLAM仿真实验室,无需昂贵硬件即可实现虚拟传感器模拟和算法测试。通过Docker容器配置、ROS2安装优化及Unity插件集成,开发者可以快速构建高精度的仿真环境,适用于自主导航、多传感器标定等场景。

weixin_42526353的博客 434

Arduino跑通ssd1306_spi显示屏

代码首先,您需要下载两个库:● Adafruit GFX库,这是核心图形库,提供了一组通用的图形基元(点、线、圆等)。它需要与特定于硬件的库对应。● Adafruit SSD-1306 OLED显示库,这是基于SSD1306驱动程序的OLED显示器的库。解压缩这两个库并将它们添加到Arduino库文件夹中,然后运行Arduino IDE并从OLED库中打开SPI示例。

Leo ICer的博客 1494

android- AspectJ 的接入使用

AspectJ 作为aop的著名工具,现在就让我们进行使用他,不逼逼。 接入有两种方式,一种是组件化式接入,一种是非组件化接入。组件化接入,就是当我们的项目是组件化开发时,有多个moudle。 非组件化接入: 第一步:在项目gradle中添加aspectJ的依赖 classpath 'org.aspectj:aspectjtools:1.8.6' 第二步:在app gradle中...

BunnyCoffer的博客 2962

VHDL六层电梯控制器及仿真

六层电梯电梯 设计要求:设计一个六层电梯控制系统要求有超载、关门中断、提前关门清除报警信电梯外人的上升请求信号,电梯外人的下降请求信号, 电梯外人上升请求信号显示电梯外人下降请求信号显示到达楼层信号 设计思路:输入有clk时钟信号(频率为2Hz) full,deng,quick,clr超载、关门中断、提前关门清除报警c_u1,c_u2,c_u3,c_u4,c_u5电梯外人的上升请求c_d2,c_d3,c_d4,c_d5,c_d6 电梯外人的下降请求 d1,d2,d3,d4,d5,d6电梯内人的...

QQ_778132974的博客 1709

Android面向切面编程(AOP)

一、简述 1、AOP的概念 如果你用java做过后台开发,那么你一定知道AOP这个概念。如果不知道也无妨,套用百度百科的介绍,也能让你明白这玩意是干什么的: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要

Android技术之家 682

基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

饮食在人们的日常生活、营养与医疗建议以及运动员等专业人士的训练上起着越来越重要的作用。随着互联网的发展和医学的进步,人们普遍上传分享和记录的食物图像形成了非常多的数据库,为了改善饮食结构,塑造更健康的生活方式,分析食物的种类、热量和进食时间成为了营养学上非常重要的研究方法,本文的使用深度学习算法可以根据用户上传的食物图像自动分析食物种类。深度学习是机器学习领域的一个研究方向。深度学习通过对数据特征的学习将原始数据转化为计算机可以理解的抽象数据,根据学习到的特征,可以对原始数据进行检测或分类。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4722

Yandex复杂还原验证码识别

本文分析了Yandex滑动验证码的识别方法,指出其通过JS判断正确滑动位置而非用户交互还原图像。核心思路是通过像素差异分析,将验证码图像重组后(分为3×3或4×4),计算相邻图像间的像素差异,最小值即为正确位置。与前期某象验证码识别方法类似,需结合图像增强技术统一像素直方图。文章强调该方法仅供学习参考,严禁用于违法行为。完整识别流程包括图像重组、像素差异计算等步骤,最终可准确定位正确拼图位置。

码王吴彦祖的博客 285

Android切面编程AOP之AspectJ的使用

概述 AOP(Aspect Oriented Programming)面向切面编程。就是:在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 使用场景 针对很多地方都需要用到的模板代码,我们都可以用AOP来做,比如: 日志、性能监控、埋点等。 举个列子,很多时候我们需要根据当前网络情况做下一步操作,代码如下: public void checkNetworkNormal(){ if (NetworkUtils.isNetworkAvailable(th

BoBoMEe 2985

L2tp环境搭建笔记- Openwrt平台

本文使用3台openwrt设备, 分别搭建L2TP服务和2个客户端, 进行端到端验证和局域网组网,并分析搭建过程中涉及的默认路由( defaultroute) 配置问题。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 3392

Android AOP简介及AspectJ的应用

ASM可以在编译期直接修改编译出的字节码文件,也可以像Javassit一样,在运行期,类文件加载前,去修改字节码。通过实现InvocationHandler接口,可以实现对一个类的动态代理,通过动态代理,我们可以生成代理类从而在代理类方法中,在执行被代理类方法前后,添加自己的实现内容,从而实现Aop。自定义一个AbstractProcessor,在编译期去解析编译的类,并且根据需求生成一个实现了特定接口的子类(代理类),和JDK动态代理不同的是,APT的代理类是在编译期生成的。如:Javassist。

2401_86352964的博客 1279

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

AspectJ实现AOP编程

AspectJ实现AOP编程,模拟判断登录需求,获取参数。

qq_30974087的博客 934

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

安卓AOP变天了?AspectJ的黄昏与KSP的崛起

本文探讨了AOP技术在Android开发中的演变,重点分析了AspectJ在Android生态中逐渐衰落的原因。随着Android开发生态的发展,AspectJ正面临编译性能问题、配置复杂性、调试困难、高学习成本和维护成本等挑战。现代替代方案如Kotlin符号处理器(KSP)因其卓越的编译性能、简洁API设计和原生Kotlin支持而受到推荐。KSP相比传统方法在编译时间、内存占用和增量编译支持方面表现更优,成为当前Android实现AOP的更优选择。

分享Android应用和系统开发、音视频编码、性能优化相关知识 1131

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android中的AOP的实现及AspectJ的使用

一、OOP和AOP的简单简介和区别 OOP(Object Oriented Programming): 这就是我们android中的面向对象开发。面向对象的三大特征,封装、继承和多态。这里不多赘述。 AOP(Aspect Oriented Programming):面向切面编程;AOP则是面对业务逻辑处理过程中的切面进行提取,也就是程序处理的某个步骤或者阶段,以达到代码间的低耦合、代码分离、提高代...

岩浆李的游鱼 2041

XAOP框架原理解析:Android AOP实现机制与AspectJ应用

想要掌握Android开发中的高效编程技巧吗?今天我们来深入解析一个强大的Android AOP框架——XAOP,了解它是如何通过AspectJ技术实现面向切面编程,让Android开发变得更加简单高效的。XAOP框架是一个轻量级的AOP(Android)应用框架,囊括了最实用的AOP应用场景,为Android开发者提供了强大的AOP编程能力。 ## 🚀 什么是AOP与XAOP框架? AOP

gitblog_00905的博客 653

Android基于AOP的非侵入式监控之——AspectJ实战

本博文的目的不是详细的介绍AspectJ的细节,而是最近项目用到了AspectJ,因此对其作了一些使用和重要概念上的总结。 相信很多做过Web的同学对[AspectJ](https://eclipse.org/aspectj/doc/next/progguide/starting.html)都不陌生,Spring的AOP就是基于它而来的。如果说平常我们随便写写程序的时候,基本也不会用到它,需要调试的话无非就是多加一个

David-Kuper的专栏 2万+

Android AOP框架 AspectJ的使用

什么是AOP AOP为Aspect Oriented Programming的缩写,意思是面向切面编程。 AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。也就是时候可以,在不需要修改目的程序代码的前提下,可以插入新的代码块,并且好处是,唯一修改,多处生效。 本质上是在编译时期由java文件生成class...

编程之美 1929

Android 基于AOP监控之——AspectJ使用指南

AspectJ的使用核心就是它的编译器,它就做了一件事,将AspectJ的代码在编译期插入目标程序当中,运行时跟在其它地方没什么两样,因此要使用它最关键的就是使用它的编译器去编译代码ajc。ajc会构建目标程序与AspectJ代码的联系,在编译期将AspectJ代码插入被切出的PointCut中,已达到AOP的目的。 因此,无论在什么IDE上(如果使用命令行就可以直接使用ajc编译了),问题就是让IDE使

David-Kuper的专栏 1万+

Android AOP编程之AspectJ

一、AspectJ Aspectj是一个AOP框架,也是通过对字节码操作,来实现AOP的,但是与ASM需要开发者直接编写操作字节码的代码之外,使用Aspectj不需要开发者直接编写操作字节码代码, 而是只需要按照规范编写我们需要处理的Java代码即可;由Aspectj帮助我们将编写的Java代码的字节码织入到.class字节码文件中实现字节码插桩操作; 二、AspectJ中的基本概念 1.切面 Aspect 我们在学习AOP的时候,知道AOP实际就是针对的是业务逻辑中的某个处理步骤,比如日志处理,登录判断

殇神马的博客 824

Android AOP之AspectJ的简单使用

一、AOP与OOP的区别 项目中遇到许多地方需要校验登录,会编写许多重复代码,针对这一类问题可以用AOP的思想进行处理,首先了解AOP与OOP的区别。 OOP: 专业术语: OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。 面向对象侧重静态,名词,状态,组织,数据,载体是空间; 大白话: OOP面向对象的三大特征 : 封装 , 继承 , 多态 。这些特征也说明了OOP是面向对象的,我们做什么都是考虑一个对象,我们需要完成一个任务的时候一般都想着

zhangshiwen的博客 643

Android AOP编程(二)——AspectJ语法&实战

在上一篇Android AOP编程(一)——AspectJ基础知识中我记录了在Android中使用AspectJ实现AOP编程的一些基础知识,但是AspectJ的使用其实最主要的是针对切面的语法,找切面并不难,难的是如何编写匹配这个切面的规则,本篇主要记录的就是AspectJ的语法,以及使用一个实例来解释AspectJ的应用。 AspectJ语法整理 以下关于AspectJ的语法整理全部出自网络收集,并未一一验证,若有错误请指出。 execution 使用execution(<匹配表达式>).

记录技术,记录生活 7297
上一篇: Android AOP(一):APT Annotation Processing Tool 注解处理器
下一篇: Android AOP(三):在Android中Javassist动态编译代码
trinity2018
博客等级 码龄14年 3粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值