无Context调用services

无Context调用 Services 的一点经验分享

##从DisplayManagerGlobal入手
这是一个单例,但却能构造出IDisplayManager对象。
public static DisplayManagerGlobal getInstance() {
synchronized (DisplayManagerGlobal.class) {
if (sInstance == null) {
IBinder b = ServiceManager.getService(Context.DISPLAY_SERVICE);
if (b != null) {
sInstance = new DisplayManagerGlobal(IDisplayManager.Stub.asInterface(b));
}
}
return sInstance;
}
}

    private static IServiceManager getIServiceManager() {
    if (sServiceManager != null) {
        return sServiceManager;
    }
    // Find the service manager
    sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
    return sServiceManager;
}

所以在没有Acitivity的Context的时候,我们也可以用这种方法来反射出各种service

也就是平时我们所看到的

其实还有第二种方法,反射出系统的Context,然后通过这个Context getService,

无论是以上哪一种方法,都会有一个限制,

例如createDisplay方法

会校验uid查询出来的packagename和context中拿到的packagename是否一致

而反射出的context的packagename是android

而我们如果通过shell运行的dex,packagename是com.android.shell

作者

梦魇兽

发布于

2023-08-28

更新于

2023-08-28

许可协议

评论