提交 1c7d9de7 编写于 作者: J jackjintai

modify:

[Android]-Hook AMap lastKnowLocation
上级 5d80f61e
......@@ -174,15 +174,15 @@ dependencies {
implementation rootProject.ext.dependencies["amap_search"]
implementation rootProject.ext.dependencies["amap_navi"]
//腾讯地图定位
implementation rootProject.ext.dependencies["tencent_location"]
implementation rootProject.ext.dependencies["tencent_map"]
implementation rootProject.ext.dependencies["tencent_map_util"]
// implementation rootProject.ext.dependencies["tencent_location"]
// implementation rootProject.ext.dependencies["tencent_map"]
// implementation rootProject.ext.dependencies["tencent_map_util"]
// debugImplementation rootProject.ext.dependencies["leakcanary-android"]
//百度地图定位
implementation files('libs/BaiduLBS_Android.jar')
// implementation files('libs/BaiduLBS_Android.jar')
//腾讯x5
implementation rootProject.ext.dependencies["tbs"]
implementation rootProject.ext.dependencies["tencent-map"]
}
configurations.all {
......
......@@ -128,7 +128,7 @@ class MainDebugActivityOkhttpV3 : BaseActivity(), View.OnClickListener {
githubService = retrofit.create(GithubService::class.java)
AopTest().test()
// AopTest().test()
}
private fun test1() {
......@@ -218,12 +218,8 @@ class MainDebugActivityOkhttpV3 : BaseActivity(), View.OnClickListener {
}
R.id.btn_location -> startNormaLocation()
R.id.btn_path_amap -> CommLauncher.startActivity(AMapRouterFragment::class.java)
R.id.btn_location_map2 -> startActivity(
Intent(
this,
MapShowingLocationActivity::class.java
)
)
// R.id.btn_location_map2 -> startActivity(Intent(
// this, MapShowingLocationActivity::class.java))
R.id.btn_load_img -> {
//Glide 加载
val picassoImgUrl =
......
package com.didichuxing.doraemondemo;
import java.util.HashMap;
import android.content.Context;
import com.amap.api.location.AMapLocation;
import com.didichuxing.doraemonkit.aop.map.AMapLocationClientProxy;
import com.didichuxing.doraemonkit.util.LogHelper;
import com.loc.d;
/**
* ================================================
......@@ -12,25 +17,18 @@ import java.util.HashMap;
* ================================================
*/
public class AopTest {
private static final String TAG = "AopTest";
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastKnownLocation() {
String s = getDoKit();
s.toString();
return s;
}
public void test() {
HashMap<String, String> map = new HashMap<>();
map.put("a", "a");
map.put("b", "b");
map.put("c", "c");
public String getDoKit() {
return "DoKit";
}
}
package com.didichuxing.doraemondemo
import android.Manifest
import android.annotation.SuppressLint
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.baidu.location.BDAbstractLocationListener
import com.baidu.location.BDLocation
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.didichuxing.doraemonkit.kit.core.ViewSetupHelper
import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory
import com.tencent.tencentmap.mapsdk.maps.SupportMapFragment
import com.tencent.tencentmap.mapsdk.maps.TencentMap
import com.tencent.tencentmap.mapsdk.maps.model.*
import pub.devrel.easypermissions.EasyPermissions
import pub.devrel.easypermissions.PermissionRequest
class MapShowingLocationActivity : AppCompatActivity() {
private lateinit var mRootView: View
private var mTencentMap: TencentMap? = null
private var mBaiduLocationClient: LocationClient? = null
private var mCustomMarker: Marker? = null
private var mLocationMarker: Marker? = null
private var mAccuracyCircle: Circle? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_map_showing_location)
mRootView = findViewById<View>(R.id.map_showing_location)
initMap()
initButtons()
EasyPermissions.requestPermissions(
PermissionRequest.Builder(
this, 200,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
).build()
)
}
private fun initMap() {
val manager = supportFragmentManager
val fragment = manager.findFragmentById(R.id.fragment_map) as SupportMapFragment?
if (fragment != null) {
mTencentMap = fragment.map
}
}
private fun initButtons() {
ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_1, "添加") {
setMarker(40.011313, 116.391907)
}
ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_2, "移除") {
removeMarker()
}
ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_3, "归位") {
if (mCustomMarker != null) mTencentMap?.animateCamera(CameraUpdateFactory.newLatLng(mCustomMarker?.position))
}
ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_4, "启动定位") {
startLocation()
}
ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_5, "停止定位") {
stopLocation()
}
}
private var mbdLocationListener: BDAbstractLocationListener =
object : BDAbstractLocationListener() {
override fun onReceiveLocation(bdLocation: BDLocation) {
Log.i(TAG, "百度定位===onReceiveLocation===lat==>" + bdLocation.latitude + " lng==>" + bdLocation.longitude)
setLocationMarker(bdLocation.latitude, bdLocation.longitude, 100f.toDouble())
}
}
@SuppressLint("MissingPermission")
private fun startLocation() {
//百度地图
if (mBaiduLocationClient == null) {
mBaiduLocationClient = LocationClient(this)
//通过LocationClientOption设置LocationClient相关参数
val option = LocationClientOption()
// 打开gps
option.isOpenGps = true
// 设置坐标类型
option.setCoorType("gcj02")
option.setScanSpan(5000)
mBaiduLocationClient!!.locOption = option
mBaiduLocationClient!!.registerLocationListener(mbdLocationListener)
}
mBaiduLocationClient?.start()
}
private fun stopLocation() {
if (mBaiduLocationClient == null) return
mBaiduLocationClient?.stop()
}
private fun setMarker(lat: Double, lng: Double) {
val position = LatLng(lat, lng)
mCustomMarker?.remove()
mCustomMarker = mTencentMap?.addMarker(MarkerOptions(position))
mTencentMap?.animateCamera(CameraUpdateFactory.newLatLng(position))
}
private fun setLocationMarker(lat: Double, lng: Double) {
val position = LatLng(lat, lng)
if (mLocationMarker == null) {
val markerOptions = MarkerOptions(position)
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.dk_location_marker))
mLocationMarker = mTencentMap?.addMarker(markerOptions)
} else {
mLocationMarker?.position = position
}
mTencentMap?.animateCamera(CameraUpdateFactory.newLatLng(position))
}
private fun setLocationMarker(lat: Double, lng: Double, radius: Double) {
val position = LatLng(lat, lng)
if (mLocationMarker == null) {
val markerOptions = MarkerOptions(position)
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.dk_location_marker))
mLocationMarker = mTencentMap?.addMarker(markerOptions)
mAccuracyCircle = mTencentMap?.addCircle(
CircleOptions().center(position)
.radius(radius)
.fillColor(resources.getColor(R.color.colorCircleMarkerFill))
.strokeColor(resources.getColor(R.color.colorCircleMarkerStroke))
)
} else {
mLocationMarker?.position = position
mAccuracyCircle?.center = position
mAccuracyCircle?.radius = radius
}
mTencentMap?.animateCamera(CameraUpdateFactory.newLatLng(position))
}
private fun removeMarker() {
mCustomMarker?.remove()
mCustomMarker = null
}
override fun onDestroy() {
super.onDestroy()
stopLocation()
}
companion object {
const val TAG = "MapShowingLocationActivity"
}
}
\ No newline at end of file
//package com.didichuxing.doraemondemo
//
//import android.Manifest
//import android.annotation.SuppressLint
//import android.os.Bundle
//import android.util.Log
//import android.view.View
//import androidx.appcompat.app.AppCompatActivity
//import com.baidu.location.BDAbstractLocationListener
//import com.baidu.location.BDLocation
//import com.baidu.location.LocationClient
//import com.baidu.location.LocationClientOption
//import com.didichuxing.doraemonkit.kit.core.ViewSetupHelper
//import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory
//import com.tencent.tencentmap.mapsdk.maps.SupportMapFragment
//import com.tencent.tencentmap.mapsdk.maps.TencentMap
//import com.tencent.tencentmap.mapsdk.maps.model.*
//import pub.devrel.easypermissions.EasyPermissions
//import pub.devrel.easypermissions.PermissionRequest
//
//
//class MapShowingLocationActivity : AppCompatActivity() {
// private lateinit var mRootView: View
// private var mTencentMap: TencentMap? = null
// private var mBaiduLocationClient: LocationClient? = null
// private var mCustomMarker: Marker? = null
// private var mLocationMarker: Marker? = null
// private var mAccuracyCircle: Circle? = null
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_map_showing_location)
// mRootView = findViewById<View>(R.id.map_showing_location)
// initMap()
// initButtons()
// EasyPermissions.requestPermissions(
// PermissionRequest.Builder(
// this, 200,
// Manifest.permission.ACCESS_FINE_LOCATION,
// Manifest.permission.ACCESS_COARSE_LOCATION,
// Manifest.permission.READ_EXTERNAL_STORAGE,
// Manifest.permission.WRITE_EXTERNAL_STORAGE
// ).build()
// )
// }
//
// private fun initMap() {
// val manager = supportFragmentManager
// val fragment = manager.findFragmentById(R.id.fragment_map) as SupportMapFragment?
// if (fragment != null) {
// mTencentMap = fragment.map
// }
// }
//
//
// private fun initButtons() {
// ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_1, "添加") {
// setMarker(40.011313, 116.391907)
// }
// ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_2, "移除") {
// removeMarker()
// }
// ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_3, "归位") {
// if (mCustomMarker != null) mTencentMap?.animateCamera(CameraUpdateFactory.newLatLng(mCustomMarker?.position))
// }
// ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_4, "启动定位") {
// startLocation()
// }
// ViewSetupHelper.setupButton(mRootView, R.id.map_test_btn_5, "停止定位") {
// stopLocation()
// }
// }
//
// private var mbdLocationListener: BDAbstractLocationListener =
// object : BDAbstractLocationListener() {
// override fun onReceiveLocation(bdLocation: BDLocation) {
// Log.i(TAG, "百度定位===onReceiveLocation===lat==>" + bdLocation.latitude + " lng==>" + bdLocation.longitude)
// setLocationMarker(bdLocation.latitude, bdLocation.longitude, 100f.toDouble())
// }
// }
//
// @SuppressLint("MissingPermission")
// private fun startLocation() {
// //百度地图
// if (mBaiduLocationClient == null) {
// mBaiduLocationClient = LocationClient(this)
// //通过LocationClientOption设置LocationClient相关参数
// val option = LocationClientOption()
// // 打开gps
// option.isOpenGps = true
// // 设置坐标类型
// option.setCoorType("gcj02")
// option.setScanSpan(5000)
// mBaiduLocationClient!!.locOption = option
// mBaiduLocationClient!!.registerLocationListener(mbdLocationListener)
// }
// mBaiduLocationClient?.start()
// }
//
// private fun stopLocation() {
// if (mBaiduLocationClient == null) return
// mBaiduLocationClient?.stop()
// }
//
// private fun setMarker(lat: Double, lng: Double) {
// val position = LatLng(lat, lng)
// mCustomMarker?.remove()
// mCustomMarker = mTencentMap?.addMarker(MarkerOptions(position))
// mTencentMap?.animateCamera(CameraUpdateFactory.newLatLng(position))
// }
//
// private fun setLocationMarker(lat: Double, lng: Double) {
// val position = LatLng(lat, lng)
// if (mLocationMarker == null) {
// val markerOptions = MarkerOptions(position)
// .icon(BitmapDescriptorFactory.fromResource(R.mipmap.dk_location_marker))
// mLocationMarker = mTencentMap?.addMarker(markerOptions)
// } else {
// mLocationMarker?.position = position
// }
// mTencentMap?.animateCamera(CameraUpdateFactory.newLatLng(position))
// }
//
// private fun setLocationMarker(lat: Double, lng: Double, radius: Double) {
// val position = LatLng(lat, lng)
// if (mLocationMarker == null) {
// val markerOptions = MarkerOptions(position)
// .icon(BitmapDescriptorFactory.fromResource(R.mipmap.dk_location_marker))
// mLocationMarker = mTencentMap?.addMarker(markerOptions)
// mAccuracyCircle = mTencentMap?.addCircle(
// CircleOptions().center(position)
// .radius(radius)
// .fillColor(resources.getColor(R.color.colorCircleMarkerFill))
// .strokeColor(resources.getColor(R.color.colorCircleMarkerStroke))
// )
// } else {
// mLocationMarker?.position = position
// mAccuracyCircle?.center = position
// mAccuracyCircle?.radius = radius
// }
// mTencentMap?.animateCamera(CameraUpdateFactory.newLatLng(position))
// }
//
//
// private fun removeMarker() {
// mCustomMarker?.remove()
// mCustomMarker = null
// }
//
// override fun onDestroy() {
// super.onDestroy()
// stopLocation()
// }
//
// companion object {
// const val TAG = "MapShowingLocationActivity"
// }
//}
\ No newline at end of file
......@@ -45,12 +45,13 @@ class AMapRouterFragment : CommBaseFragment() {
* 初始化高德地图的定位
*/
private fun initAMapLocation() {
mAmap.minZoomLevel = 14.0f
mAmap.minZoomLevel = 6.0f
//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
val myLocationStyle = MyLocationStyle()
//设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒
myLocationStyle.interval(20000)
myLocationStyle.interval(1000L)
myLocationStyle.myLocationType(5)
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE)
myLocationStyle.myLocationIcon(
com.amap.api.maps.model.BitmapDescriptorFactory.fromResource(
......
......@@ -8,6 +8,7 @@ import com.didiglobal.booster.transform.TransformContext
import com.didiglobal.booster.transform.asm.ClassTransformer
import com.didiglobal.booster.transform.asm.className
import com.google.auto.service.AutoService
import org.objectweb.asm.Label
import org.objectweb.asm.Opcodes.*
import org.objectweb.asm.tree.*
......@@ -91,6 +92,19 @@ class CommTransformer : ClassTransformer {
}
}
//代理getLastKnownLocation
klass.methods?.find {
it.name == "getLastKnownLocation"
}.let { methodNode ->
"${context.projectDir.lastPath()}->hook AMapLocationClient getLastKnownLocation succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
// methodNode?.instructions?.clear()
// for (instruction in methodNode!!.instructions) {
//// methodNode.instructions.remove(instruction)
// println("getLastKnownLocation===>${instruction.opcode}")
// }
methodNode?.instructions?.insert(createAMapClientLastKnownLocation())
}
}
//插入高德地图导航相关字节码
......@@ -118,6 +132,7 @@ class CommTransformer : ClassTransformer {
}
//插入腾讯地图相关字节码
if (className == "com.tencent.map.geolocation.TencentLocationManager") {
//持续定位和单次定位
......@@ -703,6 +718,29 @@ class CommTransformer : ClassTransformer {
}
/**
* 创建AMapLocationClient#LastKnownLocation 字节码替换
*/
private fun createAMapClientLastKnownLocation(): InsnList {
return with(InsnList()) {
add(VarInsnNode(ALOAD, 0))
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/map/AMapLocationClientProxy",
"getLastKnownLocation",
"(Lcom/amap/api/location/AMapLocationClient;)Lcom/amap/api/location/AMapLocation;",
false
)
)
// add(VarInsnNode(ASTORE, 1))
// add(VarInsnNode(ALOAD, 1))
add(InsnNode(ARETURN))
this
}
}
/**
* 创建Amap地图UnRegister代码指令
*/
......
......@@ -4,12 +4,12 @@ ext {
//0:发布到到本地localRepoURL仓库
//1:发布到滴滴内部仓库 一般不建议使用 如果需要发布到滴滴内网仓库需要将版本号改得比较大 假如版本号跟jcenter上的一致会由于缓存导致没法下载最新的jcenter的线上代码
//2:发布到jcenter远程仓库
archives_type: 1,
archives_type: 0,
//0:依赖dokit本地module运行
//1:依赖dokit远程aar运行
run_type : 0,
group_id : 'com.didichuxing.doraemonkit',
version : '3.3.6-SNAPSHOT'
version : '3.3.7'
]
android = [compileSdkVersion : 29,
......@@ -24,7 +24,7 @@ ext {
kotlin_version : "1.3.72",
booster_version : "3.0.0",
jcenter_gradle_plugin_version: "3.5.3",
gradle_plugin_version : "4.1.2",
gradle_plugin_version : "4.1.3",
ktor : "1.5.1",
okhttp_v2 : "2.7.5",
okhttp_v3 : "3.14.7",
......
......@@ -8,6 +8,7 @@ import com.didiglobal.booster.transform.TransformContext
import com.didiglobal.booster.transform.asm.ClassTransformer
import com.didiglobal.booster.transform.asm.className
import com.google.auto.service.AutoService
import org.objectweb.asm.Label
import org.objectweb.asm.Opcodes.*
import org.objectweb.asm.tree.*
......@@ -91,6 +92,19 @@ class CommTransformer : ClassTransformer {
}
}
//代理getLastKnownLocation
klass.methods?.find {
it.name == "getLastKnownLocation"
}.let { methodNode ->
"${context.projectDir.lastPath()}->hook AMapLocationClient getLastKnownLocation succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println()
// methodNode?.instructions?.clear()
// for (instruction in methodNode!!.instructions) {
//// methodNode.instructions.remove(instruction)
// println("getLastKnownLocation===>${instruction.opcode}")
// }
methodNode?.instructions?.insert(createAMapClientLastKnownLocation())
}
}
//插入高德地图导航相关字节码
......@@ -118,6 +132,7 @@ class CommTransformer : ClassTransformer {
}
//插入腾讯地图相关字节码
if (className == "com.tencent.map.geolocation.TencentLocationManager") {
//持续定位和单次定位
......@@ -703,6 +718,29 @@ class CommTransformer : ClassTransformer {
}
/**
* 创建AMapLocationClient#LastKnownLocation 字节码替换
*/
private fun createAMapClientLastKnownLocation(): InsnList {
return with(InsnList()) {
add(VarInsnNode(ALOAD, 0))
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/map/AMapLocationClientProxy",
"getLastKnownLocation",
"(Lcom/amap/api/location/AMapLocationClient;)Lcom/amap/api/location/AMapLocation;",
false
)
)
// add(VarInsnNode(ASTORE, 1))
// add(VarInsnNode(ALOAD, 1))
add(InsnNode(ARETURN))
this
}
}
/**
* 创建Amap地图UnRegister代码指令
*/
......
......@@ -69,8 +69,6 @@ dependencies {
implementation rootProject.ext.dependencies["activity-ktx"]
implementation rootProject.ext.dependencies["webkit"]
implementation rootProject.ext.dependencies["volley"]
//运行时全局hook
implementation rootProject.ext.dependencies["epic"]
implementation rootProject.ext.dependencies["gson"]
implementation rootProject.ext.dependencies["zxing"]
//函数耗时
......
......@@ -2,14 +2,9 @@ package com.didichuxing.doraemonkit
import android.app.Activity
import android.app.Application
import android.content.Context
import android.os.Build
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import android.view.accessibility.AccessibilityManager
import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationListener
import com.blankj.utilcode.util.*
import com.blankj.utilcode.util.NetworkUtils.OnNetworkStatusChangedListener
import com.blankj.utilcode.util.ThreadUtils.SimpleTask
......@@ -20,7 +15,6 @@ import com.didichuxing.doraemonkit.config.PerformanceSpInfoConfig
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.constant.SharedPrefsKey
import com.didichuxing.doraemonkit.datapick.DataPickManager
import com.didichuxing.doraemonkit.hook.AMapClientLastLocationHook
import com.didichuxing.doraemonkit.kit.AbstractKit
import com.didichuxing.doraemonkit.kit.alignruler.AlignRulerKit
import com.didichuxing.doraemonkit.kit.blockmonitor.BlockMonitorKit
......@@ -66,8 +60,6 @@ import com.didichuxing.doraemonkit.util.DokitUtil
import com.didichuxing.doraemonkit.util.DoraemonStatisticsUtil
import com.didichuxing.doraemonkit.util.LogHelper
import com.didichuxing.doraemonkit.util.SharedPrefsUtil
import com.loc.d
import de.robv.android.xposed.DexposedBridge
import java.io.File
import java.util.*
......@@ -193,21 +185,6 @@ object DoraemonKitReal {
}
/**
* 全局运行时hook
*/
private fun globalRunTimeHook() {
try {
DexposedBridge.findAndHookMethod(
AMapLocationClient::class.java,
"getLastKnownLocation",
AMapClientLastLocationHook()
)
} catch (e: Exception) {
}
}
/**
......
package com.didichuxing.doraemonkit.aop.map;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationListener;
import com.blankj.utilcode.util.ReflectUtils;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockProxyManager;
import com.didichuxing.doraemonkit.kit.gpsmock.LocationBuilder;
import com.didichuxing.doraemonkit.util.LogHelper;
import com.loc.d;
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2019-12-15-16:18
* 描 述:高德AMapLocationListenerProxy 通过ASM代码动态插入 高德不会跟随系统hook 腾讯和百度会跟随系统的hook
* 修订历史:
* ================================================
*/
public class AMapLocationClientProxy {
private static final String TAG = "AMapLocationClientProxy";
public static AMapLocation getLastKnownLocation(AMapLocationClient client) {
try {
if (client == null) {
return null;
}
if (GpsMockManager.getInstance().isMocking()) {
AMapLocation mapLocation = LocationBuilder.toAMapLocation(new LocationBuilder().build());
mapLocation.setLatitude(GpsMockManager.getInstance().getLatitude());
mapLocation.setLongitude(GpsMockManager.getInstance().getLongitude());
//通过反射强制改变p的值 原因:看mapLocation.setErrorCode
ReflectUtils.reflect(mapLocation).field("p", 0);
mapLocation.setErrorInfo("success");
return mapLocation;
} else {
//AMapLocationClient sdk 源码
com.loc.d b = ReflectUtils.reflect(client).field("b").get();
if (b != null) {
return b.e();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.didichuxing.doraemonkit.hook
import com.amap.api.location.AMapLocation
import com.blankj.utilcode.util.ReflectUtils
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager
import com.didichuxing.doraemonkit.util.LogHelper
import de.robv.android.xposed.XC_MethodHook
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:3/17/21-17:58
* 描 述:
* 修订历史:
* ================================================
*/
class AMapClientLastLocationHook : XC_MethodHook() {
override fun afterHookedMethod(param: MethodHookParam?) {
super.afterHookedMethod(param)
LogHelper.i("AMapClientLastLocationHook", "===afterHookedMethod===")
try {
if (GpsMockManager.getInstance().isMocking) {
param?.let {
if (param.result is AMapLocation) {
(param.result as AMapLocation).apply {
latitude = GpsMockManager.getInstance().latitude
longitude = GpsMockManager.getInstance().longitude
//通过反射强制改变p的值 原因:看mapLocation.setErrorCode
ReflectUtils.reflect(this).field("p", 0)
errorInfo = "success"
}
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
\ No newline at end of file
......@@ -12,26 +12,22 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.amap.api.location.AMapLocationClient;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.config.GpsMockConfig;
import com.didichuxing.doraemonkit.hook.AMapClientLastLocationHook;
import com.didichuxing.doraemonkit.model.LatLng;
import com.didichuxing.doraemonkit.kit.core.BaseFragment;
import com.didichuxing.doraemonkit.kit.core.SettingItem;
import com.didichuxing.doraemonkit.kit.core.SettingItemAdapter;
import com.didichuxing.doraemonkit.model.LatLng;
import com.didichuxing.doraemonkit.util.WebUtil;
import com.didichuxing.doraemonkit.widget.recyclerview.DividerItemDecoration;
import com.didichuxing.doraemonkit.widget.titlebar.HomeTitleBar;
import com.didichuxing.doraemonkit.widget.webview.MyWebView;
import com.didichuxing.doraemonkit.widget.webview.MyWebViewClient;
import com.didichuxing.doraemonkit.util.WebUtil;
import java.util.ArrayList;
import java.util.List;
import de.robv.android.xposed.DexposedBridge;
/**
* Created by wanglikun on 2018/9/20.
* gps mock
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册