求助 V2EX 的大佬们,我这还是第一次用 V2EX 提问。
如果我在 android.os 包下建一个 ServiceManager 类,并写上 getService 方法:
package android.os;
public class ServiceManager { public static IBinder getService(String name) { throw new UnsupportedOperationException(); } }
调用 getService 方法会成功返回一个 Binder Proxy,这是什么高级操作?
我看了一下 getService 的 Android 源码,注释上并没有 @hide 标签,难道没有标注 @hide 标签的系统方法都可以用这种方式使用嘛?
1
HelloLingC OP 不知道为啥排版回乱 emmmm
|
2
712e1959 2020-02-03 09:22:38 +08:00
@HelloLingC #1 主题的语法默认是 MarkDown。
|
3
binocle 2020-02-04 16:52:10 +08:00
类加载器问题吧
|
4
canyie 2020-02-13 14:34:28 +08:00
ClassLoader 有一个“双亲委派”机制,找类的时候会先交给父 ClassLoader 查找,所以运行时其实找到的是系统 ClassLoader 里的那个类而非你自己写的类。
|
5
BrokenVns 2020-02-18 14:25:11 +08:00
源码里本来就有 ServiceManager 这个类,你调用的是源码里的类和方法吧。你自己的修改应该没有成功吧。
至于 getService 方法会返回 BinderProxy 是因为: 1.getService 方法中会调用 Parcel 的 readStrongBinder 方法。 2.readStrongBinder 会在通过 jni 调用 Parcel(c++)的 readStrongBinder 获取对应 service 的 BpBinder 3.接着构造 javaObject(BinderProxy)。 4.将 BpBinder 的地址存 BinderProxy 的变量中后将 BinderProxy 返回给 readStrongBinder,最后返回给 getService。 |