說明:本文是基于Android6.0源碼來分析的
- Instrumentation這個類,我的理解是:Instrumentation是一個用來監(jiān)視Activity的監(jiān)測類,Activity的生命周期的函數(shù)也是Instrumentation來調(diào)用的,那么他是再什么時候初始化的呢?
- 下面我們就來分析一下Instrumentation這個類的初始化時機(jī)和在什么時候會初始化
- 我們啟動一個應(yīng)用的時候系統(tǒng)就會給我們準(zhǔn)備一個Instrumentation的實例;開啟一個app進(jìn)程,會掉用ActivityThread的mian方法
public static void main(String[] args) {
...
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
...
}
接著是ActivityThread#attach方法,由于我們傳進(jìn)來的是false,所以走if里面的邏輯。IActivityManager是一個AIDL的接口,這里涉及到進(jìn)程間通信,就不詳細(xì)講解了,網(wǎng)上已經(jīng)有大量的文章講解IPC了。IActivityManager的實現(xiàn)類就是大名鼎鼎的ActivityManagerService了,這是一個Android中很重要的類,管理者四大組件,這里就不介紹了,相信大家有所了解。
private void attach(boolean system) {
sCurrentActivityThread = this;
mSystemThread = system;
if (!system) {
...
final IActivityManager mgr = ActivityManagerNative.getDefault();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
// Ignore
}
} else {
}
...
}
接著調(diào)用了ActivityManagerService#attachApplication方法
@Override
public final void attachApplication(IApplicationThread thread) {
synchronized (this) {
...
attachApplicationLocked(thread, callingPid);
...
}
}
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid) {
bindApplication()
}
這里又涉及到進(jìn)程間通信了,IApplicationThread的實現(xiàn)類是ApplicationThread,所以會調(diào)用ApplicationThread#bindApplication方法。
thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
isRestrictedBackupMode || !normalMode, app.persistent,
new Configuration(mConfiguration), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked());
然后用handler發(fā)送消息給ActivityThread#bindApplicationff
public final void bindApplication(String processName, ApplicationInfo appInfo,
List<ProviderInfo> providers, ComponentName instrumentationName,
ProfilerInfo profilerInfo, Bundle instrumentationArgs,
IInstrumentationWatcher instrumentationWatcher,
IUiAutomationConnection instrumentationUiConnection, int debugMode,
boolean enableOpenGlTrace, boolean isRestrictedBackupMode, boolean persistent,
Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
Bundle coreSettings) {
...
sendMessage(H.BIND_APPLICATION, data);
}
最后一行代碼會用handler發(fā)送消息給ActivityThread的H
public void handleMessage(Message msg) {
...
case BIND_APPLICATION:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
AppBindData data = (AppBindData)msg.obj;
handleBindApplication(data);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
...
}
在handleBindApplication(data)中我們終于看到了mInstrumentation的創(chuàng)建,是通過反射來創(chuàng)建實例的。
private void handleBindApplication(AppBindData data) {
try {
java.lang.ClassLoader cl = instrContext.getClassLoader();
mInstrumentation = (Instrumentation)
cl.loadClass(data.instrumentationName.getClassName()).newInstance();
} catch (Exception e) {
throw new RuntimeException(
"Unable to instantiate instrumentation "
+ data.instrumentationName + ": " + e.toString(), e);
}
...
}
ok,Instrumentation的初始化就介紹完了,因為這個類和Actiity的關(guān)系還是比較密切的,前面說過,Activity的生命周期方法都是通過這個類來掉用的,所以我們把他初始化的流程大概也梳理這講解一下,相對來說,流程還是比較簡單的,這里就不給出流程圖來.