关于调用系统级 API (ServiceManager#getService)

2020-02-02 19:17:25 +08:00
 HelloLingC

求助 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 标签的系统方法都可以用这种方式使用嘛?

6269 次点击
所在节点    Android
5 条回复
HelloLingC
2020-02-02 19:18:41 +08:00
不知道为啥排版回乱 emmmm
712e1959
2020-02-03 09:22:38 +08:00
@HelloLingC #1 主题的语法默认是 MarkDown。
binocle
2020-02-04 16:52:10 +08:00
类加载器问题吧
canyie
2020-02-13 14:34:28 +08:00
ClassLoader 有一个“双亲委派”机制,找类的时候会先交给父 ClassLoader 查找,所以运行时其实找到的是系统 ClassLoader 里的那个类而非你自己写的类。
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。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641673

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX