Anroid 分析:proxy模式理解Manager和Service

本文介绍了Android系统中Context提供的getSystemService接口如何通过ContextImpl加载一系列服务代理对象,并将这些对象存放在HashMap表中。详细解释了当用户调用服务方法时,代理对象如何将请求传递给实际的服务组件。


Android 通过 Context提供getSystemService的接口, 而是实现类是 ContextImp




ContextImpl.java 的Load时(Static),会创建一堆 service proxy 对象,而后将其放入HashMap表中, 比如StatusBarManager


当用户调用 Service 方法的时候, Proxy 对象会将其传给真正在 ServiceManager 中注册的 Service. 表面上看就是 Manager是 Proxy对象, Service 是真正的对象.

这样的好处:
当 Service 不存在时,用户依然可以调用 Manger的接口,只是传不到Service, 基本没有任何动作而已

11-21 20:49:50.147 4762 30319 E AndroidRuntime: FATAL EXCEPTION: IpClient.wlan0 11-21 20:49:50.147 4762 30319 E AndroidRuntime: Process: com.android.networkstack.process, PID: 4762 11-21 20:49:50.147 4762 30319 E AndroidRuntime: java.lang.IllegalArgumentException: Wakelock.mLock is already dead. 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.Parcel.createExceptionOrNull(Parcel.java:3374) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.Parcel.createException(Parcel.java:3354) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:3337) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:3279) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.IPowerManager$Stub$Proxy.acquireWakeLock(IPowerManager.java:1471) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.PowerManager$WakeLock.acquireLocked(PowerManager.java:4194) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.PowerManager$WakeLock.acquire(PowerManager.java:4175) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.networkstack.android.net.ip.IpReachabilityMonitor$Dependencies$1.acquireWakeLock(IpReachabilityMonitor.java:198) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.networkstack.android.net.ip.IpReachabilityMonitor.probeAll(IpReachabilityMonitor.java:572) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.networkstack.android.net.ip.IpClient.handleUpdateL2Information(IpClient.java:2845) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.networkstack.android.net.ip.IpClient.-$$Nest$mhandleUpdateL2Information(IpClient.java:0) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.networkstack.android.net.ip.IpClient$StartedState.processMessage(IpClient.java:3388) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.networkstack.com.android.internal.util.StateMachine$SmHandler.processMsg(StateMachine.java:1002) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.networkstack.com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:820) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:115) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:298) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.Looper.loop(Looper.java:408) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:85) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: Caused by: android.os.RemoteException: Remote stack trace: 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.server.power.PowerManagerService$WakeLock.linkToDeath(PowerManagerService.java:6302) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.server.power.PowerManagerService$WakeLock.<init>(PowerManagerService.java:6289) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.server.power.PowerManagerService.acquireWakeLockInternal(PowerManagerService.java:1890) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.server.power.PowerManagerService.-$$Nest$macquireWakeLockInternal(Unknown Source:0) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: at com.android.server.power.PowerManagerService$BinderService.acquireWakeLock(PowerManagerService.java:6785) 11-21 20:49:50.147 4762 30319 E AndroidRuntime: 11-21 20:49:50.663 1715 1715 D AndroidRuntime: Shutting down VM 11-21 20:49:50.664 1715 1715 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main 11-21 20:49:50.664 1715 1715 E AndroidRuntime: java.lang.IllegalStateException: Lost network stack. This is not the root cause of any issue, it is a side effect of a crash that happened earlier. Earlier logs should point to the actual issue. 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.net.ConnectivityModuleConnector.maybeCrashWithTerribleFailure(ConnectivityModuleConnector.java:336) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.net.ConnectivityModuleConnector.-$$Nest$mmaybeCrashWithTerribleFailure(Unknown Source:0) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.net.ConnectivityModuleConnector$ModuleServiceConnection.onServiceDisconnected(ConnectivityModuleConnector.java:279) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:2473) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:2488) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:1027) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:108) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:298) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at android.os.Looper.loop(Looper.java:408) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at com.android.server.SystemServer.run(SystemServer.java:1139) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at com.android.server.SystemServer.main(SystemServer.java:709) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) 11-21 20:49:50.664 1715 1715 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1052)
最新发布
11-25
06-05 06:24:05.669 5900 5900 D AndroidRuntime: Shutting down VM 06-05 06:24:05.672 5900 5900 E AndroidRuntime: FATAL EXCEPTION: main 06-05 06:24:05.672 5900 5900 E AndroidRuntime: Process: com.avatr.cockpit.settings, PID: 5900 06-05 06:24:05.672 5900 5900 E AndroidRuntime: java.lang.RuntimeException: Unable to create application com.avatr.cockpit.settings.CockpitSettingsApplication: java.lang.SecurityException: Permission Denial: Component com.avatr.cockpit.settings/.service.SettingsService requests FLAG_SINGLE_USER, but app does not hold android.permission.INTERACT_ACROSS_USERS 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7107) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2305) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:218) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Looper.loop(Looper.java:307) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8309) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:573) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: Caused by: java.lang.SecurityException: Permission Denial: Component com.avatr.cockpit.settings/.service.SettingsService requests FLAG_SINGLE_USER, but app does not hold android.permission.INTERACT_ACROSS_USERS 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Parcel.createExceptionOrNull(Parcel.java:3079) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Parcel.createException(Parcel.java:3063) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:3046) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:2988) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:6047) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1931) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ContextImpl.startService(ContextImpl.java:1900) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.content.ContextWrapper.startService(ContextWrapper.java:825) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.avatr.cockpit.settings.CockpitSettingsApplication.onCreate(CockpitSettingsApplication.java:20) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1316) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7102) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: ... 9 more 06-05 06:24:05.672 5900 5900 E AndroidRuntime: Caused by: android.os.RemoteException: Remote stack trace: 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActivityManagerService.isSingleton(ActivityManagerService.java:13546) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActiveServices.retrieveServiceLocked(ActiveServices.java:4394) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActiveServices.startServiceLocked(ActiveServices.java:833) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActiveServices.startServiceLocked(ActiveServices.java:794) 06-05 06:24:05.672 5900 5900 E AndroidRuntime: at com.android.server.am.ActivityManagerService.startService(ActivityManagerService.java:13415) 06-05 06:24:05.672 5900 5900 E AndroidRuntime:
06-07
08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: FATAL EXCEPTION: main 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: Process: com.android.nfc, PID: 3025 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: java.lang.RuntimeException: Unable to create application com.android.nfc.NfcApplication: java.lang.SecurityException: com.android.nfc: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:8381) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2700) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:107) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:249) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.os.Looper.loop(Looper.java:337) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:9626) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:648) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: Caused by: java.lang.SecurityException: com.android.nfc: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.os.Parcel.createExceptionOrNull(Parcel.java:3256) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.os.Parcel.createException(Parcel.java:3240) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:3223) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:3165) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:6559) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1915) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.ContextImpl.registerReceiverAsUser(ContextImpl.java:1883) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.content.ContextWrapper.registerReceiverAsUser(ContextWrapper.java:843) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at com.android.nfc.NfcService$PollConfig.<init>(NfcService.java:8431) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at com.android.nfc.NfcService.<init>(NfcService.java:1342) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at com.android.nfc.NfcApplication.onCreate(NfcApplication.java:63) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1392) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:8373) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: ... 9 more 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: Caused by: android.os.RemoteException: Remote stack trace: 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at com.android.server.am.ActivityManagerService.registerReceiverWithFeatureTraced(ActivityManagerService.java:15970) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at com.android.server.am.ActivityManagerService.registerReceiverWithFeature(ActivityManagerService.java:15766) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.IActivityManager$Stub.onTransact$registerReceiverWithFeature$(IActivityManager.java:13187) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:3426) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime: at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3113) 08-16 13:46:41.971 nfc 3025 3025 E AndroidRuntime:
08-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值