



具體流程大概是這樣的:
1.需要加載某個(gè)類(lèi)時(shí),先檢查自定義類(lèi)加載器是否加載過(guò),如果已經(jīng)加載過(guò),則直接返回。
2.如果自定義類(lèi)加載器沒(méi)有加載過(guò),則檢查應(yīng)用程序類(lèi)加載器是否加載過(guò),如果已經(jīng)加載過(guò),則直接返回。
3.如果應(yīng)用程序類(lèi)加載器沒(méi)有加載過(guò),則檢查擴(kuò)展類(lèi)加載器是否加載過(guò),如果已經(jīng)加載過(guò),則直接返回。
4.如果擴(kuò)展類(lèi)加載器沒(méi)有加載過(guò),則檢查啟動(dòng)類(lèi)加載器是否加載過(guò),如果已經(jīng)加載過(guò),則直接返回。
5.如果啟動(dòng)類(lèi)加載器沒(méi)有加載過(guò),則判斷當(dāng)前類(lèi)加載器能否加載這個(gè)類(lèi),如果能加載,則加載該類(lèi),然后返回。
6.如果啟動(dòng)類(lèi)加載器不能加載該類(lèi),則交給擴(kuò)展類(lèi)加載器。擴(kuò)展類(lèi)加載器判斷能否加載這個(gè)類(lèi),如果能加載,則加載該類(lèi),然后返回。
7.如果擴(kuò)展類(lèi)加載器不能加載該類(lèi),則交給應(yīng)用程序類(lèi)加載器。應(yīng)用程序類(lèi)加載器判斷能否加載這個(gè)類(lèi),如果能加載,則加載該類(lèi),然后返回。
8.如果應(yīng)用程序類(lèi)加載器不能加載該類(lèi),則交給自定義類(lèi)加載器。自定義類(lèi)加載器判斷能否加載這個(gè)類(lèi),如果能加載,則加載該類(lèi),然后返回。
9.如果自定義類(lèi)加載器,也無(wú)法加載這個(gè)類(lèi),則直接拋ClassNotFoundException異常。
這樣做的好處是:
1.保證類(lèi)不會(huì)重復(fù)加載。加載類(lèi)的過(guò)程中,會(huì)向上問(wèn)一下是否加載過(guò),如果已經(jīng)加載了,則不會(huì)再加載,這樣可以保證一個(gè)類(lèi)只會(huì)被加載一次。
2.保證類(lèi)的安全性。核心的類(lèi)已經(jīng)被啟動(dòng)類(lèi)加載器加載了,后面即使有人篡改了該類(lèi),也不會(huì)再加載了,防止了一些有危害的代碼的植入。

線程池執(zhí)行流程:
1.線程池初始化的時(shí)候里面是沒(méi)有線程的,工作隊(duì)列是以參數(shù)的形式傳進(jìn)來(lái)的,而且就算工作隊(duì)列里面有任務(wù)也不會(huì)馬上去執(zhí)行
2.當(dāng)調(diào)用execute() 方法添加任務(wù)時(shí)會(huì)做如下判斷
如果當(dāng)前線程數(shù)小于核心線程數(shù),則新建線程執(zhí)行任務(wù)
如果當(dāng)前線程數(shù)大于核心線程數(shù),則將任務(wù)加入工作隊(duì)列
如果工作隊(duì)列滿(mǎn)了,且當(dāng)前線程數(shù)小于最大線程數(shù),則新建線程執(zhí)行任務(wù)
如果工作隊(duì)列滿(mǎn)了,且當(dāng)前線程數(shù)大于最大線程數(shù),則執(zhí)行拒絕策略
3.當(dāng)一個(gè)線程完成任務(wù)時(shí),會(huì)從工作隊(duì)列中取一個(gè)任務(wù)來(lái)執(zhí)行
4.當(dāng)一個(gè)線程空閑時(shí),會(huì)先判斷當(dāng)前線程數(shù)大于是否大于核心線程數(shù),如果當(dāng)前線程數(shù)大于核心線程數(shù),那么此線程會(huì)在存活一定時(shí)間(keepAliveTime)后銷(xiāo)毀,最后線程池中的線程數(shù)會(huì)保持在corePoolSize的大小


通過(guò)AAPT工具進(jìn)行資源文件(包括AndroidManifest.xml、布局文件、各種xml資源等)的打包,生成R.java文件。
通過(guò)AIDL工具處理AIDL文件,生成相應(yīng)的Java文件。
通過(guò)Javac工具編譯項(xiàng)目源碼,生成Class文件。
通過(guò)DEX工具將所有的Class文件轉(zhuǎn)換成DEX文件,該過(guò)程主要完成Java字節(jié)碼轉(zhuǎn)換成Dalvik字節(jié)碼,壓縮常量池以及清除冗余信息等工作。
通過(guò)ApkBuilder工具將資源文件、DEX文件打包生成APK文件。
利用KeyStore對(duì)生成的APK文件進(jìn)行簽名。
如果是正式版的APK,還會(huì)利用ZipAlign工具進(jìn)行對(duì)齊處理,對(duì)齊的過(guò)程就是將APK文件中所有的資源文件舉例文件的起始距離都偏移4字節(jié)的整數(shù)倍,這樣通過(guò)內(nèi)存映射訪問(wèn)APK文件 的速度會(huì)更快。



