真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android類,android類加載機(jī)制

Android開發(fā)的分類有哪些?

1、Android客戶端應(yīng)用程序

河間網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)從2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

如新浪微博、網(wǎng)銀客戶端、凡客、淘寶客戶端,快盤客戶端。Android在這里的應(yīng)用還是界面層的東西為主。核心還在WEB。客戶端界面很重要,用戶體驗度很重要。從應(yīng)用需求上來講,幾乎大一點的網(wǎng)站,都需要有手機(jī)客戶端程序。

2、Android通用類程序

如基于LBS(基于位置的服務(wù))的應(yīng)用(這類一般會嵌入到客戶端應(yīng)用程序中),流媒體播放應(yīng)用。由于移動設(shè)備的方便便捷、3G、4G網(wǎng)絡(luò)的發(fā)展,這類應(yīng)用有不錯的前景。

3、Android游戲開發(fā)

需要掌握的游戲引擎LGame,游戲框架等。手機(jī)上的游戲會是一大塊內(nèi)容,有前途。

4、Android底層開發(fā)

需要掌握C、Linux等較底層的東西,發(fā)展方向應(yīng)該是驅(qū)動、協(xié)議開發(fā),嵌入式開發(fā)。

Android-類加載

雙親委托機(jī)制

類在進(jìn)行類加載的時候,把加載任務(wù)托管給父類加載器,如能加載成功,則返回,否則依次向子類加載器遞歸嘗試類加載。

意義:

①避免類的重復(fù)加載,父類加載已加載該類時,子ClassLoader就沒有必要加載一次了。

②安全性,防止核心API被隨意篡改。

ClassLoader

ClassLoader本身是一個抽象方法。它的主要實現(xiàn)類有BootClassLoader、PathClassLoader、DexClassLoader.

BootClassLoader:用于加載Android Framwork層(SDK)的class文件

PathClassLoader:用于Android應(yīng)用程序加載器,可以加載指定的dex和jar、zip、apk中的classes.dex(系統(tǒng)使用)

DexClassLoader:用于加載指定的dex和jar、zip、apk中的classes.dex。(供開發(fā)者使用)

拓展:

在API26之前。

optimizedDirectory 參數(shù)就是dexopt的產(chǎn)出目錄(odex)。那 PathClassLoader 創(chuàng)建時,這個目錄為null,就

意味著不進(jìn)行dexopt?并不是, optimizedDirectory 為null時的默認(rèn)路徑為:/data/dalvik-cache。

在API26之后DexClassLoader也取消了optimizedDirectory

熱修復(fù)相關(guān)

LoadClass:

findClass:PathClassLoader和DexClassLoader的父類BaseDexClassLoader中實現(xiàn)findClass。

BaseDexClassLoader中

PathClassLoader加載過后,pathlist 中存在一個Element數(shù)組,Element類中存在一個dexFile成員表示dex文件,即:APK中有X個dex,則Element數(shù)組就有X個元素。

總結(jié):

可能看到這里我們比較亂了,理一下。一個類的加載經(jīng)歷了哪些。我們以PathClassLoader為例。

①加載一個類的時候,首先通過Class緩存尋找是否已經(jīng)加載過該類。參考抽象類的loadClass方法。

②若在緩存中未找到該類,則交由父加載器加載該類。參考抽象類的loadClass方法。

③調(diào)用父加載器PathClassLoader的父類BaseDexClassLoader實現(xiàn)的findClass方法加載該類。

④PathClassLoader在初始化的時候調(diào)用父構(gòu)造方法實例化DexPathList屬性,DexPathList屬性初始化時構(gòu)造方法內(nèi)通過makePathElements(或makeDexElements?不同API可能不同)加載APK內(nèi)的dex文件生成Element數(shù)組。

⑤BaseDexClassLoader實現(xiàn)的findClass方法中順序循環(huán)已存在的Element數(shù)組,通過Element中的DexFile加載類。。

⑥未找到,拋出類未找到異常。

熱修復(fù)(multide?形式(thinker、qfix))

