求助 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 标签的系统方法都可以用这种方式使用嘛?
|      1HelloLingC OP 不知道为啥排版回乱 emmmm | 
|      2712e1959      2020-02-03 09:22:38 +08:00 @HelloLingC #1 主题的语法默认是 MarkDown。 | 
|      3binocle      2020-02-04 16:52:10 +08:00 类加载器问题吧 | 
|      4canyie      2020-02-13 14:34:28 +08:00 ClassLoader 有一个“双亲委派”机制,找类的时候会先交给父 ClassLoader 查找,所以运行时其实找到的是系统 ClassLoader 里的那个类而非你自己写的类。 | 
|      5BrokenVns      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。 |