Skip to content

Commit c1531e7

Browse files
authored
Merge pull request didi#1043 from didi/feat_dokit_android
android:adapt amap data mock. fix memory leak.
2 parents aa156b7 + 830de52 commit c1531e7

File tree

17 files changed

+317
-168
lines changed

17 files changed

+317
-168
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: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -388,27 +388,36 @@ private void initData() {
388388
// 将坐标点换算成地址名称填入起点和终点
389389
searchPoi(mRouteStartNode.getLocation());
390390
mInitRouteStart = true;
391+
392+
GpsMockManager.getInstance().setStatusCallback(this);
391393
}
392394

393395
private void drawRoute() {
394-
if (GpsMockManager.getInstance().getBdMockDrivingRouteLine() != null) {
395-
mBdMapView.setOnMarkerClickListener(mDrivingRouteOverlay);
396-
mDrivingRouteOverlay.setBdMapRouteData(GpsMockManager.getInstance().getBdMockDrivingRouteLine());
397-
mDrivingRouteOverlay.addToMap();
398-
mDrivingRouteOverlay.zoomToSpan();
396+
if (checkRouteMockToggle()) {
397+
if (GpsMockManager.getInstance().getBdMockDrivingRouteLine() != null) {
398+
mBdMapView.setOnMarkerClickListener(mDrivingRouteOverlay);
399+
mDrivingRouteOverlay.setBdMapRouteData(GpsMockManager.getInstance().getBdMockDrivingRouteLine());
400+
mDrivingRouteOverlay.addToMap();
401+
mDrivingRouteOverlay.zoomToSpan();
399402

400-
mTvOriginDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getTotalDistance()));
401-
}
403+
mTvOriginDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getTotalDistance()));
404+
}
402405

403-
if (checkDriftToggle() && GpsMockManager.getInstance().isMockingRoute() && GpsMockManager.getInstance().getBdMockDrivingRouteLine() != null) {
404-
if (mCurDriftTypeIndex == DriftType.DRIFT_TYPE_ROUTE.ordinal()) {
405-
mDrivingRouteOverlay.addDriftRouteToMap(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRouteDriftPoints(), OverlayManager.COLOR_ROUTE_DRIFT);
406-
mTvMockDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRouteDriftDistance()));
406+
if (checkDriftToggle()) {
407+
if (GpsMockManager.getInstance().getBdMockDrivingRouteLine() != null) {
408+
if (mCurDriftTypeIndex == DriftType.DRIFT_TYPE_ROUTE.ordinal()) {
409+
mDrivingRouteOverlay.addDriftRouteToMap(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRouteDriftPoints(), OverlayManager.COLOR_ROUTE_DRIFT);
410+
mTvMockDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRouteDriftDistance()));
411+
} else {
412+
mDrivingRouteOverlay.addDriftRandomRouteToMap(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRandomDriftPoints(), OverlayManager.COLOR_ROUTE_DRIFT);
413+
mTvMockDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRandomDriftDistance()));
414+
}
415+
}
407416
} else {
408-
mDrivingRouteOverlay.addDriftRandomRouteToMap(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRandomDriftPoints(), OverlayManager.COLOR_ROUTE_DRIFT);
409-
mTvMockDistance.setText(String.valueOf(GpsMockManager.getInstance().getBdMockDrivingRouteLine().getRandomDriftDistance()));
417+
mDrivingRouteOverlay.removeDriftRouteFromMap();
410418
}
411-
419+
} else {
420+
mDrivingRouteOverlay.removeAllRouteFromMap();
412421
}
413422
}
414423

@@ -585,6 +594,7 @@ private void onRouteMockCbChange(boolean isChecked) {
585594

586595
saveMockToggle();
587596
GpsMockConfig.putRouteMockOpen(isChecked);
597+
drawRoute();
588598
}
589599

590600
/**
@@ -606,8 +616,15 @@ private boolean checkDriftToggle() {
606616
}
607617

608618
private void onRouteDriftMockCbChange(boolean isChecked) {
619+
if (!isChecked && GpsMockManager.getInstance().isMockingRoute()) {
620+
mCbToggleRouteDriftMock.setChecked(true);
621+
ToastUtils.showShort("轨迹模拟正在进行, 请先取消");
622+
return;
623+
}
624+
609625
showDriftLayout(isChecked);
610626
GpsMockConfig.putRouteDriftMockOpen(isChecked);
627+
drawRoute();
611628
}
612629

613630
private float getInputSpeed() {
@@ -1001,18 +1018,32 @@ public void onDestroy() {
10011018
DoKit.removeFloating(RouteMockDokitView.class);
10021019
}
10031020

1004-
super.onDestroy();
1021+
if (mRootView != null) {
1022+
mRootView.removeTransitionListener(this);
1023+
}
1024+
10051025
mBdMapView.setMyLocationEnabled(false);
1026+
mBdMapView = null;
10061027
mMapView.onDestroy();
10071028
mMapView = null;
10081029

10091030
if (mBdLocationClient != null) {
1031+
mBdLocationClient.stop();
10101032
mBdLocationClient.unRegisterLocationListener(mBDAbstractLocationListener);
1033+
mBdLocationClient = null;
10111034
}
10121035

10131036
if (mRoutePlanSearch != null) {
10141037
mRoutePlanSearch.destroy();
1038+
mRoutePlanSearch = null;
10151039
}
1040+
1041+
if (mGeoCoder != null) {
1042+
mGeoCoder.destroy();
1043+
mGeoCoder = null;
1044+
}
1045+
GpsMockManager.getInstance().removeStatusCallback();
1046+
super.onDestroy();
10161047
}
10171048

10181049
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: 19 additions & 7 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) {
@@ -188,15 +200,15 @@ object GpsMockProxyManager {
188200
for (aMapLocationChangedListenerProxy in mAMapLocationChangedListenerProxies) {
189201
aMapLocationChangedListenerProxy?.onLocationChanged(location)
190202
}
191-
if (GpsMockManager.mockAMapNavLocation()) {
203+
// if (GpsMockManager.getInstance().isMockingRoute) {
192204
for (aMapNaviListenerProxy in mAMapNaviListenerProxies) {
193205
aMapNaviListenerProxy?.onLocationChange(
194206
LocationBuilder.toAMapNaviLocation(
195207
location
196208
)
197209
)
198210
}
199-
}
211+
// }
200212

201213

202214
}

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
}

0 commit comments

Comments
 (0)