无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
无Context调用services