现在的位置: 首页 > 综合 > 正文

ActivityManagerService服务线程启动源码分析

2013年12月11日 ⁄ 综合 ⁄ 共 14778字 ⁄ 字号 评论关闭

android系统服务线程都驻留在SystemServer进程中,由SystemServer启动,在SystemServer.init2函数中,通过启动一个线程来启动各种系统服务线程。

public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();// 创建一个线程
        thr.setName("android.server.ServerThread");//设置线程名称
        thr.start();/启动该线程
    }

android系统服务都是在thr线程的run函数中启动:

public void run() {
	EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN,SystemClock.uptimeMillis());

	Looper.prepare();//创建一个消息循环对象

	android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
	BinderInternal.disableBackgroundScheduling(true);
	android.os.Process.setCanSelfBackground(false);
	// Critical services...
	try {
		Slog.i(TAG, "Activity Manager");
		//①启动ActivityManagerService服务线程
		context = ActivityManagerService.main(factoryTest);
		................................................
		//②向ServiceManager注册自己
		ActivityManagerService.setSystemProcess();
		................................................
		Slog.i(TAG, "System Content Providers");
		//③安装系统Providers
		ActivityManagerService.installSystemProviders();
		................................................
		//④设置ActivityManagerService的成员变量mWindowManager
		ActivityManagerService.self().setWindowManager(wm);
		................................................
		} catch (RuntimeException e) {
            	Slog.e("System", "******************************************");
            	Slog.e("System", "************ Failure starting core service", e);
        	     }
		//⑤调用systemReady函数为系统准备各种服务
		ActivityManagerService.self().systemReady(new Runnable() {
			public void run() {
				Slog.i(TAG, "Making services ready");

				startSystemUi(contextF);
				try {
					if (batteryF != null) batteryF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Battery Service ready", e);
				}
				try {
					if (networkManagementF != null) networkManagementF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Network Managment Service ready", e);
				}
				try {
					if (networkStatsF != null) networkStatsF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Network Stats Service ready", e);
				}
				try {
					if (networkPolicyF != null) networkPolicyF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Network Policy Service ready", e);
				}
				try {
					if (connectivityF != null) connectivityF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Connectivity Service ready", e);
				}
				try {
					if (dockF != null) dockF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Dock Service ready", e);
				}
				try {
					if (usbF != null) usbF.systemReady();
				} catch (Throwable e) {
					reportWtf("making USB Service ready", e);
				}
				try {
					if (uiModeF != null) uiModeF.systemReady();
				} catch (Throwable e) {
					reportWtf("making UI Mode Service ready", e);
				}
				try {
					if (recognitionF != null) recognitionF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Recognition Service ready", e);
				}
				Watchdog.getInstance().start();

				// It is now okay to let the various system services start their
				// third party code...

				try {
					if (appWidgetF != null) appWidgetF.systemReady(safeMode);
				} catch (Throwable e) {
					reportWtf("making App Widget Service ready", e);
				}
				try {
					if (wallpaperF != null) wallpaperF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Wallpaper Service ready", e);
				}
				try {
					if (immF != null) immF.systemReady(statusBarF);
				} catch (Throwable e) {
					reportWtf("making Input Method Service ready", e);
				}
				try {
					if (locationF != null) locationF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Location Service ready", e);
				}
				try {
					if (countryDetectorF != null) countryDetectorF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Country Detector Service ready", e);
				}
				try {
					if (throttleF != null) throttleF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Throttle Service ready", e);
				}
				try {
					if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Network Time Service ready", e);
				}
				try {
					if (textServiceManagerServiceF != null) textServiceManagerServiceF.systemReady();
				} catch (Throwable e) {
					reportWtf("making Text Services Manager Service ready", e);
				}
			}
		});
	Looper.loop();
	Slog.d(TAG, "System ServerThread is exiting!");
}

第一:ActivityManagerService.main(factoryTest)

