具體流程大概是這樣的:
1.需要加載某個類時柄错,先檢查自定義類加載器是否加載過埃碱,如果已經(jīng)加載過嚎尤,則直接返回荔仁。
2.如果自定義類加載器沒有加載過,則檢查應用程序類加載器是否加載過芽死,如果已經(jīng)加載過乏梁,則直接返回。
3.如果應用程序類加載器沒有加載過关贵,則檢查擴展類加載器是否加載過遇骑,如果已經(jīng)加載過,則直接返回揖曾。
4.如果擴展類加載器沒有加載過落萎,則檢查啟動類加載器是否加載過,如果已經(jīng)加載過炭剪,則直接返回练链。
5.如果啟動類加載器沒有加載過,則判斷當前類加載器能否加載這個類奴拦,如果能加載媒鼓,則加載該類,然后返回粱坤。
6.如果啟動類加載器不能加載該類隶糕,則交給擴展類加載器瓷产。擴展類加載器判斷能否加載這個類站玄,如果能加載,則加載該類濒旦,然后返回株旷。
7.如果擴展類加載器不能加載該類,則交給應用程序類加載器尔邓。應用程序類加載器判斷能否加載這個類晾剖,如果能加載,則加載該類梯嗽,然后返回齿尽。
8.如果應用程序類加載器不能加載該類,則交給自定義類加載器灯节。自定義類加載器判斷能否加載這個類循头,如果能加載绵估,則加載該類,然后返回卡骂。
9.如果自定義類加載器国裳,也無法加載這個類,則直接拋ClassNotFoundException異常全跨。
這樣做的好處是:
1.保證類不會重復加載缝左。加載類的過程中,會向上問一下是否加載過浓若,如果已經(jīng)加載了渺杉,則不會再加載,這樣可以保證一個類只會被加載一次七嫌。
2.保證類的安全性少办。核心的類已經(jīng)被啟動類加載器加載了,后面即使有人篡改了該類诵原,也不會再加載了英妓,防止了一些有危害的代碼的植入。
線程池執(zhí)行流程:
1.線程池初始化的時候里面是沒有線程的绍赛,工作隊列是以參數(shù)的形式傳進來的,而且就算工作隊列里面有任務也不會馬上去執(zhí)行
2.當調(diào)用execute() 方法添加任務時會做如下判斷
如果當前線程數(shù)小于核心線程數(shù)吗蚌,則新建線程執(zhí)行任務
如果當前線程數(shù)大于核心線程數(shù),則將任務加入工作隊列
如果工作隊列滿了蚯妇,且當前線程數(shù)小于最大線程數(shù)敷燎,則新建線程執(zhí)行任務
如果工作隊列滿了,且當前線程數(shù)大于最大線程數(shù)箩言,則執(zhí)行拒絕策略
3.當一個線程完成任務時硬贯,會從工作隊列中取一個任務來執(zhí)行
4.當一個線程空閑時,會先判斷當前線程數(shù)大于是否大于核心線程數(shù)陨收,如果當前線程數(shù)大于核心線程數(shù)饭豹,那么此線程會在存活一定時間(keepAliveTime)后銷毀,最后線程池中的線程數(shù)會保持在corePoolSize的大小
通過AAPT工具進行資源文件(包括AndroidManifest.xml务漩、布局文件拄衰、各種xml資源等)的打包,生成R.java文件饵骨。
通過AIDL工具處理AIDL文件翘悉,生成相應的Java文件。
通過Javac工具編譯項目源碼居触,生成Class文件妖混。
通過DEX工具將所有的Class文件轉(zhuǎn)換成DEX文件包吝,該過程主要完成Java字節(jié)碼轉(zhuǎn)換成Dalvik字節(jié)碼,壓縮常量池以及清除冗余信息等工作源葫。
通過ApkBuilder工具將資源文件诗越、DEX文件打包生成APK文件。
利用KeyStore對生成的APK文件進行簽名息堂。
如果是正式版的APK嚷狞,還會利用ZipAlign工具進行對齊處理,對齊的過程就是將APK文件中所有的資源文件舉例文件的起始距離都偏移4字節(jié)的整數(shù)倍荣堰,這樣通過內(nèi)存映射訪問APK文件 的速度會更快床未。