Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DiDi
DoraemonKit
提交
1c7d9de7
D
DoraemonKit
项目概览
DiDi
/
DoraemonKit
10 个月 前同步成功
通知
166
Star
19623
Fork
3062
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
DoraemonKit
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
1c7d9de7
编写于
3月 19, 2021
作者:
J
jackjintai
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
modify:
[Android]-Hook AMap lastKnowLocation
上级
5d80f61e
变更
14
展开全部
隐藏空白更改
内联
并排
Showing
14 changed file
with
616 addition
and
564 deletion
+616
-564
Android/java/app/build.gradle
Android/java/app/build.gradle
+5
-5
Android/java/app/src/debug/java/com/didichuxing/doraemondemo/MainDebugActivityOkhttpV3.kt
...com/didichuxing/doraemondemo/MainDebugActivityOkhttpV3.kt
+3
-7
Android/java/app/src/main/java/com/didichuxing/doraemondemo/AopTest.java
...p/src/main/java/com/didichuxing/doraemondemo/AopTest.java
+13
-15
Android/java/app/src/main/java/com/didichuxing/doraemondemo/MapActivity.kt
...src/main/java/com/didichuxing/doraemondemo/MapActivity.kt
+301
-301
Android/java/app/src/main/java/com/didichuxing/doraemondemo/MapShowingLocationActivity.kt
...om/didichuxing/doraemondemo/MapShowingLocationActivity.kt
+158
-158
Android/java/app/src/main/java/com/didichuxing/doraemondemo/amap/AMapRouterFragment.kt
...a/com/didichuxing/doraemondemo/amap/AMapRouterFragment.kt
+3
-2
Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt
...ng/doraemonkit/plugin/classtransformer/CommTransformer.kt
+38
-0
Android/java/config.gradle
Android/java/config.gradle
+3
-3
Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt
...ng/doraemonkit/plugin/classtransformer/CommTransformer.kt
+38
-0
Android/java/doraemonkit/build.gradle
Android/java/doraemonkit/build.gradle
+0
-2
Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/DoraemonKitReal.kt
.../main/java/com/didichuxing/doraemonkit/DoraemonKitReal.kt
+0
-23
Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/aop/map/AMapLocationClientProxy.java
...ichuxing/doraemonkit/aop/map/AMapLocationClientProxy.java
+52
-0
Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/hook/AMapClientLastLocationHook.kt
...idichuxing/doraemonkit/hook/AMapClientLastLocationHook.kt
+0
-42
Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/gpsmock/GpsMockFragment.java
.../didichuxing/doraemonkit/kit/gpsmock/GpsMockFragment.java
+2
-6
未找到文件。
Android/java/app/build.gradle
浏览文件 @
1c7d9de7
...
...
@@ -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
{
...
...
Android/java/app/src/debug/java/com/didichuxing/doraemondemo/MainDebugActivityOkhttpV3.kt
浏览文件 @
1c7d9de7
...
...
@@ -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
=
...
...
Android/java/app/src/main/java/com/didichuxing/doraemondemo/AopTest.java
浏览文件 @
1c7d9de7
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"
;
}
}
Android/java/app/src/main/java/com/didichuxing/doraemondemo/MapActivity.kt
浏览文件 @
1c7d9de7
此差异已折叠。
点击以展开。
Android/java/app/src/main/java/com/didichuxing/doraemondemo/MapShowingLocationActivity.kt
浏览文件 @
1c7d9de7
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
Android/java/app/src/main/java/com/didichuxing/doraemondemo/amap/AMapRouterFragment.kt
浏览文件 @
1c7d9de7
...
...
@@ -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
(
...
...
Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt
浏览文件 @
1c7d9de7
...
...
@@ -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代码指令
*/
...
...
Android/java/config.gradle
浏览文件 @
1c7d9de7
...
...
@@ -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"
,
...
...
Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt
浏览文件 @
1c7d9de7
...
...
@@ -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代码指令
*/
...
...
Android/java/doraemonkit/build.gradle
浏览文件 @
1c7d9de7
...
...
@@ -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"
]
//函数耗时
...
...
Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/DoraemonKitReal.kt
浏览文件 @
1c7d9de7
...
...
@@ -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
)
{
}
}
/**
...
...
Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/aop/map/AMapLocationClientProxy.java
0 → 100644
浏览文件 @
1c7d9de7
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
;
}
}
Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/hook/AMapClientLastLocationHook.kt
已删除
100644 → 0
浏览文件 @
5d80f61e
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
Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/gpsmock/GpsMockFragment.java
浏览文件 @
1c7d9de7
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录