public static final Context main(int factoryTest) {
	//①启动AThread线程来创建ActivityManagerService实例
	AThread thr = new AThread();
	thr.start();

	synchronized (thr) {
		while (thr.mService == null) {
			try {
				thr.wait();
			} catch (InterruptedException e) {
			}
		}
	}
	//将创建的ActivityManagerService实例保存到ActivityManagerService的静态变量mSelf
	ActivityManagerService m = thr.mService;
	mSelf = m;
	//②创建ActivityThread实例并保存到ActivityManagerService的静态变量mSystemThread
	ActivityThread at = ActivityThread.systemMain();
	mSystemThread = at;
	Context context = at.getSystemContext();
	context.setTheme(android.R.style.Theme_Holo);
	m.mContext = context;
	m.mFactoryTest = factoryTest;
	//③创建一个ActivityStack实例,并保存到ActivityManagerService的成员变量mMainStack中
	m.mMainStack = new ActivityStack(m, context, true);
	//④向ServiceManager注册BatteryStatsService服务
	m.mBatteryStatsService.publish(context);
	//⑤向ServiceManager注册UsageStatsService服务
	m.mUsageStatsService.publish(context);
	
	synchronized (thr) {
		//取消AThread线程等待,进入消息循环状态
		thr.mReady = true;
		thr.notifyAll();
	}
	//⑥调用startRunning函数
	m.startRunning(null, null, null, null);
	
	return context;
}

 

①启动AThread线程

static class AThread extends Thread {
	ActivityManagerService mService;
	boolean mReady = false;

	public AThread() {
		super("ActivityManager");
	}

	public void run() {
		//创建消息循环对象
		Looper.prepare();
		android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
		android.os.Process.setCanSelfBackground(false);
		ActivityManagerService m = new ActivityManagerService();
		synchronized (this) {
			//创建ActivityManagerService实例
			mService = m;
			notifyAll();
		}
		//mReady = false,所以该线程处于等待
		synchronized (this) {
			while (!mReady) {
				try {
					wait();
				} catch (InterruptedException e) {
				}
			}
		}
		// For debug builds, log event loop stalls to dropbox for analysis.
		if (StrictMode.conditionallyEnableDebugLogging()) {
			Slog.i(TAG, "Enabled StrictMode logging for AThread's Looper");
		}
		//开启该线程的消息循环
		Looper.loop();
	}
}

②创建ActivityThread实例

public static final ActivityThread systemMain() {
	HardwareRenderer.disable(true);
	ActivityThread thread = new ActivityThread();
	thread.attach(true);
	return thread;
}
private void attach(boolean system) {
	//本地线程存储
	sThreadLocal.set(this);
	mSystemThread = system;//mSystemThread=true
	if (!system) {
		ViewRootImpl.addFirstDrawHandler(new Runnable() {
			public void run() {
				ensureJitEnabled();
			}
		});
		android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");
		RuntimeInit.setApplicationObject(mAppThread.asBinder());
		IActivityManager mgr = ActivityManagerNative.getDefault();
		try {
			mgr.attachApplication(mAppThread);
		} catch (RemoteException ex) {
			// Ignore
		}
	} else {
		// Don't set application object here -- if the system crashes,
		// we can't display an alert, we just want to die die die.
		android.ddm.DdmHandleAppName.setAppName("system_process");
		try {
			mInstrumentation = new Instrumentation();
			ContextImpl context = new ContextImpl();
			context.init(getSystemContext().mPackageInfo, null, this);
			//创建Application实例,并保存在成员变量mAllApplications中
			Application app = Instrumentation.newApplication(Application.class, context);
			mAllApplications.add(app);
			mInitialApplication = app;
			//调用应用程序的onCreate函数
			app.onCreate();
		} catch (Exception e) {
			throw new RuntimeException(
					"Unable to instantiate Application():" + e.toString(), e);
		}
	}
	
	ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {
		public void onConfigurationChanged(Configuration newConfig) {
			synchronized (mPackages) {
				// We need to apply this change to the resources
				// immediately, because upon returning the view
				// hierarchy will be informed about it.
				if (applyConfigurationToResourcesLocked(newConfig, null)) {
					// This actually changed the resources!  Tell
					// everyone about it.
					if (mPendingConfiguration == null ||
							mPendingConfiguration.isOtherSeqNewer(newConfig)) {
						mPendingConfiguration = newConfig;
						
						queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
					}
				}
			}
		}
		public void onLowMemory() {
		}
		public void onTrimMemory(int level) {
		}
	});
}

③创建一个ActivityStack实例

ActivityStack(ActivityManagerService service, Context context, boolean mainStack) {
	mService = service;
	mContext = context;
	mMainStack = mainStack;
	PowerManager pm =(PowerManager)context.getSystemService(Context.POWER_SERVICE);
	mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
	mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
	mLaunchingActivity.setReferenceCounted(false);
}

④注册BatteryStatsService服务

public void publish(Context context) {
	mContext = context;
	ServiceManager.addService("batteryinfo", asBinder());
	mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps());
	mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
			com.android.internal.R.integer.config_radioScanningTimeout)* 1000L);
}

