在android中使用AspectJ拦截第三方函数



我一直在尝试拦截所有第三方函数,这是我使用aspectJ应用程序的一部分,但不知何故,我只能拦截由我声明的函数,而不是由第三方库声明的函数。

我正在使用本教程中引用的这个aspectJ gradle配置。

我的aspect是这样的:

private static final String POINTCUT_METHOD = "execution(* *(..))";
@Pointcut(POINTCUT_METHOD) 
public void methodAnnotatedWithDebugTrace() {}
@Around("methodAnnotatedWithDebugTrace()") 
public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) 
            throws Throwable { 
    // ...
}

是否有任何方法,我们可以开始拦截第三方功能??

转述另一个被多次给出的答案:

你只能编织你自己的代码

基本上,Aspects with android只在编译时工作,通常会编织自己的代码。如果你使用的是没有源代码的现有代码(比如Android框架),编译器将无法修改这些代码。在您的情况下,您只能在代码访问第三方库时捕获。

意味着如果你想拦截第三方库,你需要使用"call(* *(..))"而不是"execution(* *(..))"

你可以用gradle-aspectj插件编写第三方库的代码。这是可能的,因为转换API,它处理所有的项目源,不仅是src/*包,但jar/aars,子模块也是。但是要小心使用第三方代码的编织,它可能会导致意想不到的行为。

最新更新