Skip to content

Commit 830de52

Browse files
committed
fix(Android):fix gps mock module related memory leak.
1 parent b9bdf47 commit 830de52

File tree

7 files changed

+108
-82
lines changed

7 files changed

+108
-82
lines changed

Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommClassTransformer.kt

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,9 @@ class CommClassTransformer : AbsClassTransformer() {
106106
it.name == "unRegisterLocationListener"
107107
}.let { methodNode ->
108108
"${context.projectDir.lastPath()}->hook amap map succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
109-
methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {
110-
methodNode.instructions.insertBefore(
111-
it,
112-
createAmapLocationUnRegisterInsnList()
113-
)
114-
}
109+
methodNode?.instructions?.insert(
110+
createAmapLocationUnRegisterInsnList()
111+
)
115112
}
116113

117114
//代理getLastKnownLocation
@@ -149,12 +146,9 @@ class CommClassTransformer : AbsClassTransformer() {
149146
it.name == "removeAMapNaviListener"
150147
}.let { methodNode ->
151148
"${context.projectDir.lastPath()}->hook amap map navi succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
152-
methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {
153-
methodNode.instructions.insertBefore(
154-
it,
155-
createAmapNaviUnRegisterInsnList()
156-
)
157-
}
149+
methodNode?.instructions?.insert(
150+
createAmapNaviUnRegisterInsnList()
151+
)
158152
}
159153
}
160154

@@ -175,12 +169,9 @@ class CommClassTransformer : AbsClassTransformer() {
175169
it.name == "removeUpdates"
176170
}.let { methodNode ->
177171
"${context.projectDir.lastPath()}->hook tencent map succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
178-
methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {
179-
methodNode.instructions.insertBefore(
180-
it,
181-
createTencentLocationUnRegisterInsnList()
182-
)
183-
}
172+
methodNode?.instructions?.insert(
173+
createTencentLocationUnRegisterInsnList()
174+
)
184175
}
185176
}
186177

@@ -205,12 +196,9 @@ class CommClassTransformer : AbsClassTransformer() {
205196
it.name == "unRegisterLocationListener" && it.desc == "(Lcom/baidu/location/BDLocationListener;)V"
206197
}.let { methodNode ->
207198
"${context.projectDir.lastPath()}->hook baidu map succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
208-
methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {
209-
methodNode.instructions.insertBefore(
210-
it,
211-
createBDLocationUnRegisterInsnList()
212-
)
213-
}
199+
methodNode?.instructions?.insert(
200+
createBDLocationUnRegisterInsnList()
201+
)
214202
}
215203

216204

@@ -219,12 +207,9 @@ class CommClassTransformer : AbsClassTransformer() {
219207
it.name == "unRegisterLocationListener" && it.desc == "(Lcom/baidu/location/BDAbstractLocationListener;)V"
220208
}.let { methodNode ->
221209
"${context.projectDir.lastPath()}->hook baidu map succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
222-
methodNode?.instructions?.getMethodExitInsnNodes()?.forEach {
223-
methodNode.instructions.insertBefore(
224-
it,
210+
methodNode?.instructions?.insert(
225211
createBDAbsLocationUnRegisterInsnList()
226212
)
227-
}
228213
}
229214
}
230215
}
@@ -850,13 +835,13 @@ class CommClassTransformer : AbsClassTransformer() {
850835
INVOKESTATIC,
851836
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
852837
"unRegisterAmapLocationListener",
853-
"(Lcom/amap/api/location/AMapLocationListener;)V",
838+
"(Lcom/amap/api/location/AMapLocationListener;)Lcom/didichuxing/doraemonkit/gps_mock/map/AMapLocationListenerProxy;",
854839
false
855840
)
856841
)
842+
add(VarInsnNode(ASTORE, 1))
857843
this
858844
}
859-
860845
}
861846