⑤注册UsageStatsService服务

public void publish(Context context) {
        mContext = context;
        ServiceManager.addService(SERVICE_NAME, asBinder());
}

⑥调用startRunning函数startRunning(null, null, null, null)

public final void startRunning(String pkg, String cls, String action,String data) {
	synchronized(this) {
		//mStartRunning = false
		if (mStartRunning) {
			return;
		}
		mStartRunning = true;
		//mTopComponent=null
		mTopComponent = pkg != null && cls != null? new ComponentName(pkg, cls) : null;
		//mTopAction=Intent.ACTION_MAIN
		mTopAction = action != null ? action : Intent.ACTION_MAIN;
		//mTopData=null
		mTopData = data;
		if (!mSystemReady) {
			return;
		}
	}
	systemReady(null);
}
public void systemReady(final Runnable goingCallback) {
	//goingCallback = null
	synchronized(this) {
		//mSystemReady = false
		if (mSystemReady) {
			if (goingCallback != null) goingCallback.run();
			return;
		}
		
		// mDidUpdate = false
		if (!mDidUpdate) {
			if (mWaitingUpdate) {
				return;
			}
			Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
			List<ResolveInfo> ris = null;
			try {
				ris = AppGlobals.getPackageManager().queryIntentReceivers(intent, null, 0);
			} catch (RemoteException e) {
			}
			if (ris != null) {
				for (int i=ris.size()-1; i>=0; i--) {
					if ((ris.get(i).activityInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
						ris.remove(i);
					}
				}
				intent.addFlags(Intent.FLAG_RECEIVER_BOOT_UPGRADE);
				
				ArrayList<ComponentName> lastDoneReceivers = readLastDonePreBootReceivers();
				
				final ArrayList<ComponentName> doneReceivers = new ArrayList<ComponentName>();
				for (int i=0; i<ris.size(); i++) {
					ActivityInfo ai = ris.get(i).activityInfo;
					ComponentName comp = new ComponentName(ai.packageName, ai.name);
					if (lastDoneReceivers.contains(comp)) {
						ris.remove(i);
						i--;
					}
				}

				for (int i=0; i<ris.size(); i++) {
					ActivityInfo ai = ris.get(i).activityInfo;
					ComponentName comp = new ComponentName(ai.packageName, ai.name);
					doneReceivers.add(comp);
					intent.setComponent(comp);
					IIntentReceiver finisher = null;
					if (i == ris.size()-1) {
						finisher = new IIntentReceiver.Stub() {
							public void performReceive(Intent intent, int resultCode,
									String data, Bundle extras, boolean ordered,
									boolean sticky) {
								// The raw IIntentReceiver interface is called
								// with the AM lock held, so redispatch to
								// execute our code without the lock.
								mHandler.post(new Runnable() {
									public void run() {
										synchronized (ActivityManagerService.this) {
											mDidUpdate = true;
										}
										writeLastDonePreBootReceivers(doneReceivers);
										showBootMessage(mContext.getText(
												R.string.android_upgrading_complete),false);
										systemReady(goingCallback);
									}
								});
							}
						};
					}
					Slog.i(TAG, "Sending system update to: " + intent.getComponent());
					broadcastIntentLocked(null, null, intent, null, finisher,
							0, null, null, null, true, false, MY_PID, Process.SYSTEM_UID);
					if (finisher != null) {
						mWaitingUpdate = true;
					}
				}
			}
			if (mWaitingUpdate) {
				return;
			}
			mDidUpdate = true;
		}
		
		mSystemReady = true;
		if (!mStartRunning) {
			return;
		}
	}

	ArrayList<ProcessRecord> procsToKill = null;
	synchronized(mPidsSelfLocked) {
		for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
			ProcessRecord proc = mPidsSelfLocked.valueAt(i);
			if (!isAllowedWhileBooting(proc.info)){
				if (procsToKill == null) {
					procsToKill = new ArrayList<ProcessRecord>();
				}
				procsToKill.add(proc);
			}
		}
	}
	
	synchronized(this) {
		if (procsToKill != null) {
			for (int i=procsToKill.size()-1; i>=0; i--) {
				ProcessRecord proc = procsToKill.get(i);
				Slog.i(TAG, "Removing system update proc: " + proc);
				removeProcessLocked(proc, true, false, "system update done");
			}
		}
		
		// Now that we have cleaned up any update processes, we
		// are ready to start launching real processes and know that
		// we won't trample on them any more.
		mProcessesReady = true;
	}
	
	Slog.i(TAG, "System now ready");
	EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,SystemClock.uptimeMillis());

	synchronized(this) {
		// Make sure we have no pre-ready processes sitting around.
		
		if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
			ResolveInfo ri = mContext.getPackageManager().resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST),STOCK_PM_FLAGS);
			CharSequence errorMsg = null;
			if (ri != null) {
				ActivityInfo ai = ri.activityInfo;
				ApplicationInfo app = ai.applicationInfo;
				if ((app.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
					mTopAction = Intent.ACTION_FACTORY_TEST;
					mTopData = null;
					mTopComponent = new ComponentName(app.packageName,
							ai.name);
				} else {
					errorMsg = mContext.getResources().getText(com.android.internal.R.string.factorytest_not_system);
				}
			} else {
				errorMsg = mContext.getResources().getText(com.android.internal.R.string.factorytest_no_action);
			}
			if (errorMsg != null) {
				mTopAction = null;
				mTopData = null;
				mTopComponent = null;
				Message msg = Message.obtain();
				msg.what = SHOW_FACTORY_ERROR_MSG;
				msg.getData().putCharSequence("msg", errorMsg);
				mHandler.sendMessage(msg);
			}
		}
	}

	retrieveSettings();

	if (goingCallback != null) goingCallback.run();
	
	synchronized (this) {
		if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
			try {
				List apps = AppGlobals.getPackageManager().getPersistentApplications(STOCK_PM_FLAGS);
				if (apps != null) {
					int N = apps.size();
					int i;
					for (i=0; i<N; i++) {
						ApplicationInfo info= (ApplicationInfo)apps.get(i);
						if (info != null &&!info.packageName.equals("android")) {
							addAppLocked(info);
						}
					}
				}
			} catch (RemoteException ex) {
				// pm is in same process, this will never happen.
			}
		}

		// Start up initial activity.
		mBooting = true;
		
		try {
			if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
				Message msg = Message.obtain();
				msg.what = SHOW_UID_ERROR_MSG;
				mHandler.sendMessage(msg);
			}
		} catch (RemoteException e) {
		}

		mMainStack.resumeTopActivityLocked(null);
	}
}

