diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 9d8d20d50d..5974cf305a 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -84,7 +84,6 @@ diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index f07612f681..5ec595594c 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -86,6 +86,7 @@ public class AMapViewWrapper implements IMogoMapView, private Location mLastDriveLocationShadow = null; private EnumMapUI mCurrentUI; private boolean mIsLightStyle = false; + private boolean mMapLoaded = false; public AMapViewWrapper( MapAutoView mMapView ) { startTime = System.currentTimeMillis(); @@ -345,7 +346,7 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void moveToCenter( MogoLatLng latLng ) { - + moveToCenter( latLng, true ); } private void setUIMode( EnumMapUI ui ) { @@ -698,7 +699,7 @@ public class AMapViewWrapper implements IMogoMapView, } NaviClient.getInstance( getContext() ).syncCarLocation( sysLocation ); - if ( checkAMapView() ) { + if ( checkAMapView() && mMapLoaded ) { // 避免设置之后被其他初始化给重置为其他模式 UiThreadHandler.postDelayed( () -> { MapStyleController.getInstance().onLocationChanged( location, this ); @@ -718,6 +719,7 @@ public class AMapViewWrapper implements IMogoMapView, public void onMapLoaded() { Logger.i( TAG, "autoop--onMapLoaded: " ); MogoMapListenerHandler.getInstance().onMapLoaded(); + mMapLoaded = true; CameraPosition cameraPosition = mMapView.getMapAutoViewHelper().getCameraPosition(); if ( cameraPosition != null ) { Trace.beginSection( "timer.onCameraChangeFinish" ); @@ -727,9 +729,6 @@ public class AMapViewWrapper implements IMogoMapView, cameraPosition.getBearing() ); Trace.endSection(); } - - getMap().getUIController().setAnchorRate( 0.01f ); - getMap().getUIController().setAnchorScale( 1.2f, 2.7f ); } @Override diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java index 4656d28323..5660221fb5 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapApiBuilder.java @@ -99,8 +99,14 @@ class CustomMapApiBuilder implements IMogoMapApiBuilder { .setZoom( 16 ) .setPointToCenter( 0.734375f, 0.5f ) .setStyleMode( MapParams.MAP_STYLE_NIGHT ), NavParams.Companion.init() ); - MapAutoView mapAutoView = new MapAutoView( context ); - IMogoMapView mapView = new AMapViewWrapper( mapAutoView ); + MapAutoView mapAutoView = new MapAutoView(context); + Logger.w(TAG, "mapAutoView==" + mapAutoView); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + IMogoMapView mapView = new AMapViewWrapper(mapAutoView); return mapView; } diff --git a/modules/mogo-module-common/CMakeLists.txt b/modules/mogo-module-common/CMakeLists.txt deleted file mode 100644 index e66e013af7..0000000000 --- a/modules/mogo-module-common/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -# For more information about using CMake with Android Studio, read the -# documentation: https://d.android.com/studio/projects/add-native-code.html - -# Sets the minimum version of CMake required to build the native library. - -cmake_minimum_required(VERSION 3.4.1) - -# Creates and names a library, sets it as either STATIC -# or SHARED, and provides the relative paths to its source code. -# You can define multiple libraries, and CMake builds them for you. -# Gradle automatically packages shared libraries with your APK. - -add_library( # Sets the name of the library. - method-hook-lib - - # Sets the library as a shared library. - SHARED - - # Provides a relative path to your source file(s). - src/main/cpp/method-hook-lib.cpp ) - -# Searches for a specified prebuilt library and stores the path as a -# variable. Because CMake includes system libraries in the search path by -# default, you only need to specify the name of the public NDK library -# you want to add. CMake verifies that the library exists before -# completing its build. - -find_library( # Sets the name of the path variable. - log-lib - - # Specifies the name of the NDK library that - # you want CMake to locate. - log ) - -# Specifies libraries CMake should link to your target library. You -# can link multiple libraries, such as libraries you define in this -# build script, prebuilt third-party libraries, or system libraries. - -target_link_libraries( # Specifies the target library. - method-hook-lib - - # Links the target library to the log library - # included in the NDK. - ${log-lib} ) \ No newline at end of file diff --git a/modules/mogo-module-common/build.gradle b/modules/mogo-module-common/build.gradle index 783a180702..e6efc88b0b 100644 --- a/modules/mogo-module-common/build.gradle +++ b/modules/mogo-module-common/build.gradle @@ -11,17 +11,6 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' - - externalNativeBuild { - cmake { - cppFlags "-std=c++11 -frtti -fexceptions" - } - } - } - externalNativeBuild { - cmake { - path "CMakeLists.txt" - } } buildTypes { release { @@ -44,6 +33,7 @@ dependencies { implementation rootProject.ext.dependencies.androidxconstraintlayout implementation rootProject.ext.dependencies.arouter implementation rootProject.ext.dependencies.callchatprovider + api "com.mogo.libs:hook:1.0" if (Boolean.valueOf(RELEASE)) { api rootProject.ext.dependencies.mogomap api rootProject.ext.dependencies.mogomapapi diff --git a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp b/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp deleted file mode 100644 index dd5111ea23..0000000000 --- a/modules/mogo-module-common/src/main/cpp/method-hook-lib.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include - -// -// Created by donghongyu on 12/10/20 1:34 PM. -// 源码地址 https://github.com/pqpo/methodhook -// 方法hook jni类 -static const char *kClassMethodHookChar = "com/mogo/module/common/hook/MethodHook"; - -static struct { - jmethodID m1; - jmethodID m2; - size_t methodSize; -} methodHookClassInfo; - - -/** - * 替换指定类中的方法 - * @param env - * @param type - * @param srcMethodObj 目标方法对象 - * @param destMethodObj 替换的方法对象 - * @return - */ -static jlong methodHook(JNIEnv *env, jclass type, jobject srcMethodObj, jobject destMethodObj) { - // 反射:获取了Java对象的在native层的 ArtMethod指针 - void *srcMethod = reinterpret_cast(env->FromReflectedMethod(srcMethodObj)); - void *destMethod = reinterpret_cast(env->FromReflectedMethod(destMethodObj)); - // 定义存储方法ID的数组 - int *backupMethod = new int[methodHookClassInfo.methodSize]; - // 使用的内存拷贝函数 - // 将旧方法ID拷贝到数组中 - memcpy(backupMethod, srcMethod, methodHookClassInfo.methodSize); - // 将新方法替换到旧方法地址上 - memcpy(srcMethod, destMethod, methodHookClassInfo.methodSize); - // 将旧方法ID返回给java层,用来做方法还原使用 - return reinterpret_cast(backupMethod); -} - -/** - * 恢复指定类中的方法 - * @param env - * @param type - * @param srcMethod 目标方法对象 - * @param methodPtr - * @return - */ -static jobject methodRestore(JNIEnv *env, jclass type, jobject srcMethod, jlong methodPtr) { - // 要还原的旧方法 指针 - int *backupMethod = reinterpret_cast(methodPtr); - // 获取了Java对象的在native层的 ArtMethod指针 - void *artMethodSrc = reinterpret_cast(env->FromReflectedMethod(srcMethod)); - // 将旧方法指针,替换到 artMethodSrc 中 - memcpy(artMethodSrc, backupMethod, methodHookClassInfo.methodSize); - // 删除旧方法备份指针 - delete[]backupMethod; - // 返回旧方法 - return srcMethod; -} - -// 定义要注册的方法 -static JNINativeMethod gMethods[] = { - { - "hook_native", - "(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)J", - (void *) methodHook - }, - { - "restore_native", - "(Ljava/lang/reflect/Method;J)Ljava/lang/reflect/Method;", - (void *) methodRestore - } -}; - -extern "C" -JNIEXPORT jint JNICALL -/** - * 在jni加载的时候进行方法参数获取 - * @param vm - * @param reserved - * @return - */ -JNI_OnLoad(JavaVM *vm, void *reserved) { - JNIEnv *env = nullptr; - if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) { - return JNI_FALSE; - } - // 加载指定java class - jclass classEvaluateUtil = env->FindClass(kClassMethodHookChar); - // 注册 - if (env->RegisterNatives(classEvaluateUtil, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < - 0) { - return JNI_FALSE; - } - // 获取 MethodHook m1、m2 的方法ID - methodHookClassInfo.m1 = env->GetStaticMethodID(classEvaluateUtil, "m1", "()V"); - methodHookClassInfo.m2 = env->GetStaticMethodID(classEvaluateUtil, "m2", "()V"); - // 获取artMethod的大小, - methodHookClassInfo.methodSize = reinterpret_cast(methodHookClassInfo.m2) - - reinterpret_cast(methodHookClassInfo.m1); - return JNI_VERSION_1_4; -} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java deleted file mode 100644 index 6dc15753b1..0000000000 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/HookManager.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.mogo.module.common.hook; - - -import android.util.Pair; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 替换管理 - * Created by donghongyu on 12/29/20 1:34 PM - */ -public final class HookManager { - - private HookManager() { - } - - public static HookManager get() { - return InstanceHolder.sInstance; - } - - private static class InstanceHolder { - private static HookManager sInstance = new HookManager(); - } - - private Map, MethodHook> methodHookMap = new ConcurrentHashMap<>(); - - /** - * 替换方法 - * - * @param originMethod 原始方法 - * @param hookMethod 替换方法 - */ - public void hookMethod(Method originMethod, Method hookMethod) { - if (originMethod == null || hookMethod == null) { - throw new IllegalArgumentException("argument cannot be null"); - } - - Pair key = Pair.create(hookMethod.getDeclaringClass().getName(), hookMethod.getName()); - if (methodHookMap.containsKey(key)) { - MethodHook methodHook = methodHookMap.get(key); - methodHook.restore(); - } - MethodHook methodHook = new MethodHook(originMethod, hookMethod); - methodHookMap.put(key, methodHook); - methodHook.hook(); - } - - public void callOrigin(Object receiver, Object... args) { - StackTraceElement stackTrace = Thread.currentThread().getStackTrace()[3]; - String className = stackTrace.getClassName(); - String methodName = stackTrace.getMethodName(); - MethodHook methodHook = methodHookMap.get(Pair.create(className, methodName)); - if (methodHook != null) { - try { - methodHook.callOrigin(receiver, args); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - -} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java deleted file mode 100644 index 8586ac1adc..0000000000 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/hook/MethodHook.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.mogo.module.common.hook; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * 替换类与c++代码对应 - * Created by donghongyu on 12/29/20 1:34 PM - */ -public class MethodHook { - - public static void m1() { - } - - public static void m2() { - } - - // 目标方法 - private Method srcMethod; - // 要替换的方法 - private Method hookMethod; - - // 备份目标替换方法ID - private long backupMethodPtr; - - /** - * hook方法 - * - * @param src 要替换的方法对象 - * @param dest 被替换的方法对象 - */ - public MethodHook(Method src, Method dest) { - srcMethod = src; - hookMethod = dest; - srcMethod.setAccessible(true); - hookMethod.setAccessible(true); - } - - /** - * 调用 native 层,完成替换 - */ - public void hook() { - if (backupMethodPtr == 0) { - backupMethodPtr = hook_native(srcMethod, hookMethod); - } - } - - /** - * 调用 native 层,完成方法还原 - */ - public void restore() { - if (backupMethodPtr != 0) { - restore_native(srcMethod, backupMethodPtr); - backupMethodPtr = 0; - } - } - - /** - * 调用原来class 对象中的方法 - * - * @param receiver 接受对象 - * @param args 方法列表 - * @throws InvocationTargetException - * @throws IllegalAccessException - */ - public void callOrigin(Object receiver, Object... args) - throws InvocationTargetException, IllegalAccessException { - if (backupMethodPtr != 0) { - restore(); - srcMethod.invoke(receiver, args); - hook(); - } else { - srcMethod.invoke(receiver, args); - } - } - - /** - * 调用 native 方法完成 方法替换 - * - * @param src 旧方法 - * @param dest 新方法 - * @return 就方法ID - */ - private static native long hook_native(Method src, Method dest); - - /** - * 调用 native 方法完成 方法还原 - * - * @param src - * @param methodPtr - * @return - */ - private static native Method restore_native(Method src, long methodPtr); - - static { - // 加载本地方法 so - System.loadLibrary("method-hook-lib"); - } - -} diff --git a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java index 42503d9055..98e6bef0a9 100644 --- a/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java +++ b/modules/mogo-module-smp/src/main/java/com/mogo/module/small/map/SmallVisionProvider.java @@ -14,8 +14,8 @@ import androidx.fragment.app.Fragment; import com.alibaba.android.arouter.facade.annotation.Route; import com.amap.api.col.n3.lg; import com.amap.api.col.n3.lg2; +import com.mogo.hook.HookManager; import com.mogo.module.common.MogoApisHandler; -import com.mogo.module.common.hook.HookManager; import com.mogo.module.common.wm.WindowManagerView; import com.mogo.service.MogoServicePaths; import com.mogo.service.map.IMogoSmallMapProvider;