862847
/**
@@ -871,10 +856,11 @@ class CommClassTransformer : AbsClassTransformer() {
871856
INVOKESTATIC,
872857
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
873858
"unRegisterAmapNaviListener",
874-
"(Lcom/amap/api/navi/AMapNaviListener;)V",
859+
"(Lcom/amap/api/navi/AMapNaviListener;)Lcom/didichuxing/doraemonkit/gps_mock/map/AMapNaviListenerProxy;",
875860
false
876861
)
877862
)
863+
add(VarInsnNode(ASTORE, 1))
878864
this
879865
}
880866

@@ -926,10 +912,11 @@ class CommClassTransformer : AbsClassTransformer() {
926912
INVOKESTATIC,
927913
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
928914
"unRegisterTencentLocationListener",
929-
"(Lcom/tencent/map/geolocation/TencentLocationListener;)V",
915+
"(Lcom/tencent/map/geolocation/TencentLocationListener;)Lcom/didichuxing/doraemonkit/gps_mock/map/TencentLocationListenerProxy;",
930916
false
931917
)
932918
)
919+
add(VarInsnNode(ASTORE, 1))
933920
this
934921
}
935922

@@ -1001,10 +988,11 @@ class CommClassTransformer : AbsClassTransformer() {
1001988
INVOKESTATIC,
1002989
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
1003990
"unRegisterBDLocationListener",
1004-
"(Lcom/baidu/location/BDLocationListener;)V",
991+
"(Lcom/baidu/location/BDLocationListener;)Lcom/didichuxing/doraemonkit/gps_mock/map/BDLocationListenerProxy;",
1005992
false
1006993
)
1007994
)
995+
add(VarInsnNode(ASTORE, 1))
1008996
this
1009997
}
1010998

@@ -1022,10 +1010,12 @@ class CommClassTransformer : AbsClassTransformer() {
10221010
INVOKESTATIC,
10231011
"com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil",
10241012
"unRegisterBDLocationListener",
1025-
"(Lcom/baidu/location/BDAbstractLocationListener;)V",
1013+
"(Lcom/baidu/location/BDAbstractLocationListener;)Lcom/didichuxing/doraemonkit/gps_mock/map/BDAbsLocationListenerProxy;",
10261014
false
10271015
)
10281016
)
1017+
//对第一个参数进行重新赋值
1018+
add(VarInsnNode(ASTORE, 1))
10291019
this
10301020
}
10311021

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockFragment.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,8 @@ private void initData() {
388388
// 将坐标点换算成地址名称填入起点和终点
389389
searchPoi(mRouteStartNode.getLocation());
390390
mInitRouteStart = true;
391+
392+
GpsMockManager.getInstance().setStatusCallback(this);
391393
}
392394

393395
private void drawRoute() {
@@ -1016,18 +1018,32 @@ public void onDestroy() {
10161018
DoKit.removeFloating(RouteMockDokitView.class);
10171019
}
10181020

1019-
super.onDestroy();
1021+
if (mRootView != null) {
1022+
mRootView.removeTransitionListener(this);
1023+
}
1024+
10201025
mBdMapView.setMyLocationEnabled(false);
1026+
mBdMapView = null;
10211027
mMapView.onDestroy();
10221028
mMapView = null;
10231029

10241030
if (mBdLocationClient != null) {
1031+
mBdLocationClient.stop();
10251032
mBdLocationClient.unRegisterLocationListener(mBDAbstractLocationListener);
1033+
mBdLocationClient = null;
10261034
}
10271035

10281036
if (mRoutePlanSearch != null) {
10291037
mRoutePlanSearch.destroy();
1038+
mRoutePlanSearch = null;
1039+
}
1040+
1041+
if (mGeoCoder != null) {
1042+
mGeoCoder.destroy();
1043+
mGeoCoder = null;
10301044
}
1045+
GpsMockManager.getInstance().removeStatusCallback();
1046+
super.onDestroy();
10311047
}
10321048

10331049
public static enum DriftMode {

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockManager.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,18 @@ public void startMockRouteLine(List<com.baidu.mapapi.model.LatLng> points, doubl
189189
}
190190
}
191191

192+
public void setStatusCallback(RouteMockThread.RouteMockStatusCallback statusCallback){
193+
if (mRouteMockThread != null){
194+
mRouteMockThread.setRouteMockStatusCallback(statusCallback);
195+
}
196+
}
197+
198+
public void removeStatusCallback(){
199+
if (mRouteMockThread != null){
200+
mRouteMockThread.clearRouteMockStatusCallback();
201+
}
202+
}
203+
192204
/**
193205
* 停止模拟.
194206
*/

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockProxyManager.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,54 +64,66 @@ object GpsMockProxyManager {
6464
mLocationListenerProxies.add(locationListenerProxy)
6565
}
6666