熱修復(fù)的原理。我們只需在應(yīng)用啟動的時候,一般是在application方法中(因為class加載首先從緩存中加載),在應(yīng)用啟動后,經(jīng)過PathClassLoader加載過后所有的類都在 pathList的Element 數(shù)組,把生成的Elment數(shù)組插入到PathList的Element數(shù)組的最前方。在加載類的時候就只會加載到我們需要更新的類了,因為是順序?qū)ふ?,找到就返回?先從我們補(bǔ)丁的dex文件生成的element尋找,找不到再從APK的dex生成的element種尋找)。

熱修復(fù)基本思路總結(jié):

①獲取到當(dāng)前引用的PathClassLoader

②反射獲取其中DexPathList屬性:DexPathList pathList.

③獲取到補(bǔ)丁包path.dex文件的Element[]數(shù)組 pElements。參考PathClassLoader怎么把dex文件轉(zhuǎn)換為Element數(shù)組的。于是我們反射執(zhí)行DexPathList?中的makePathElements方法(視API而定)傳入dex路徑得到補(bǔ)丁包的element數(shù)組。

④獲取pathList的dexElements數(shù)組。

⑤把補(bǔ)丁包的pElements數(shù)組合并到pathList的dexElements數(shù)組的前方,即newElements=pElements+dexElements

⑥反射賦值把newElements替換掉pathList的dexElements

熱修復(fù)沒這么簡單,還需考慮混淆,API版本不同導(dǎo)致的使用makePathElements方法或makeDexElements方法等因素。

熱修復(fù)(InstantRun?形式(Robust))待了解。

【Android】Android中的類加載

前文: 【Java】ClassLoader與雙親委派機(jī)制

Android中的類加載器有三種, DexClassLoader 、 PathClassLoader 、 BootClassLoader 。

其中 BootClassLoader 是系統(tǒng)啟動時預(yù)加載常用類的,一般使用不到。 DexClassLoader 、 PathClassLoader 都是繼承自 BaseDexClassLoader 。

但 DexClassLoader 和 PathClassLoader 并沒有重寫 BaseDexClassLoader 中的任何方法,所以源碼只需要看 BaseDexClassLoader 即可。

由于Android SDK并沒有包含 BaseDexClassLoader ,所以需要到源碼查詢網(wǎng)站查詢源碼,如下:

復(fù)制這個java文件到對應(yīng)源碼文件夾下就可以在Android Studio中查看了。

通過調(diào)試可以看到,Android中普通類的加載器其實是 PathClassLoader 。追蹤 PathClassLoader.findClass 方法,即可獲取Android的類加載過程:

PathClassLoader.findClass -- 繼承自 -- BaseDexClassLoader.findClass()

- BaseDexClassLoader.pathList.findClass()

- DexPathList.dexElements.foreach { element.findClass() }

- Element.findClass()

- Element.dexFile.loadClassBinaryName()

- DexFile.defineClass()

即類加載過程通過 BaseDexClassLoader.findClass 、 DexPathList.findClass 、 Element.findClass 、 DexFile.loadClassBinaryName ,最終會落到 DexFile.defineClass 方法中,然后就交給native層了。

其中需要注意的是,在 BaseDexClassLoader.findClass 的開頭有這么一段:

這段是在Android 10新加入的,據(jù)稱是為了實現(xiàn) shared library 功能的,在之前的版本中沒有這一段。

在上一節(jié)中知道了,類加載的流程如下:

BaseDexClassLoader.findClass() -

BaseDexClassLoader.pathList.findClass() -

DexPathList.dexElements.foreach { element.findClass() } -

Element.findClass() - ...

看 DexPathList.findClass 方法:

可以發(fā)現(xiàn), DexPathList 加載類的方法是遍歷 dexElements 數(shù)組依次加載,知道獲取到值為止。所以可以通過修改這個數(shù)組,把新的dex文件放在數(shù)組的前面,使其加載修改后的類,從而實現(xiàn)熱修復(fù)。

根據(jù)以上原理,寫下這個工具類,有效性待驗證:


網(wǎng)頁題目:android類,android類加載機(jī)制
文章出自:http://weahome.cn/article/dsgigsg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部