Johnny Shieh

人如果没有梦想,跟咸鱼有什么分别


  • 首页

  • 分类

  • 归档

  • 标签

  • 读书

  • 小伙伴

  • 关于

  • 搜索

AspectJ in Android (三),AspectJ 两种用法以及常见问题

发表于 2017-09-20 | 分类于 AspectJ | | 阅读次数

AspectJ in Android 系列:

AspectJ in Android (一),AspectJ 基础概念

AspectJ in Android (二),AspectJ 语法

AspectJ in Android (三),AspectJ 两种用法以及常见问题

前面两篇文章介绍了 AspectJ 的基础概念以及基于注解开发方式的语法,这篇文章总结了 AspectJ 的两种用法和 android-aspectjx 插件的常见问题。

AspectJ 的两种用法

我觉得以 Pointcut 切入点作为区分,AspectJ 有两种用法:(1)用自定义注解修饰切入点,精确控制切入点,属于侵入式;(2)不需要在切入点代码中做任何修改,属于非侵入式。

侵入式

侵入式用法,一般会使用自定义注解,以此作为选择切入点的规则。

下面以 JakeWharton 大神的 hugo 为例,分析自定义注解 AOP 的使用。hugo 是用于在开发环境中打印方法调用信息的,只会打印注解修饰的方法。

首先看下新增的自定义注解:

1
2
3
@Target({TYPE, METHOD, CONSTRUCTOR}) @Retention(CLASS)
public @interface DebugLog {
}

上面定义了@DebugLog注解,可以修饰类、接口、方法和构造函数,可在 Class 文件中保留,编译期可用。更多关于 Java 注解的内容,请看之前的文章 探索注解之注解的基本概念。

阅读全文 »

AspectJ in Android (二),AspectJ 语法

发表于 2017-09-12 | 分类于 AspectJ | | 阅读次数

AspectJ in Android 系列:

AspectJ in Android (一),AspectJ 基础概念

AspectJ in Android (二),AspectJ 语法

AspectJ in Android (三),AspectJ 两种用法以及常见问题

上篇文章介绍了 AspectJ 的基本概念,这篇文章详细分析 AspectJ 基于注解开发方式的语法。

Join Point

Join Point 表示连接点,即 AOP 可织入代码的点,下表列出了 AspectJ 的所有连接点:

Join Point 说明
Method call 方法被调用
Method execution 方法执行
Constructor call 构造函数被调用
Constructor execution 构造函数执行
Field get 读取属性
Field set 写入属性
Pre-initialization 与构造函数有关,很少用到
Initialization 与构造函数有关,很少用到
Static initialization static 块初始化
Handler 异常处理
Advice execution 所有 Advice 执行
阅读全文 »

AspectJ in Android (一),AspectJ 基础概念

发表于 2017-09-05 | 分类于 AspectJ | | 阅读次数

AspectJ in Android 系列:

AspectJ in Android (一),AspectJ 基础概念

AspectJ in Android (二),AspectJ 语法

AspectJ in Android (三),AspectJ 两种用法以及常见问题

最近项目在做无埋点统计,解决新增功能都需要人工添加埋点的问题,其中使用了 AspectJ 技术。在这过程中发现网上关于 AspectJ 在 Android 中应用的文章比较少,所以自己整理写了 《AspectJ in Android》系列文章,记录自己所学的同时希望读者可以少走一些弯路。

这篇文章主要讲 AspectJ 涉及到的 AOP 编程思想和 AspectJ 的一些基本概念。

AOP

什么是 AOP ?

AOP (Aspect-Oriented Programming),面向切面编程,是一种编程思想。AOP 以切面(aspect)为基础,切面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关点(crosscutting concern)。

AOP 和我们熟悉的 OOP 面向对象编程只有一字之差,面向对象编程是以对象为基础,把功能抽象成对象模型,优先从对象的属性和行为职责出发,把代码分散到一个个的类中,降低代码的复杂度同时提供复用性。但是在分散代码时会出现重复代码,例如,在两个类的每个方法中加上日志。按照 OOP 的思想,需要在方法中都加入重复的日志代码,也许有人说把日志代码抽象成例外一个日志的类,但是这样的话日志类和两个类都有耦合,而且日志类和这两个的职责没有关联,调用日志类的方法却遍布两个类的方法中。

而 AOP 的思想是把对象的核心职责外的通用逻辑(如日志,性能,校验等)抽象出来,把散布在多个对象多个模块的通用逻辑当作切面,然后动态地把代码插入到类的指定方法、指定位置中,实现 AOP 的核心技术也是代码织入技术,如 AspectJ、Javassist、DexMaker、ASMDex、动态代理等。

所以 AOP 可以说是对 OOP 的补充,OOP 以核心职责为主从纵向划分出一个一个类,AOP 以多个类中通用逻辑为主横向划分出一个一个切面,AOP 让 OOP 立体,去除重复代码,降低耦合并且增加可维护性。

阅读全文 »

Kotlin 设计模式之单例模式

发表于 2017-08-18 | 分类于 设计模式 | | 阅读次数

现在 Kotlin 的趋势日益高涨,Jake Wharton 大神近期从 Square 公司离职到 Google 负责 Kotlin 部分。我最近分析了 Kotlin 下的单例模式的实现方式,与 Java 下的实现有点区别,之前写过一篇 Java 设计模式之单例模式。

饿汉式

Kotlin 引入了 object 类型,可以很容易声明单例模式。

1
2
3
4
5
6
7
8
9
object Singleton {
...
}
// Kotlin 中调用
Singleton.xx()
// Java 中调用
Singleton.INSTANCE.xx()
阅读全文 »

Android ProGuard 代码混淆那些事儿

发表于 2017-08-02 | 分类于 Android | | 阅读次数

Android 开发中为了代码安全一般都会使用 ProGuard 进行代码混淆,它可以把类名、属性名和方法名变为毫无意义的 a, b, c 等,但是有些代码是不需要混淆的,这时需要配置 proguard-rules.pro 文件。这是许多开发者对代码混淆的认识,但是 ProGuard 更深入的内容呢,如何配置混淆规则呢,下面我就分享下 Android 中 ProGuard 那些事。

先敲敲黑板,划下重点:本文内容重点在第三节 – 自定义要保留的代码

ProGuard 简介

ProGuard 官网地址:https://www.guardsquare.com/en/proguard

ProGuard is a Java class file shrinker, optimizer, obfuscator, and preverifier. The shrinking step detects and removes unused classes, fields, methods and attributes. The optimization step analyzes and optimizes the bytecode of the methods. The obfuscation step renames the remaining classes, fields, and methods using short meaningless names. These first steps make the code base smaller, more efficient, and harder to reverse-engineer. The final preverification step adds preverification information to the classes, which is required for Java Micro Edition and for Java 6 and higher.

ProGuard 的功能有四个:压缩、优化、混淆以及预校验。压缩环节会检测并移除无用的类、字段、方法和属性。优化环节会分析并优化方法的字节码。混淆环节会用无意义的短变量去重命名其余的类、字段以及方法。这些环节可以使得代码更精简,更高效,也跟难被逆向工程。预校验是针对 J2ME 和 Java 6 以上的,在 Android 开发中不需要。

阅读全文 »
1234…13
Johnny Shieh

Johnny Shieh

我本微末,心向天空

65 日志
12 分类
40 标签
GitHub Weibo Gmail 简书
  • 热门系列
  • Dagger 完全解析(6)
  • AspectJ in Android(3)
  • Kotlin 写 Android 单元测试(4)
© 2015 - 2018 Johnny Shieh
访客数 总访问量
备案号:赣ICP备17009549号