一、
OOP(Object Orented Programming):面向对象设计编程
二、
AOP(面向切面编程):就是我们把某个方面的功能提出来与一批对象进行隔离,这样降低对象之间降低耦合性,就可以对某个功能进行编程
AOP的意义:解决了OOP面向对象解决不了的问题,这个问题就是跨模块编程
AOP的应用:Android用户行为统计、权限管理
AOP更好的实践方式:
AspectJ: AspectJ是一个面向切面的框架,他扩展了java语言所以他有一个专门的编译器用来生成遵守java字节码规范的Class文件
包含:1、aspect:切面
2、pointcut:切点
3、Around:处理
三、
Android Studio导入流程:
1、在project的build.gradle中添加下面的代码
classpath 'org.aspectj:aspectjtools:1.8.9'
classpath 'org.aspectj:aspectjweaver:1.8.9'
2、在app的build.gradle中指定编译版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
3、在app的build.gradle中添加aspectJ依赖
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.aspectj:aspectjtools:1.8.9'
classpath 'org.aspectj:aspectjweaver:1.8.9'
}
}
4、
将aspectJ的jar包放入libs文件中,并在gradle中添加依赖
5、在app的build.gradle中添加如下代码
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main
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)]
log.debug "ajc args: " + Arrays.toString(args)
MessageHandler handler = new MessageHandler(true);
new Main().run(args, handler);
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:
log.warn message.message, message.thrown
break;
case IMessage.INFO:
log.info message.message, message.thrown
break;
case IMessage.DEBUG:
log.debug message.message, message.thrown
break;
}
}
}
}
注:
1、参考资料
下载aspectj 地址 http://www.eclipse.org/aspectj/downloads.php
下载aspectj的adt地址http://www.eclipse.org/ajdt/downloads/#43zips
build.gradle aspectJ 写法 http://fernandocejas.com/2014/08/03/aspect-oriented-programming-in-android/
2、
需要指定以1.8编译,否则会报下面的错
android打包报错“Caused by: com.android.tools.r8.utils.AbortException”
解决办法:在app的build.gradle文件中指定编译版本为1.8
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
3、
报错:
Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: zip file is empty