22
33import android .app .Service ;
44import android .content .Context ;
5+ import android .content .pm .ServiceInfo ;
56import android .os .Handler ;
67import android .os .IBinder ;
78import android .os .Message ;
89
910import com .plugin .core .app .ActivityThread ;
11+ import com .plugin .core .manager .PluginManagerHelper ;
1012import com .plugin .util .LogUtil ;
13+ import com .plugin .util .ProcessUtil ;
1114import com .plugin .util .RefInvoker ;
1215
1316import java .util .Map ;
@@ -67,53 +70,65 @@ private Result beforeHandle(Message msg) {
6770 }
6871
6972 private static Result beforeReceiver (Message msg ) {
70- Class clazz = PluginIntentResolver .resolveReceiverForClassLoader (msg .obj );
73+ if (ProcessUtil .isPluginProcess ()) {
74+ Class clazz = PluginIntentResolver .resolveReceiverForClassLoader (msg .obj );
7175
72- if (clazz != null ) {
73- PluginInjector .hackHostClassLoaderIfNeeded ();
76+ if (clazz != null ) {
77+ PluginInjector .hackHostClassLoaderIfNeeded ();
7478
75- Context baseContext = PluginLoader .getApplicatoin ().getBaseContext ();
76- Context newBase = PluginLoader .getDefaultPluginContext (clazz );
79+ Context baseContext = PluginLoader .getApplicatoin ().getBaseContext ();
80+ Context newBase = PluginLoader .getDefaultPluginContext (clazz );
7781
78- PluginInjector .replaceReceiverContext (baseContext , newBase );
82+ PluginInjector .replaceReceiverContext (baseContext , newBase );
7983
80- Result result = new Result ();
81- result .baseContext = baseContext ;
84+ Result result = new Result ();
85+ result .baseContext = baseContext ;
8286
83- return result ;
84- } else {
85- //宿主的receiver的context不需要处理,在framework中receiver的context本身是对appliction的包装。
86- //而宿主的application的base已经本更换过了
87+ return result ;
88+ } else {
89+ //宿主的receiver的context不需要处理,在framework中receiver的context本身是对appliction的包装。
90+ //而宿主的application的base已经本更换过了
91+ }
8792 }
93+
8894 return null ;
8995 }
9096
9197 private static Result beforeCreateService (Message msg ) {
92- String serviceName = PluginIntentResolver .resolveServiceForClassLoader (msg .obj );
98+ Result result = new Result ();
99+ if (ProcessUtil .isPluginProcess ()) {
100+ String serviceName = PluginIntentResolver .resolveServiceForClassLoader (msg .obj );
101+
102+ if (serviceName .startsWith (PluginIntentResolver .CLASS_PREFIX )) {
103+ PluginInjector .hackHostClassLoaderIfNeeded ();
104+ }
93105
94- if (serviceName .startsWith (PluginIntentResolver .CLASS_PREFIX )) {
95- PluginInjector .hackHostClassLoaderIfNeeded ();
106+ result .serviceName = serviceName ;
107+ } else {
108+ ServiceInfo info = (ServiceInfo ) RefInvoker .getFieldObject (msg .obj , "android.app.ActivityThread$CreateServiceData" , "info" );
109+ result .serviceName = info .name ;
96110 }
97- Result result = new Result ();
98- result .serviceName = serviceName ;
99111
100112 return result ;
101113 }
102114
103115 private static Result beforeStopService (Message msg ) {
104- //销毁service时回收映射关系
105- Object activityThread = ActivityThread .currentActivityThread ();
106- if (activityThread != null ) {
107- Map <IBinder , Service > services = ActivityThread .getAllServices ();
108- if (services != null ) {
109- Service service = services .get (msg .obj );
110- if (service != null ) {
111- String pluginServiceClassName = service .getClass ().getName ();
112- LogUtil .d ("STOP_SERVICE" , pluginServiceClassName );
113- PluginStubBinding .unBindStubService (pluginServiceClassName );
116+ if (ProcessUtil .isPluginProcess ()) {
117+ //销毁service时回收映射关系
118+ Object activityThread = ActivityThread .currentActivityThread ();
119+ if (activityThread != null ) {
120+ Map <IBinder , Service > services = ActivityThread .getAllServices ();
121+ if (services != null ) {
122+ Service service = services .get (msg .obj );
123+ if (service != null ) {
124+ String pluginServiceClassName = service .getClass ().getName ();
125+ LogUtil .d ("STOP_SERVICE" , pluginServiceClassName );
126+ PluginManagerHelper .unBindStubService (pluginServiceClassName );
127+ }
114128 }
115129 }
116130 }
131+
117132 return null ;
118133 }
119134
@@ -134,21 +149,22 @@ private static void afterHandle(Message msg, Result result) {
134149 }
135150
136151 private static void afterReceiver (Result result ) {
137- if (result != null && result .baseContext != null ) {
138- RefInvoker .setFieldObject (result .baseContext , "android.app.ContextImpl" , "mReceiverRestrictedContext" , null );
152+ if (ProcessUtil .isPluginProcess ()) {
153+ if (result != null && result .baseContext != null ) {
154+ RefInvoker .setFieldObject (result .baseContext , "android.app.ContextImpl" , "mReceiverRestrictedContext" , null );
155+ }
139156 }
140157 }
141158
142159 private static void afterCreateService (Result result ) {
143- if (result != null ) {
144- if (result .serviceName .startsWith (PluginIntentResolver .CLASS_PREFIX )) {
145- //拿到创建好的service,重新 设置mBase和mApplicaiton
146- //由于这步操作是再service得oncreate之后执行,所以再插件service得oncreate中不应尝试通过此service的context执行操作
147- PluginInjector .replacePluginServiceContext (result .serviceName .replace (PluginIntentResolver .CLASS_PREFIX , "" ));
148- } else {
149- //注入一个无害的BaseContext, 主要是为了重写宿主Service的sentBroadCast和startService方法
150- PluginInjector .replaceHostServiceContext (result .serviceName );
151- }
160+
161+ if (result .serviceName .startsWith (PluginIntentResolver .CLASS_PREFIX )) {
162+ //拿到创建好的service,重新 设置mBase和mApplicaiton
163+ //由于这步操作是再service得oncreate之后执行,所以再插件service得oncreate中不应尝试通过此service的context执行操作
164+ PluginInjector .replacePluginServiceContext (result .serviceName .replace (PluginIntentResolver .CLASS_PREFIX , "" ));
165+ } else {
166+ //注入一个无害的BaseContext, 主要是为了重写宿主Service的sentBroadCast和startService方法
167+ PluginInjector .replaceHostServiceContext (result .serviceName );
152168 }
153169 }
154170
0 commit comments