67-
fun removeAMapLocationListener(listener: AMapLocationListener) {
67+
fun removeAMapLocationListener(listener: AMapLocationListener):AMapLocationListenerProxy? {
6868
val it = mAMapLocationListenerProxies.iterator()
6969
while (it.hasNext()) {
7070
val proxy = it.next()
7171
if (proxy?.aMapLocationListener === listener) {
7272
it.remove()
73+
return proxy
7374
}
7475
}
76+
return null
7577
}
7678

77-
fun removeAMapNaviListener(listener: AMapNaviListener) {
79+
fun removeAMapNaviListener(listener: AMapNaviListener) :AMapNaviListenerProxy?{
7880
val it = mAMapNaviListenerProxies.iterator()
7981
while (it.hasNext()) {
8082
val proxy = it.next()
8183
if (proxy?.aMapNaviListener === listener) {
8284
it.remove()
85+
return proxy
8386
}
8487
}
88+
89+
return null
8590
}
8691

87-
fun removeTencentLocationListener(listener: TencentLocationListener) {
92+
fun removeTencentLocationListener(listener: TencentLocationListener) :TencentLocationListenerProxy?{
8893
val it = mTencentLocationListenerProxies.iterator()
8994
while (it.hasNext()) {
9095
val proxy = it.next()
9196
if (proxy?.mTencentLocationListener === listener) {
9297
it.remove()
98+
return proxy
9399
}
94100
}
101+
return null
95102
}
96103

97-
fun removeBDLocationListener(listener: BDLocationListener) {
104+
fun removeBDLocationListener(listener: BDLocationListener):BDLocationListenerProxy? {
98105
val it = mBDLocationListenerProxies.iterator()
99106
while (it.hasNext()) {
100107
val proxy = it.next()
101108
if (proxy?.mBdLocationListener === listener) {
102109
it.remove()
110+
return proxy
103111
}
104112
}
113+
114+
return null
105115
}
106116

107-
fun removeBDAbsLocationListener(listener: BDAbstractLocationListener) {
117+
fun removeBDAbsLocationListener(listener: BDAbstractLocationListener): BDAbsLocationListenerProxy? {
108118
val it = mBDAbsLocationListenerProxies.iterator()
109119
while (it.hasNext()) {
110120
val proxy = it.next()
111121
if (proxy?.mBdLocationListener === listener) {
112122
it.remove()
123+
return proxy
113124
}
114125
}
126+
return null
115127
}
116128

117129
fun removeLocationListener(listener: LocationListener) {

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/RouteMockThread.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ public void setRouteMockStatusCallback(RouteMockStatusCallback routeMockStatusCa
108108
mRouteMockStatusCallback = routeMockStatusCallback;
109109
}
110110

111+
public void clearRouteMockStatusCallback(){
112+
mRouteMockStatusCallback = null;
113+
}
114+
111115
public interface RouteMockStatusCallback{
112116
void onRouteMockFinish();
113117
}

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,24 @@
1919
* ================================================
2020
*/
2121
public class ThirdMapLocationListenerUtil {
22-
public static void unRegisterAmapLocationListener(AMapLocationListener locationListener) {
23-
GpsMockProxyManager.INSTANCE.removeAMapLocationListener(locationListener);
22+
public static AMapLocationListenerProxy unRegisterAmapLocationListener(AMapLocationListener locationListener) {
23+
return GpsMockProxyManager.INSTANCE.removeAMapLocationListener(locationListener);
2424
}
2525

26-
public static void unRegisterAmapNaviListener(AMapNaviListener naviListener) {
27-
GpsMockProxyManager.INSTANCE.removeAMapNaviListener(naviListener);
26+
public static AMapNaviListenerProxy unRegisterAmapNaviListener(AMapNaviListener naviListener) {
27+
return GpsMockProxyManager.INSTANCE.removeAMapNaviListener(naviListener);
2828
}
2929

30-
public static void unRegisterTencentLocationListener(TencentLocationListener locationListener) {
31-
GpsMockProxyManager.INSTANCE.removeTencentLocationListener(locationListener);
30+
public static TencentLocationListenerProxy unRegisterTencentLocationListener(TencentLocationListener locationListener) {
31+
return GpsMockProxyManager.INSTANCE.removeTencentLocationListener(locationListener);
3232
}
3333

34-
public static void unRegisterBDLocationListener(BDLocationListener locationListener) {
35-
GpsMockProxyManager.INSTANCE.removeBDLocationListener(locationListener);
34+
public static BDLocationListenerProxy unRegisterBDLocationListener(BDLocationListener locationListener) {
35+
return GpsMockProxyManager.INSTANCE.removeBDLocationListener(locationListener);
3636
}
3737

38-
public static void unRegisterBDLocationListener(BDAbstractLocationListener locationListener) {
39-
GpsMockProxyManager.INSTANCE.removeBDAbsLocationListener(locationListener);
38+
public static BDAbsLocationListenerProxy unRegisterBDLocationListener(BDAbstractLocationListener locationListener) {
39+
return GpsMockProxyManager.INSTANCE.removeBDAbsLocationListener(locationListener);
4040
}
4141

4242
public static void unRegisterDMapLocationListener(DMapLocationListener locationListener){

0 commit comments

Comments
 (0)