十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇“怎么在Android中实现切面编程”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么在Android中实现切面编程”文章吧。
我们提供的服务有:成都做网站、成都网站制作、微信公众号开发、网站优化、网站认证、永平ssl等。为上千多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的永平网站制作公司
安装AspectJ
Android上的ApsectJ开发由几部分组成,AspectJ gradle插件,ApsectJ依赖,还有 AspectJ编译器。
首先安装AspectJ编译器很简单,就跟安装JAVA环境一样,
目前最新的已经更新到1.9.1了。如果你电脑已经有JAVA环境的话直接运行这个jar包就行,
在安装完毕后需要配置环境变量到 aspectj的bin目录下,这里不赘述
export PATH="$PATH:~/Library/Android/sdk/platform-tools" export PATH="$PATH:/usr/local/opt/gradle/gradle-4.1/bin" export PATH="$PATH:~/Library/Android/sdk/ndk-bundle" export PATH="$PATH:~/Library/flutter/bin" export PATH="$PATH:~/Library/kotlinc/bin" export PATH="$PATH:~/Library/AspectJ/bin" <- AspectJ的PATH
配置完后运行 ajc -v 应该可以看到对应输出
AspectJ Compiler 1.9.0 (1.9.0 - Built: Monday Apr 2, 2018 at 18:52:10 GMT)
配置Android Gradle增加AspectJ依赖
构建带AspectJ支持的Android App的流程是先按正常流程编译出 .class 文件后,再用 ajc 编译器在 .class文件中插入我们需要的代码。
首先需要把 AspectJ 依赖加到 gradle根目录中,
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' classpath 'org.aspectj:aspectjtools:1.8.9' //Aspect classpath 'org.aspectj:aspectjweaver:1.8.9' //Aspect } }
然后在项目app目录的build.gradle需要添加以下内容,
apply plugin: 'com.android.application' //+增加内容 import org.aspectj.bridge.MessageHandler import org.aspectj.tools.ajc.Main buildscript { repositories { mavenCentral() } dependencies { classpath 'org.aspectj:aspectjtools:1.8.9' classpath 'org.aspectj:aspectjweaver:1.8.9' } } repositories { mavenCentral() } final def log = project.logger final def variants = project.android.applicationVariants variants.all { variant -> if (!variant.buildType.isDebuggable()) { log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.") return; } 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", project.android.bootClasspath.join(File.pathSeparator)] MessageHandler handler = new MessageHandler(true); new Main().run(args, handler); } } //-增加内容
这段gradle脚本是在java编译完成后追加一个 acj 的编译流程,
MessageHandler 是 AspectJ Tools中的对象,用来接收参数然后进行 acj 编译的。
最后再把 dependencies依赖加上对AspectJ的支持就可以了,
implementation 'org.aspectj:aspectjrt:1.9.0'
创建AspectJ代码
下面这部分代码看起来会一脸懵逼,不过目前先不用管具体的语法含义,
先跑起来环境,然后再结合理论慢慢在修改代码中感受就能快速的上手AOP了。
以一个HelloWorld为例子,我们的MainActivity中啥事情不干,只有基本的生命周期方法,
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); } }
现在我们要写一个AspectJ类,这个类看起来会跟一般的Java类有点不同,可以理解为它只是用注解作为媒介,让ACJ编译器知道要去注入哪些方法。
这个类要做的事情是告诉ACJ编译器,要在MainActivity中的每个方法前面打印一行log,输出当前执行的是哪个方法,
@Aspect public class AspectTest { private static final String TAG = "AspectTest"; @Pointcut("execution(* phoenix.com.helloaspectj.MainActivity.**(..))") public void executeAspectJ() { } @Before("executeAspectJ()") public void beforeAspectJ(JoinPoint joinPoint) throws Throwable { Log.d(TAG, "beforeAspectJ: injected -> " + joinPoint.toShortString()); } }
第一次接触AspectJ的看到这段代码有点摸不着头脑,解释一下几个注解的意思,
@Aspect: 告诉ACJ编译器这是个AspectJ类
@PointCut: PointCut是AspectJ中的一个概念,跟它一起的另一个概念是 JoinPoint,这两个概念一起描述要注入的切面
@Before: 表示要注入的位置,常用的有 Before/After/Around,分别表示在执行前,执行后,和取代原方法
这里@PointCut注解后的参数表示的意思是对 MainActivity中的所有方法进行注入,参数用的是正则匹配语法。
下面看看这段代码执行的结果
07-26 16:04:56.611 22823-22823/? D/AspectTest: beforeAspectJ: injected -> execution(MainActivity.onCreate(..))
07-26 16:04:56.661 22823-22823/? D/AspectTest: beforeAspectJ: injected -> execution(MainActivity.onStart())
看到虽然我们没有在MainActivity中写入log打印语句,但是通过AspectJ实现了,在MainActivity两个生命周期执行前插入了我们自己的log。
以上就是关于“怎么在Android中实现切面编程”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注创新互联行业资讯频道。