DroidPlugin icon indicating copy to clipboard operation
DroidPlugin copied to clipboard

适配 android O 预览版时候的问题

Open Danny1451 opened this issue 7 years ago • 8 comments

原先代码中对 ActivityManager 中的 hook 失效了,在 hook 替换 ActivityManagerNative 对象中的 ActivityManager 的代理出现了问题。 通过查阅源码,发现新版本中对 ActivityManagerNative 中去除了 ActivityManagerNative 中的 gDefault 变量,导致原先的替换逻辑找不到变量报错。并且对 getDefault 进行了调整,目前是直接返回 ActivityManager 中的 getService 方法,该方法返回的是 android.app.ActivityManager.IActivityManagerSingleton 中。 所以新版本中的替换方法是直接 hook ActivityManager 中的 IActivityManagerSingleton 对象,替换为我们的代理。

如果需要的话 我可以提个 pr 😁

Danny1451 avatar Apr 28 '17 07:04 Danny1451

赞!提个pr吧。

cmzy avatar May 02 '17 02:05 cmzy

不过我感觉不着急完全适配,等Oreo完全发布后再适配靠谱些。

cmzy avatar May 02 '17 02:05 cmzy

https://android.googlesource.com/platform/manifest没有看到有android 8的分支,请问你在哪里找的android 8 的源码

liowmark avatar Jun 22 '17 07:06 liowmark

@liowmark 拿台升级到 android O 预览版 ,adb shell 到手机 在一个目录【具体那个目录我忘了】下面有 framework 的文件夹 里面可以看到 boot-framework 的 几个 vdex 文件 ./dextra -c android.app.ActivityManager -f -m -j -D boot-framework.vdex 这样能看到相关的源码

Danny1451 avatar Jun 22 '17 07:06 Danny1451

        if (Build.VERSION.SDK_INT>25 || (Build.VERSION.SDK_INT==25 && Build.VERSION.PREVIEW_SDK_INT>0)) {
            Class<?> clazz = Class.forName("android.app.ActivityManager");
            Object iActivityManagerSingleton = HookUtils.readStaticField(clazz, "IActivityManagerSingleton");
            Object obj1 = HookUtils.readField(iActivityManagerSingleton, "mInstance");
            setOriginal(obj1);
            Class<?> iActivityManagerClazz = Class.forName("android.app.IActivityManager");
            Class[] ifs = {iActivityManagerClazz};
            final Object object = Proxy.newProxyInstance(clazz.getClassLoader(), ifs, ActivityManagerHook.this);
            HookUtils.writeStaticField(clazz, "IActivityManagerSingleton", new android.util.Singleton<Object>() {
                @Override
                protected Object create() {
                    return object;
                }
            });

        }

临时解决办法, 大概是个这个思路.

dustookk avatar Jul 21 '17 09:07 dustookk

https://github.com/android/platform_frameworks_base/blob/o-preview/core/java/android/app/ActivityManager.java

https://android.googlesource.com/platform/frameworks/base/+/android-o-preview-3/core/java/android/app/ActivityManager.java

为啥android-o的源码页面上贴的还是android n的源码? 假的源码.......

dustookk avatar Jul 21 '17 09:07 dustookk

👍 @dustookk 就是这个思路 ,肯定是假的源码。

Danny1451 avatar Jul 24 '17 01:07 Danny1451

4.0-7.+: static public IActivityManager getDefault() { return gDefault.get(); }

8.0: public static IActivityManager getService() { return IActivityManagerSingleton.get(); }

FightingLarry avatar Sep 06 '17 08:09 FightingLarry