1
1
package com .plugin .core ;
2
2
3
- import com .plugin .core .ui .stub .PluginStubReceiver ;
4
- import com .plugin .util .LogUtil ;
5
- import com .plugin .util .RefInvoker ;
6
-
7
- import android .content .ComponentName ;
8
- import android .content .Intent ;
9
3
import android .os .Handler ;
10
4
import android .os .Message ;
11
5
6
+ import com .plugin .util .LogUtil ;
7
+
12
8
/**
13
9
* 插件Receiver免注册的主要实现原理
10
+ *
14
11
* @author cailiming
15
- *
12
+ *
16
13
*/
17
14
public class PluginAppTrace implements Handler .Callback {
18
-
15
+
19
16
private final Handler mHandler ;
20
17
21
18
protected PluginAppTrace (Handler handler ) {
@@ -27,7 +24,7 @@ public boolean handleMessage(Message msg) {
27
24
try {
28
25
LogUtil .d (">>> handling: " , CodeConst .codeToString (msg .what ));
29
26
if (msg .what == CodeConst .RECEIVER ) {
30
- hackReceiverIfNeed (msg .obj );
27
+ PluginIntentResolver . hackReceiverForClassLoader (msg .obj );
31
28
}
32
29
mHandler .handleMessage (msg );
33
30
LogUtil .d (">>> done: " + CodeConst .codeToString (msg .what ));
@@ -37,108 +34,136 @@ public boolean handleMessage(Message msg) {
37
34
return true ;
38
35
}
39
36
40
- private static void hackReceiverIfNeed (Object msgObj ) {
41
- Intent intent = (Intent )RefInvoker .getFieldObject (msgObj , "android.app.ActivityThread$ReceiverData" , "intent" );
42
- if (intent .getComponent ().getClassName ().equals (PluginStubReceiver .class .getName ())) {
43
- Intent realIntent = (Intent )(intent .getParcelableExtra (PluginFragmentHelper .RECEIVER_ID_IN_PLUGIN ));
44
- LogUtil .d ("receiver" , realIntent .toUri (0 ));
45
- intent .putExtras (realIntent .getExtras ());
46
- String realClassName = PluginLoader .isMatchPlugin (realIntent );
47
- //classLoader检测到这个特殊标记后会进行替换
48
- intent .setComponent (new ComponentName (intent .getComponent ().getPackageName (),
49
- PluginStubReceiver .class .getName () + "." + realClassName ));
50
- }
51
- }
52
-
53
37
private static class CodeConst {
54
- public static final int LAUNCH_ACTIVITY = 100 ;
55
- public static final int PAUSE_ACTIVITY = 101 ;
56
- public static final int PAUSE_ACTIVITY_FINISHING = 102 ;
57
- public static final int STOP_ACTIVITY_SHOW = 103 ;
58
- public static final int STOP_ACTIVITY_HIDE = 104 ;
59
- public static final int SHOW_WINDOW = 105 ;
60
- public static final int HIDE_WINDOW = 106 ;
61
- public static final int RESUME_ACTIVITY = 107 ;
62
- public static final int SEND_RESULT = 108 ;
63
- public static final int DESTROY_ACTIVITY = 109 ;
64
- public static final int BIND_APPLICATION = 110 ;
65
- public static final int EXIT_APPLICATION = 111 ;
66
- public static final int NEW_INTENT = 112 ;
67
- public static final int RECEIVER = 113 ;
68
- public static final int CREATE_SERVICE = 114 ;
69
- public static final int SERVICE_ARGS = 115 ;
70
- public static final int STOP_SERVICE = 116 ;
71
- public static final int REQUEST_THUMBNAIL = 117 ;
72
- public static final int CONFIGURATION_CHANGED = 118 ;
73
- public static final int CLEAN_UP_CONTEXT = 119 ;
74
- public static final int GC_WHEN_IDLE = 120 ;
75
- public static final int BIND_SERVICE = 121 ;
76
- public static final int UNBIND_SERVICE = 122 ;
77
- public static final int DUMP_SERVICE = 123 ;
78
- public static final int LOW_MEMORY = 124 ;
79
- public static final int ACTIVITY_CONFIGURATION_CHANGED = 125 ;
80
- public static final int RELAUNCH_ACTIVITY = 126 ;
81
- public static final int PROFILER_CONTROL = 127 ;
82
- public static final int CREATE_BACKUP_AGENT = 128 ;
83
- public static final int DESTROY_BACKUP_AGENT = 129 ;
84
- public static final int SUICIDE = 130 ;
85
- public static final int REMOVE_PROVIDER = 131 ;
86
- public static final int ENABLE_JIT = 132 ;
87
- public static final int DISPATCH_PACKAGE_BROADCAST = 133 ;
88
- public static final int SCHEDULE_CRASH = 134 ;
89
- public static final int DUMP_HEAP = 135 ;
90
- public static final int DUMP_ACTIVITY = 136 ;
91
- public static final int SLEEPING = 137 ;
92
- public static final int SET_CORE_SETTINGS = 138 ;
93
- public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139 ;
94
- public static final int TRIM_MEMORY = 140 ;
95
-
96
- public static String codeToString (int code ) {
97
- switch (code ) {
98
- case LAUNCH_ACTIVITY : return "LAUNCH_ACTIVITY" ;
99
- case PAUSE_ACTIVITY : return "PAUSE_ACTIVITY" ;
100
- case PAUSE_ACTIVITY_FINISHING : return "PAUSE_ACTIVITY_FINISHING" ;
101
- case STOP_ACTIVITY_SHOW : return "STOP_ACTIVITY_SHOW" ;
102
- case STOP_ACTIVITY_HIDE : return "STOP_ACTIVITY_HIDE" ;
103
- case SHOW_WINDOW : return "SHOW_WINDOW" ;
104
- case HIDE_WINDOW : return "HIDE_WINDOW" ;
105
- case RESUME_ACTIVITY : return "RESUME_ACTIVITY" ;
106
- case SEND_RESULT : return "SEND_RESULT" ;
107
- case DESTROY_ACTIVITY : return "DESTROY_ACTIVITY" ;
108
- case BIND_APPLICATION : return "BIND_APPLICATION" ;
109
- case EXIT_APPLICATION : return "EXIT_APPLICATION" ;
110
- case NEW_INTENT : return "NEW_INTENT" ;
111
- case RECEIVER : return "RECEIVER" ;
112
- case CREATE_SERVICE : return "CREATE_SERVICE" ;
113
- case SERVICE_ARGS : return "SERVICE_ARGS" ;
114
- case STOP_SERVICE : return "STOP_SERVICE" ;
115
- case REQUEST_THUMBNAIL : return "REQUEST_THUMBNAIL" ;
116
- case CONFIGURATION_CHANGED : return "CONFIGURATION_CHANGED" ;
117
- case CLEAN_UP_CONTEXT : return "CLEAN_UP_CONTEXT" ;
118
- case GC_WHEN_IDLE : return "GC_WHEN_IDLE" ;
119
- case BIND_SERVICE : return "BIND_SERVICE" ;
120
- case UNBIND_SERVICE : return "UNBIND_SERVICE" ;
121
- case DUMP_SERVICE : return "DUMP_SERVICE" ;
122
- case LOW_MEMORY : return "LOW_MEMORY" ;
123
- case ACTIVITY_CONFIGURATION_CHANGED : return "ACTIVITY_CONFIGURATION_CHANGED" ;
124
- case RELAUNCH_ACTIVITY : return "RELAUNCH_ACTIVITY" ;
125
- case PROFILER_CONTROL : return "PROFILER_CONTROL" ;
126
- case CREATE_BACKUP_AGENT : return "CREATE_BACKUP_AGENT" ;
127
- case DESTROY_BACKUP_AGENT : return "DESTROY_BACKUP_AGENT" ;
128
- case SUICIDE : return "SUICIDE" ;
129
- case REMOVE_PROVIDER : return "REMOVE_PROVIDER" ;
130
- case ENABLE_JIT : return "ENABLE_JIT" ;
131
- case DISPATCH_PACKAGE_BROADCAST : return "DISPATCH_PACKAGE_BROADCAST" ;
132
- case SCHEDULE_CRASH : return "SCHEDULE_CRASH" ;
133
- case DUMP_HEAP : return "DUMP_HEAP" ;
134
- case DUMP_ACTIVITY : return "DUMP_ACTIVITY" ;
135
- case SLEEPING : return "SLEEPING" ;
136
- case SET_CORE_SETTINGS : return "SET_CORE_SETTINGS" ;
137
- case UPDATE_PACKAGE_COMPATIBILITY_INFO : return "UPDATE_PACKAGE_COMPATIBILITY_INFO" ;
138
- case TRIM_MEMORY : return "TRIM_MEMORY" ;
139
- }
140
- return "(unknown)" ;
141
- }
38
+ public static final int LAUNCH_ACTIVITY = 100 ;
39
+ public static final int PAUSE_ACTIVITY = 101 ;
40
+ public static final int PAUSE_ACTIVITY_FINISHING = 102 ;
41
+ public static final int STOP_ACTIVITY_SHOW = 103 ;
42
+ public static final int STOP_ACTIVITY_HIDE = 104 ;
43
+ public static final int SHOW_WINDOW = 105 ;
44
+ public static final int HIDE_WINDOW = 106 ;
45
+ public static final int RESUME_ACTIVITY = 107 ;
46
+ public static final int SEND_RESULT = 108 ;
47
+ public static final int DESTROY_ACTIVITY = 109 ;
48
+ public static final int BIND_APPLICATION = 110 ;
49
+ public static final int EXIT_APPLICATION = 111 ;
50
+ public static final int NEW_INTENT = 112 ;
51
+ public static final int RECEIVER = 113 ;
52
+ public static final int CREATE_SERVICE = 114 ;
53
+ public static final int SERVICE_ARGS = 115 ;
54
+ public static final int STOP_SERVICE = 116 ;
55
+ public static final int REQUEST_THUMBNAIL = 117 ;
56
+ public static final int CONFIGURATION_CHANGED = 118 ;
57
+ public static final int CLEAN_UP_CONTEXT = 119 ;
58
+ public static final int GC_WHEN_IDLE = 120 ;
59
+ public static final int BIND_SERVICE = 121 ;
60
+ public static final int UNBIND_SERVICE = 122 ;
61
+ public static final int DUMP_SERVICE = 123 ;
62
+ public static final int LOW_MEMORY = 124 ;
63
+ public static final int ACTIVITY_CONFIGURATION_CHANGED = 125 ;
64
+ public static final int RELAUNCH_ACTIVITY = 126 ;
65
+ public static final int PROFILER_CONTROL = 127 ;
66
+ public static final int CREATE_BACKUP_AGENT = 128 ;
67
+ public static final int DESTROY_BACKUP_AGENT = 129 ;
68
+ public static final int SUICIDE = 130 ;
69
+ public static final int REMOVE_PROVIDER = 131 ;
70
+ public static final int ENABLE_JIT = 132 ;
71
+ public static final int DISPATCH_PACKAGE_BROADCAST = 133 ;
72
+ public static final int SCHEDULE_CRASH = 134 ;
73
+ public static final int DUMP_HEAP = 135 ;
74
+ public static final int DUMP_ACTIVITY = 136 ;
75
+ public static final int SLEEPING = 137 ;
76
+ public static final int SET_CORE_SETTINGS = 138 ;
77
+ public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139 ;
78
+ public static final int TRIM_MEMORY = 140 ;
79
+
80
+ public static String codeToString (int code ) {
81
+ switch (code ) {
82
+ case LAUNCH_ACTIVITY :
83
+ return "LAUNCH_ACTIVITY" ;
84
+ case PAUSE_ACTIVITY :
85
+ return "PAUSE_ACTIVITY" ;
86
+ case PAUSE_ACTIVITY_FINISHING :
87
+ return "PAUSE_ACTIVITY_FINISHING" ;
88
+ case STOP_ACTIVITY_SHOW :
89
+ return "STOP_ACTIVITY_SHOW" ;
90
+ case STOP_ACTIVITY_HIDE :
91
+ return "STOP_ACTIVITY_HIDE" ;
92
+ case SHOW_WINDOW :
93
+ return "SHOW_WINDOW" ;
94
+ case HIDE_WINDOW :
95
+ return "HIDE_WINDOW" ;
96
+ case RESUME_ACTIVITY :
97
+ return "RESUME_ACTIVITY" ;
98
+ case SEND_RESULT :
99
+ return "SEND_RESULT" ;
100
+ case DESTROY_ACTIVITY :
101
+ return "DESTROY_ACTIVITY" ;
102
+ case BIND_APPLICATION :
103
+ return "BIND_APPLICATION" ;
104
+ case EXIT_APPLICATION :
105
+ return "EXIT_APPLICATION" ;
106
+ case NEW_INTENT :
107
+ return "NEW_INTENT" ;
108
+ case RECEIVER :
109
+ return "RECEIVER" ;
110
+ case CREATE_SERVICE :
111
+ return "CREATE_SERVICE" ;
112
+ case SERVICE_ARGS :
113
+ return "SERVICE_ARGS" ;
114
+ case STOP_SERVICE :
115
+ return "STOP_SERVICE" ;
116
+ case REQUEST_THUMBNAIL :
117
+ return "REQUEST_THUMBNAIL" ;
118
+ case CONFIGURATION_CHANGED :
119
+ return "CONFIGURATION_CHANGED" ;
120
+ case CLEAN_UP_CONTEXT :
121
+ return "CLEAN_UP_CONTEXT" ;
122
+ case GC_WHEN_IDLE :
123
+ return "GC_WHEN_IDLE" ;
124
+ case BIND_SERVICE :
125
+ return "BIND_SERVICE" ;
126
+ case UNBIND_SERVICE :
127
+ return "UNBIND_SERVICE" ;
128
+ case DUMP_SERVICE :
129
+ return "DUMP_SERVICE" ;
130
+ case LOW_MEMORY :
131
+ return "LOW_MEMORY" ;
132
+ case ACTIVITY_CONFIGURATION_CHANGED :
133
+ return "ACTIVITY_CONFIGURATION_CHANGED" ;
134
+ case RELAUNCH_ACTIVITY :
135
+ return "RELAUNCH_ACTIVITY" ;
136
+ case PROFILER_CONTROL :
137
+ return "PROFILER_CONTROL" ;
138
+ case CREATE_BACKUP_AGENT :
139
+ return "CREATE_BACKUP_AGENT" ;
140
+ case DESTROY_BACKUP_AGENT :
141
+ return "DESTROY_BACKUP_AGENT" ;
142
+ case SUICIDE :
143
+ return "SUICIDE" ;
144
+ case REMOVE_PROVIDER :
145
+ return "REMOVE_PROVIDER" ;
146
+ case ENABLE_JIT :
147
+ return "ENABLE_JIT" ;
148
+ case DISPATCH_PACKAGE_BROADCAST :
149
+ return "DISPATCH_PACKAGE_BROADCAST" ;
150
+ case SCHEDULE_CRASH :
151
+ return "SCHEDULE_CRASH" ;
152
+ case DUMP_HEAP :
153
+ return "DUMP_HEAP" ;
154
+ case DUMP_ACTIVITY :
155
+ return "DUMP_ACTIVITY" ;
156
+ case SLEEPING :
157
+ return "SLEEPING" ;
158
+ case SET_CORE_SETTINGS :
159
+ return "SET_CORE_SETTINGS" ;
160
+ case UPDATE_PACKAGE_COMPATIBILITY_INFO :
161
+ return "UPDATE_PACKAGE_COMPATIBILITY_INFO" ;
162
+ case TRIM_MEMORY :
163
+ return "TRIM_MEMORY" ;
164
+ }
165
+ return "(unknown)" ;
166
+ }
142
167
}
143
-
168
+
144
169
}
0 commit comments