0. 環境:
電腦:Windows10
Android Studio: 2024.3.2
編程語言: Java
Gradle version:8.11.1
Compile Sdk Version:35
Java 版本:Java11
1. 使用場景
整個項目都是用了RxJava,需要對 整個/部分 項目的RxJava進行監聽(攔截)
就會使用到Hook技術
下面請看代碼:
public void hookConfig() {RxJavaPlugins.setOnObservableAssembly(new Function<Observable, Observable>() {@Overridepublic Observable apply(Observable observable) throws Throwable {// 此時,會對全局的操作符都進行操作// 可以是打印日志,可以使記錄時間,也可以debug// 還可以通過if判斷,對部分操作符進行操作、對部分操作符忽略System.out.println("running timestamp: ");System.out.println(System.currentTimeMillis()); // 例如,打印時間return observable;// 此處必須要有返回值,不能為null,否則會報NPE}});
}public void testHook() {Observable.create( // 此處為create操作符new ObservableOnSubscribe<Object>() {@Overridepublic void subscribe(@NonNull ObservableEmitter<Object> emitter) throws Throwable {emitter.onNext("data");}}).map( // 此處為map操作符new Function<Object, Boolean>() {@Overridepublic Boolean apply(Object o) throws Throwable {return true;}}).subscribe(new Observer<Boolean>() {@Overridepublic void onSubscribe(@NonNull Disposable d) {}@Overridepublic void onNext(@NonNull Boolean aBoolean) {}@Overridepublic void onError(@NonNull Throwable e) {}@Overridepublic void onComplete() {}});
}
可以看到,總共有兩個操作符:.create 和 .map
同時,查看打印日志:
2025-07-19 19:05:24.281 2529-2529 System.out com.liosen.androidnote I running timestamp:
2025-07-19 19:05:24.281 2529-2529 System.out com.liosen.androidnote I 1752923124281
2025-07-19 19:05:24.281 2529-2529 System.out com.liosen.androidnote I running timestamp:
2025-07-19 19:05:24.281 2529-2529 System.out com.liosen.androidnote I 1752923124281
確實打印了兩次日志。
說明hook已經完成。
比較簡單。
可以根據每個人的業務不同,進行修改
2. 寫在最后
本篇文章主要是為了解決:全局攔截,學會Hook機制
關于RxJava,可以查看我其他文章:
【安卓筆記】RxJava的使用+修改功能+搭配retrofit+RxView防快速點擊:https://blog.csdn.net/liosen/article/details/149340103
【安卓筆記】RxJava之flatMap的使用:https://blog.csdn.net/liosen/article/details/149343166
【安卓筆記】RxJava的onNextDo的使用:https://blog.csdn.net/liosen/article/details/149343321
【安卓筆記】RxJava的Hook機制,整體攔截器:https://blog.csdn.net/liosen/article/details/149467298