DroidPlugin
DroidPlugin copied to clipboard
适配 android O 预览版时候的问题
原先代码中对 ActivityManager 中的 hook 失效了,在 hook 替换 ActivityManagerNative 对象中的 ActivityManager 的代理出现了问题。 通过查阅源码,发现新版本中对 ActivityManagerNative 中去除了 ActivityManagerNative 中的 gDefault 变量,导致原先的替换逻辑找不到变量报错。并且对 getDefault 进行了调整,目前是直接返回 ActivityManager 中的 getService 方法,该方法返回的是 android.app.ActivityManager.IActivityManagerSingleton 中。 所以新版本中的替换方法是直接 hook ActivityManager 中的 IActivityManagerSingleton 对象,替换为我们的代理。
如果需要的话 我可以提个 pr 😁
赞!提个pr吧。
不过我感觉不着急完全适配,等Oreo完全发布后再适配靠谱些。
https://android.googlesource.com/platform/manifest没有看到有android 8的分支,请问你在哪里找的android 8 的源码
@liowmark 拿台升级到 android O 预览版 ,adb shell 到手机 在一个目录【具体那个目录我忘了】下面有 framework 的文件夹 里面可以看到 boot-framework 的 几个 vdex 文件 ./dextra -c android.app.ActivityManager -f -m -j -D boot-framework.vdex 这样能看到相关的源码
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;
}
});
}
临时解决办法, 大概是个这个思路.
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 就是这个思路 ,肯定是假的源码。
4.0-7.+: static public IActivityManager getDefault() { return gDefault.get(); }
8.0: public static IActivityManager getService() { return IActivityManagerSingleton.get(); }