Skip to content

Commit 5f96e4b

Browse files
authoredSep 6, 2022
Merge pull request #8 from Knight-ZXW/fix_android12_bug
fix issue#7
2 parents 62fafae + 294ea63 commit 5f96e4b

File tree

4 files changed

+36
-26
lines changed

4 files changed

+36
-26
lines changed
 

‎app/src/main/java/com/knightboot/spwaitkiller/sample/MainActivity.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,13 @@ public void run() {
101101
@Override
102102
public void run() {
103103
try {
104-
Log.d(TAG,"run work "+Log.getStackTraceString(new Throwable()));
105-
Log.e(TAG,"run work "+this+" on Thread "+Thread.currentThread().getId()+" begin");
104+
Log.e(TAG,"run work "+this+" on Thread "+Thread.currentThread().getName()+" begin");
106105
Thread.sleep(blockSeconds*1000);
107106
writtenToDiskLatch.countDown();
108107
} catch (InterruptedException e) {
109108
e.printStackTrace();
110109
}
111-
Log.e(TAG,"run work "+this+" on Thread "+Thread.currentThread().getId() +" finish");
110+
Log.e(TAG,"run work "+this+" on Thread "+Thread.currentThread().getName() +" finish");
112111
}
113112
});
114113
//触发任务执行

‎gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ android.enableJetifier=true
2020

2121

2222
GROUP=io.github.knight-zxw
23-
VERSION_NAME=0.0.7-SNAPSHOT
23+
VERSION_NAME=0.0.8-SNAPSHOT
2424
POM_DESCRIPTION=android sp blocking killer
2525

2626
POM_URL=https://github.com/Knight-ZXW/SpWaitKiller/

‎spwaitkiller/src/main/java/com/knightboot/spwaitkiller/ProxySWork.java

+12-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import androidx.annotation.NonNull;
88

9-
import java.util.ArrayList;
109
import java.util.LinkedList;
1110

1211
/**
@@ -17,13 +16,13 @@ class ProxySWork<T> extends LinkedList<T> {
1716

1817
private final Handler sHandler;
1918

20-
private final QueueWorkAspect queueWorkAspect;
19+
private final AboveAndroid12Processor aboveAndroid12Processor;
2120

2221
public ProxySWork(LinkedList<T> proxy,
23-
Looper looper, QueueWorkAspect queueWorkAspect) {
22+
Looper looper, AboveAndroid12Processor aboveAndroid12Processor) {
2423
this.proxy = proxy;
2524
sHandler = new Handler(looper);
26-
this.queueWorkAspect = queueWorkAspect;
25+
this.aboveAndroid12Processor = aboveAndroid12Processor;
2726
}
2827

2928
// is thread safe
@@ -65,7 +64,7 @@ public int size() {
6564
//Android 12 change:
6665
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.S){
6766
delegateWork();
68-
this.queueWorkAspect.processPendingWorkDone();
67+
this.aboveAndroid12Processor.reProxySWork();
6968
return 0;
7069
}else {
7170
return proxy.size();
@@ -83,10 +82,15 @@ public boolean isEmpty() {
8382
return true;
8483
}
8584

85+
/**
86+
* Android 12及以上版本的特殊回调处理
87+
*/
88+
interface AboveAndroid12Processor {
8689

87-
interface QueueWorkAspect {
88-
89-
public void processPendingWorkDone();
90+
/**
91+
* 重新代理 sWork字段
92+
*/
93+
public void reProxySWork();
9094

9195
}
9296
}

‎spwaitkiller/src/main/java/com/knightboot/spwaitkiller/SpWaitKiller.java

+21-14
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,15 @@ private void realWork() throws Exception {
101101
}
102102
}
103103

104-
private static class QueueWorksWorkFieldHooker implements ProxySWork.QueueWorkAspect {
104+
private static class QueueWorksWorkFieldHooker implements ProxySWork.AboveAndroid12Processor {
105105

106-
private boolean validate =true;
107-
private Object lock = null;
106+
private boolean reflectionFailed =false;
107+
/**
108+
* sLock对象, 操作
109+
*/
110+
private Object sLock = null;
108111
private Field sWorkField;
109-
private ProxySWork sWorkProxy;
112+
private Looper looper;
110113

111114
@SuppressLint("SoonBlockedPrivateApi")
112115
public QueueWorksWorkFieldHooker(){
@@ -116,36 +119,40 @@ public QueueWorksWorkFieldHooker(){
116119
method.setAccessible(true);
117120

118121
Handler handler = (android.os.Handler) method.invoke(null);
119-
Looper looper = handler.getLooper();
122+
looper = handler.getLooper();
120123

121124
sWorkField = QueuedWorkClass.getDeclaredField("sWork");
122125
sWorkField.setAccessible(true);
123126
Field sLockField = QueuedWorkClass.getDeclaredField("sLock");
124127
sLockField.setAccessible(true);
125-
lock = sLockField.get(null);
126-
LinkedList sWork = (LinkedList) sWorkField.get(null);
127-
sWorkProxy = new ProxySWork(sWork, looper, this);
128+
sLock = sLockField.get(null);
128129
} catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException | NoSuchMethodException | InvocationTargetException e) {
129-
validate = false;
130+
reflectionFailed = true;
130131
}
131132

132133
}
133134

134-
public void proxyWork(){
135-
if (!validate){
135+
private void proxyWork(){
136+
if (reflectionFailed){
136137
return;
137138
}
138-
synchronized (lock){
139+
synchronized (sLock){
140+
//Android12以下,sWork自始至终是同一个对象
139141
try {
142+
LinkedList sWork = (LinkedList) sWorkField.get(null);
143+
ProxySWork sWorkProxy = new ProxySWork(sWork, looper, this);
140144
sWorkField.set(null, sWorkProxy);
141145
} catch (IllegalAccessException e) {
142-
validate =false;
146+
reflectionFailed =true;
143147
}
144148
}
145149
}
146150

151+
147152
@Override
148-
public void processPendingWorkDone() {
153+
public void reProxySWork() {
154+
//Android12开始,sWork字段在每次执行ProcessPendingWork时,sWork字段都会重新指向一个新的集合对象
155+
//因此需要重新代理
149156
proxyWork();
150157
}
151158
}

0 commit comments

Comments
 (0)
Failed to load comments.