V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HelloLingC
V2EX  ›  Android

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

  •  
  •   HelloLingC · 2020-02-02 19:17:25 +08:00 · 10165 次点击
    这是一个创建于 1749 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    5 条回复    2020-02-18 14:25:11 +08:00
    HelloLingC
        1
    HelloLingC  
    OP
       2020-02-02 19:18:41 +08:00 via Android
    不知道为啥排版回乱 emmmm
    712e1959
        2
    712e1959  
       2020-02-03 09:22:38 +08:00
    @HelloLingC #1 主题的语法默认是 MarkDown。
    binocle
        3
    binocle  
       2020-02-04 16:52:10 +08:00
    类加载器问题吧
    canyie
        4
    canyie  
       2020-02-13 14:34:28 +08:00
    ClassLoader 有一个“双亲委派”机制,找类的时候会先交给父 ClassLoader 查找,所以运行时其实找到的是系统 ClassLoader 里的那个类而非你自己写的类。
    BrokenVns
        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。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2902 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 14:33 · PVG 22:33 · LAX 06:33 · JFK 09:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.