Skip to content

Commit 5166e77

Browse files
committed
替换掉 AOP 框架
1 parent ea83168 commit 5166e77

10 files changed

Lines changed: 158 additions & 243 deletions

File tree

app/build.gradle

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
plugins {
22
id 'com.android.application'
33
id 'org.jetbrains.kotlin.android'
4-
id 'io.github.wurensen.android-aspectjx'
4+
id 'android.aop'
55
// id 'com.starter.easylauncher'
66
}
77

@@ -121,10 +121,7 @@ android {
121121
}
122122

123123
// AOP 配置(exclude 和 include 二选一)
124-
// 需要进行配置,否则就会引发冲突,具体表现为:
125-
// 第一种:编译不过去,报错:java.util.zip.ZipException:Cause: zip file is empty
126-
// 第二种:编译能过去,但运行时报错:ClassNotFoundException: Didn't find class on path: DexPathList
127-
aspectjx {
124+
androidAopConfig {
128125
// 排除一些第三方库的包名(Gson、 LeakCanary 和 AOP 有冲突)
129126
// exclude 'androidx', 'com.google', 'com.squareup', 'org.apache', 'com.alipay', 'com.taobao', 'versions.9'
130127
// 只对以下包名做 AOP 处理
@@ -252,6 +249,10 @@ dependencies {
252249
// 软键盘遮挡解决方案:https://github.com/liangjingkanji/soft-input-event
253250
implementation 'com.github.liangjingkanji:soft-input-event:1.0.9'
254251

252+
// Android AOP 框架:https://github.com/FlyJingFish/AndroidAOP
253+
implementation 'io.github.flyjingfish:androidaop-core:2.7.4'
254+
annotationProcessor 'io.github.flyjingfish:androidaop-apt:2.7.4'
255+
255256
// 多语种:https://github.com/getActivity/MultiLanguages
256257
// 悬浮窗:https://github.com/getActivity/EasyWindow
257258
// 日志输出:https://github.com/getActivity/Logcat

app/src/main/java/com/hjq/demo/aop/CheckNet.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hjq.demo.aop;
22

3+
import com.flyjingfish.android_aop_annotation.anno.AndroidAopPointCut;
34
import java.lang.annotation.ElementType;
45
import java.lang.annotation.Retention;
56
import java.lang.annotation.RetentionPolicy;
@@ -13,4 +14,5 @@
1314
*/
1415
@Retention(RetentionPolicy.RUNTIME)
1516
@Target(ElementType.METHOD)
17+
@AndroidAopPointCut(CheckNetCut.class)
1618
public @interface CheckNet {}

app/src/main/java/com/hjq/demo/aop/CheckNetAspect.java renamed to app/src/main/java/com/hjq/demo/aop/CheckNetCut.java

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,34 @@
33
import android.app.Application;
44
import android.net.ConnectivityManager;
55
import android.net.NetworkInfo;
6+
import androidx.annotation.NonNull;
67
import androidx.core.content.ContextCompat;
8+
import com.flyjingfish.android_aop_annotation.ProceedJoinPoint;
9+
import com.flyjingfish.android_aop_annotation.base.BasePointCut;
710
import com.hjq.demo.R;
811
import com.hjq.demo.manager.ActivityManager;
912
import com.hjq.toast.Toaster;
10-
import org.aspectj.lang.ProceedingJoinPoint;
11-
import org.aspectj.lang.annotation.Around;
12-
import org.aspectj.lang.annotation.Aspect;
13-
import org.aspectj.lang.annotation.Pointcut;
1413

1514
/**
1615
* author : Android 轮子哥
1716
* github : https://github.com/getActivity/AndroidProject
1817
* time : 2020/01/11
1918
* desc : 网络检测切面
2019
*/
21-
@SuppressWarnings("unused")
22-
@Aspect
23-
public class CheckNetAspect {
20+
public class CheckNetCut implements BasePointCut<CheckNet> {
2421

25-
/**
26-
* 方法切入点
27-
*/
28-
@Pointcut("execution(@com.hjq.demo.aop.CheckNet * *(..))")
29-
public void method() {}
30-
31-
/**
32-
* 在连接点进行方法替换
33-
*/
34-
@Around("method() && @annotation(checkNet)")
35-
public void aroundJoinPoint(ProceedingJoinPoint joinPoint, CheckNet checkNet) throws Throwable {
22+
@SuppressWarnings("deprecation")
23+
@Override
24+
public Object invoke(@NonNull ProceedJoinPoint joinPoint, @NonNull CheckNet anno) throws Throwable {
3625
Application application = ActivityManager.getInstance().getApplication();
3726
ConnectivityManager manager = ContextCompat.getSystemService(application, ConnectivityManager.class);
3827
if (manager != null) {
3928
NetworkInfo info = manager.getActiveNetworkInfo();
40-
// 判断网络是否连接
4129
if (info == null || !info.isConnected()) {
4230
Toaster.show(R.string.common_network_hint);
43-
return;
31+
return null;
4432
}
4533
}
46-
//执行原方法
47-
joinPoint.proceed();
34+
return joinPoint.proceed();
4835
}
4936
}

app/src/main/java/com/hjq/demo/aop/Log.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hjq.demo.aop;
22

3+
import com.flyjingfish.android_aop_annotation.anno.AndroidAopPointCut;
34
import java.lang.annotation.ElementType;
45
import java.lang.annotation.Retention;
56
import java.lang.annotation.RetentionPolicy;
@@ -12,7 +13,8 @@
1213
* desc : Debug 日志注解
1314
*/
1415
@Retention(RetentionPolicy.RUNTIME)
15-
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
16+
@Target(ElementType.METHOD)
17+
@AndroidAopPointCut(LogCut.class)
1618
public @interface Log {
1719

1820
String value() default "AOPLog";

app/src/main/java/com/hjq/demo/aop/LogAspect.java

Lines changed: 0 additions & 143 deletions
This file was deleted.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.hjq.demo.aop;
2+
3+
import android.annotation.SuppressLint;
4+
import android.os.Looper;
5+
import android.os.Trace;
6+
import androidx.annotation.NonNull;
7+
import com.flyjingfish.android_aop_annotation.ProceedJoinPoint;
8+
import com.flyjingfish.android_aop_annotation.base.BasePointCut;
9+
import java.util.concurrent.TimeUnit;
10+
import timber.log.Timber;
11+
12+
/**
13+
* author : Android 轮子哥
14+
* github : https://github.com/getActivity/AndroidProject
15+
* time : 2019/12/06
16+
* desc : 日志切面
17+
*/
18+
public class LogCut implements BasePointCut<Log> {
19+
20+
@Override
21+
public Object invoke(@NonNull ProceedJoinPoint joinPoint, @NonNull Log anno) throws Throwable {
22+
enterMethod(joinPoint, anno);
23+
long startNanos = System.nanoTime();
24+
Object result = joinPoint.proceed();
25+
long stopNanos = System.nanoTime();
26+
exitMethod(joinPoint, anno, result, TimeUnit.NANOSECONDS.toMillis(stopNanos - startNanos));
27+
return result;
28+
}
29+
30+
@SuppressLint("UnclosedTrace")
31+
private void enterMethod(ProceedJoinPoint joinPoint, Log log) {
32+
String className = joinPoint.getTarget() != null ? joinPoint.getTarget().getClass().getName() : "";
33+
String methodName = joinPoint.getTargetMethod().getName();
34+
String[] parameterNames = null;
35+
Object[] parameterValues = joinPoint.getArgs();
36+
37+
StringBuilder builder = getMethodLogInfo(className, methodName, parameterNames, parameterValues);
38+
log(log.value(), builder.toString());
39+
final String section = builder.substring(2);
40+
Trace.beginSection(section);
41+
}
42+
43+
@NonNull
44+
private StringBuilder getMethodLogInfo(String className, String methodName, String[] parameterNames, Object[] parameterValues) {
45+
StringBuilder builder = new StringBuilder("\u21E2 ");
46+
builder.append(className).append(".").append(methodName).append('(');
47+
if (parameterValues != null && parameterNames != null) {
48+
for (int i = 0; i < parameterValues.length; i++) {
49+
if (i > 0) {
50+
builder.append(", ");
51+
}
52+
builder.append(parameterNames[i]).append('=');
53+
builder.append(parameterValues[i]);
54+
}
55+
}
56+
builder.append(')');
57+
if (Looper.myLooper() != Looper.getMainLooper()) {
58+
builder.append(" [Thread:\"").append(Thread.currentThread().getName()).append("\"]");
59+
}
60+
return builder;
61+
}
62+
63+
private void exitMethod(ProceedJoinPoint joinPoint, Log log, Object result, long lengthMillis) {
64+
Trace.endSection();
65+
String className = joinPoint.getTarget() != null ? joinPoint.getTarget().getClass().getName() : "";
66+
String methodName = joinPoint.getTargetMethod().getName();
67+
StringBuilder builder = new StringBuilder("\u21E0 ")
68+
.append(className)
69+
.append('.')
70+
.append(methodName)
71+
.append(" [")
72+
.append(lengthMillis)
73+
.append("ms]");
74+
if (result != null) {
75+
builder.append(" = ").append(result);
76+
}
77+
log(log.value(), builder.toString());
78+
}
79+
80+
private void log(String tag, String msg) {
81+
Timber.tag(tag);
82+
Timber.d(msg);
83+
}
84+
}

app/src/main/java/com/hjq/demo/aop/SingleClick.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hjq.demo.aop;
22

3+
import com.flyjingfish.android_aop_annotation.anno.AndroidAopPointCut;
34
import java.lang.annotation.ElementType;
45
import java.lang.annotation.Retention;
56
import java.lang.annotation.RetentionPolicy;
@@ -13,6 +14,7 @@
1314
*/
1415
@Retention(RetentionPolicy.RUNTIME)
1516
@Target(ElementType.METHOD)
17+
@AndroidAopPointCut(SingleClickCut.class)
1618
public @interface SingleClick {
1719

1820
/**

0 commit comments

Comments
 (0)