第二:ActivityManagerService.setSystemProcess()

public static void setSystemProcess() {
	try {
		ActivityManagerService m = mSelf;
		
		ServiceManager.addService("activity", m);
		ServiceManager.addService("meminfo", new MemBinder(m));
		ServiceManager.addService("gfxinfo", new GraphicsBinder(m));
		if (MONITOR_CPU_USAGE) {
			ServiceManager.addService("cpuinfo", new CpuBinder(m));
		}
		ServiceManager.addService("permission", new PermissionController(m));
		//把应用程序框架层下面的android包加载进来
		ApplicationInfo info =mSelf.mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS);
		mSystemThread.installSystemApplicationInfo(info);
   
		synchronized (mSelf) {
			ProcessRecord app = mSelf.newProcessRecordLocked(
					mSystemThread.getApplicationThread(), info,info.processName);
			app.persistent = true;
			app.pid = MY_PID;
			app.maxAdj = ProcessList.SYSTEM_ADJ;
			mSelf.mProcessNames.put(app.processName, app.info.uid, app);
			synchronized (mSelf.mPidsSelfLocked) {
				mSelf.mPidsSelfLocked.put(app.pid, app);
			}
			mSelf.updateLruProcessLocked(app, true, true);
		}
	} catch (PackageManager.NameNotFoundException e) {
		throw new RuntimeException(
				"Unable to find android system package", e);
	}
}

第三:ActivityManagerService.installSystemProviders()

public static final void installSystemProviders() {
        List<ProviderInfo> providers;
        synchronized (mSelf) {
            ProcessRecord app = mSelf.mProcessNames.get("system", Process.SYSTEM_UID);
            providers = mSelf.generateApplicationProvidersLocked(app);
            if (providers != null) {
                for (int i=providers.size()-1; i>=0; i--) {
                    ProviderInfo pi = (ProviderInfo)providers.get(i);
                    if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
                        Slog.w(TAG, "Not installing system proc provider " + pi.name
                                + ": not system .apk");
                        providers.remove(i);
                    }
                }
            }
        }
        if (providers != null) {
            mSystemThread.installSystemProviders(providers);
        }

        mSelf.mCoreSettingsObserver = new CoreSettingsObserver(mSelf);

        mSelf.mUsageStatsService.monitorPackages();
    }

第三:ActivityManagerService.systemReady()

 

抱歉!评论已关闭.