Android系統(tǒng)啟動(dòng)流程
當(dāng)系統(tǒng)引導(dǎo)程序啟動(dòng)Linux內(nèi)核,內(nèi)核會(huì)記載各種數(shù)據(jù)結(jié)構(gòu),和驅(qū)動(dòng)程序,加載完畢之后,Android系統(tǒng)開(kāi)始啟動(dòng)并加載第一個(gè)用戶級(jí)別的進(jìn)程:init(system/core/init/Init.c)
-
查看Init.c代碼,看main函數(shù)
int main(int argc, char **argv) { ... //執(zhí)行Linux指令 mkdir("/dev", 0755); mkdir("/proc", 0755); mkdir("/sys", 0755); ... //解析執(zhí)行init.rc配置文件 init_parse_config_file("/init.rc"); ... } -
在init.rc中定義好的指令都會(huì)開(kāi)始執(zhí)行,其中執(zhí)行了很多bin指令,啟動(dòng)系統(tǒng)服務(wù)
//啟動(dòng)孵化器進(jìn)程,此進(jìn)程是Android系統(tǒng)啟動(dòng)關(guān)鍵服務(wù)的一個(gè)母進(jìn)程 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd -
在app_process文件夾下找到app_main.cpp,查看main函數(shù),發(fā)現(xiàn)以下代碼
int main(int argc, const char* const argv[]) { ... //啟動(dòng)一個(gè)系統(tǒng)服務(wù):ZygoteInit runtime.start("com.android.internal.os.ZygoteInit",startSystemServer); ... } -
在ZygoteInit.java中,查看main方法
public static void main(String argv[]) { ... //加載Android系統(tǒng)需要的類(lèi) preloadClasses(); ... if (argv[1].equals("true")) { //調(diào)用方法啟動(dòng)一個(gè)系統(tǒng)服務(wù) startSystemServer(); } ... } -
startSystemServer()方法的方法體
String args[] = { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003", "--capabilities=130104352,130104352", "--runtime-init", "--nice-name=system_server", "com.android.server.SystemServer", }; ... //分叉啟動(dòng)上面字符串?dāng)?shù)組定義的服務(wù) pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); -
SystemServer服務(wù)被啟動(dòng)
public static void main(String[] args) { ... //加載動(dòng)態(tài)鏈接庫(kù) System.loadLibrary("android_servers"); //執(zhí)行鏈接庫(kù)里的init1方法 init1(args); ... } 動(dòng)態(tài)鏈接庫(kù)文件和java類(lèi)包名相同,找到com_android_server_SystemServer.cpp文件
-
在com_android_server_SystemServer.cpp文件中,找到了
static JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ //給init1方法映射一個(gè)指針,調(diào)用system_init方法 { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 }, }; android_server_SystemServer_init1方法體中調(diào)用了system_init,system_init沒(méi)有方法體
在system_init.cpp文件中找到system_init方法,方法體中
//執(zhí)行了SystemServer.java的init2方法
runtime->callStatic("com/android/server/SystemServer", "init2");-
回到SystemServer.java,在init2的方法體中
//啟動(dòng)一個(gè)服務(wù)線程 Thread thr = new ServerThread(); thr.start(); -
在ServerThread的run方法中
//準(zhǔn)備消息輪詢器 Looper.prepare(); ... //啟動(dòng)大量的系統(tǒng)服務(wù)并把其逐一添加至ServiceManager ServiceManager.addService(Context.WINDOW_SERVICE, wm); ... //調(diào)用systemReady,準(zhǔn)備創(chuàng)建第一個(gè)activity ((ActivityManagerService)ActivityManagerNative.getDefault()) .systemReady(new Runnable(){ ... }); -
在ActivityManagerService.java中,有systemReady方法,方法體里找到
//檢測(cè)任務(wù)棧中有沒(méi)有activity,如果沒(méi)有,創(chuàng)建Launcher mMainStack.resumeTopActivityLocked(null); -
在ActivityStack.java中,方法resumeTopActivityLocked
// Find the first activity that is not finishing. ActivityRecord next = topRunningActivityLocked(null); ... if (next == null) { // There are no more activities! Let's just start up the // Launcher... if (mMainStack) { return mService.startHomeActivityLocked(); } } ...
Handler消息機(jī)制
-
Message類(lèi)的obtain方法
消息隊(duì)列順序的維護(hù)是使用單鏈表的形式來(lái)維護(hù)的
-
把消息池里的第一條數(shù)據(jù)取出來(lái),然后把第二條變成第一條
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
sPoolSize--;
return m;
}
-
創(chuàng)建Handler對(duì)象時(shí),在構(gòu)造方法中會(huì)獲取Looper和MessageQueue的對(duì)象
public Handler() { ... //拿到looper mLooper = Looper.myLooper(); ... //拿到消息隊(duì)列 mQueue = mLooper.mQueue; mCallback = null; } -
查看myLooper方法體,發(fā)現(xiàn)Looper對(duì)象是通過(guò)ThreadLocal得到的,在查找ThreadLocal的set方法時(shí)發(fā)現(xiàn)
-
Looper是直接new出來(lái)的,并且在Looper的構(gòu)造方法中,new出了消息隊(duì)列對(duì)象
sThreadLocal.set(new Looper()); private Looper() { mQueue = new MessageQueue(); mRun = true; mThread = Thread.currentThread(); } sThreadLocal.set(new Looper())是在Looper.prepare方法中調(diào)用的
-
-
prepare方法是在prepareMainLooper()方法中調(diào)用的
public static final void prepareMainLooper() { prepare(); ... } -
在應(yīng)用啟動(dòng)時(shí),主線程要被啟動(dòng),ActivityThread會(huì)被創(chuàng)建,在此類(lèi)的main方法中
public static final void main(String[] args) { ... //創(chuàng)建Looper和MessageQueue Looper.prepareMainLooper(); ... //輪詢器開(kāi)始輪詢 Looper.loop(); ... } -
Looper.loop()方法中有一個(gè)死循環(huán)
while (true) { //取出消息隊(duì)列的消息,可能會(huì)阻塞 Message msg = queue.next(); // might block ... //解析消息,分發(fā)消息 msg.target.dispatchMessage(msg); ... } Linux的一個(gè)進(jìn)程間通信機(jī)制:管道(pipe)。原理:在內(nèi)存中有一個(gè)特殊的文件,這個(gè)文件有兩個(gè)句柄(引用),一個(gè)是讀取句柄,一個(gè)是寫(xiě)入句柄
主線程Looper從消息隊(duì)列讀取消息,當(dāng)讀完所有消息時(shí),進(jìn)入睡眠,主線程阻塞。子線程往消息隊(duì)列發(fā)送消息,并且往管道文件寫(xiě)數(shù)據(jù),主線程即被喚醒,從管道文件讀取數(shù)據(jù),主線程被喚醒只是為了讀取消息,當(dāng)消息讀取完畢,再次睡眠
-
Handler發(fā)送消息,sendMessage的所有重載,實(shí)際最終都調(diào)用了sendMessageAtTime
public boolean sendMessageAtTime(Message msg, long uptimeMillis) { ... //把消息放到消息隊(duì)列中 sent = queue.enqueueMessage(msg, uptimeMillis); ... } -
enqueueMessage把消息通過(guò)重新排序放入消息隊(duì)列
final boolean enqueueMessage(Message msg, long when) { ... final boolean needWake; synchronized (this) { ... //對(duì)消息的重新排序,通過(guò)判斷消息隊(duì)列里是否有消息以及消息的時(shí)間對(duì)比 msg.when = when; Message p = mMessages; //把放入消息隊(duì)列的消息置為消息隊(duì)列第一條消息 if (p == null || when == 0 || when < p.when) { msg.next = p; mMessages = msg; needWake = mBlocked; // new head, might need to wake up } else { //判斷時(shí)間順序,為剛放進(jìn)來(lái)的消息尋找合適的位置 Message prev = null; while (p != null && p.when <= when) { prev = p; p = p.next; } msg.next = prev.next; prev.next = msg; needWake = false; // still waiting on head, no need to wake up } } //喚醒主線程 if (needWake) { nativeWake(mPtr); } return true; } -
Looper.loop方法中,獲取消息,然后分發(fā)消息
//獲取消息隊(duì)列的消息 Message msg = queue.next(); // might block ... //分發(fā)消息,消息由哪個(gè)handler對(duì)象創(chuàng)建,則由它分發(fā),并由它的handlerMessage處理 msg.target.dispatchMessage(msg); message對(duì)象的target屬性,用于記錄該消息由哪個(gè)Handler創(chuàng)建,在obtain方法中賦值
AsyncTask機(jī)制
-
AsyncTask必需會(huì)用到的三個(gè)方法
- onPreExeCute
- doInBackground
- onPostExecute
-
AsyncTask的execute方法,開(kāi)始執(zhí)行異步任務(wù),在此方法體中
public final AsyncTask<Params, Progress, Result> execute(Params... params) { ... mStatus = Status.RUNNING; //調(diào)用onPreExecute方法 onPreExecute(); //把參數(shù)賦值給mWorker對(duì)象 mWorker.mParams = params; //線程池對(duì)象執(zhí)行mFuture sExecutor.execute(mFuture); return this; } -
mWorker是什么類(lèi)型?,在AsyncTask的構(gòu)造方法中
mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); return doInBackground(mParams); } }; -
然后把mWorker對(duì)象封裝至FutureTask對(duì)象
mFuture = new FutureTask<Result>(mWorker) -
在FutureTask的構(gòu)造中,又把mWorker封裝給Sync對(duì)象
public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); sync = new Sync(callable); } -
在Sync的構(gòu)造方法中
Sync(Callable<V> callable) { //這里的callable就是mWorker this.callable = callable; } -
線程池執(zhí)行mFuture對(duì)象,此對(duì)象是FutureTask的對(duì)象,而FutureTask實(shí)現(xiàn)了Runnable接口
public final AsyncTask<Params, Progress, Result> execute(Params... params) { ... //線程池對(duì)象執(zhí)行mFuture sExecutor.execute(mFuture); ...}
-
mFuture的run方法被調(diào)用了
public void run() { sync.innerRun(); } -
在innerRun方法中,調(diào)用了callable的call方法,但是在sync被new出來(lái)的時(shí)候,在構(gòu)造方法中就已經(jīng)把mWorker賦值給了callable,所以實(shí)際上是調(diào)用mWorker的call方法
void innerRun() { ... //調(diào)用mWorker的call() result = callable.call(); set(result); ... } -
mWorker的call在mWorker被new出來(lái)時(shí)就已經(jīng)重寫(xiě)了
mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { ... //在子線程中調(diào)用了doInBackground方法 return doInBackground(mParams); } }; -
call方法調(diào)用完畢后,得到doInBackground所返回的result
void innerRun() { ... result = callable.call(); //返回的result傳入了set方法 set(result); ... } -
set方法體
protected void set(V v) { sync.innerSet(v); } -
innerSet方法體
if (compareAndSetState(s, RAN)) { result = v; releaseShared(0); //關(guān)鍵的done方法 done(); return; } -
innerSet方法是屬于FutureTask類(lèi)的,那么done方法也是調(diào)用FutureTask類(lèi)的,這個(gè)done方法定義的地方,在AsyncTask.java的構(gòu)造方法里
mFuture = new FutureTask<Result>(mWorker) { //此處重寫(xiě)done方法 @Override protected void done() { //獲取doInbackground方法返回的結(jié)果 result = get(); //創(chuàng)建一個(gè)消息 message = sHandler.obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(AsyncTask.this, result)); //把這條消息發(fā)送給創(chuàng)建這個(gè)消息的Handler:target.sendMessage(this) message.sendToTarget(); } }; -
然后sHandler的handlerMessage被觸發(fā)
public void handleMessage(Message msg) { AsyncTaskResult result = (AsyncTaskResult) msg.obj; switch (msg.what) { case MESSAGE_POST_RESULT: //調(diào)用finish方法 result.mTask.finish(result.mData[0]); break; } } -
finish的方法體
private void finish(Result result) { if (isCancelled()) result = null; //調(diào)用onPostExecute方法,并傳入結(jié)果 onPostExecute(result); mStatus = Status.FINISHED; }