EP3-Android源碼的食用方法

Android源碼的食用方法

0x00 Prelude

有時(shí)候感覺發(fā)自內(nèi)心地喜歡Android侈贷。不僅是因?yàn)槲覀兛梢詣?chuàng)造「小而美」的應(yīng)用程序蓝厌,還因?yàn)镚oogle提供了很好的售后服務(wù)。

前兩天了解了一些關(guān)于ClassLoader的東西宙彪,我想真正的學(xué)習(xí)模式應(yīng)該是在用到的時(shí)候再去查找憔披,比如公司需要真正開發(fā)一套插件框架等限,我再去學(xué)習(xí),這樣的動(dòng)機(jī)下可能動(dòng)力會(huì)更足》蚁ィ現(xiàn)在是處于學(xué)習(xí)階段望门,雖然不知道看了有什么用,但還是去看吧锰霜。

Android源碼很龐大筹误,要完整看完是不太可能,我想起高中數(shù)學(xué)老師常常教育我們的一句話:「不要想著一口吃成個(gè)胖子癣缅〕簦」所以可以慢慢來。好在我們可以站在巨人的肩膀上友存,已經(jīng)有很多人寫了源碼的閱讀筆記祷膳,比如羅升陽的博客和書。

0x01 怎么找到具體的類

ClassLoader.java可以在Android Studio的android.jar中看到屡立,只要按住CMD點(diǎn)擊左鍵就可以跳轉(zhuǎn)了直晨,這是因?yàn)锳ndroid Studio下載sdk的時(shí)候attach了源碼到android.jar上。但是DexClassLoade.java的源碼打開的時(shí)候侠驯,看到的就是反編譯出來的代碼了抡秆;
這是因?yàn)閍ndroid.jar只會(huì)attach到一些常用的源碼,DexClassLoader.java這個(gè)類吟策,是在Dalvik目錄下的儒士,也許不是很常用,所以我們看到的是反編譯出來的源碼檩坚。反編譯出來的源碼沒有注釋着撩,可讀性也差很多诅福。比如,我們看到的是這樣的:

public BaseDexClassLoader(String dexPath, File optimizedDirectory, String libraryPath, ClassLoader parent) {
       throw new RuntimeException("Stub!");
    }

這個(gè)的意思是拖叙,函數(shù)具體的實(shí)現(xiàn)都放在ROM中了氓润,不在這里暴露。

我們可以去谷歌AOSP的網(wǎng)站上去看源碼薯鳍。比如android.jar咖气,它的內(nèi)容基本都在https://android.googlesource.com/platform/frameworks/base/+/android-6.0.1_r21/core/java/android/這個(gè)路徑下。但是內(nèi)容太多挖滤,找了一段時(shí)間也沒找到BaseDexClassLoader.java的位置崩溪,怎么辦?

這時(shí)候可以借助Google斩松,直接搜索:
where is BaseDexClassLoader.java,可以看到伶唯,貼心的Google第一條給出了API的地址,第二條給出了BaseDexClassLoader在AOSP中的地址惧盹。

.

0x02 插件的加載

插件裝載的執(zhí)行順序是:

BaseDexClassLoader--->pathList.findClass(name)--->loadClassBinaryName()乳幸,最終指向了一個(gè)native方法loadClassBinaryName()。

    /**
     * Finds the named class in one of the dex files pointed at by
     * this instance. This will find the one in the earliest listed
     * path element. If the class is found but has not yet been
     * defined, then this method will define it in the defining
     * context that this instance was constructed with.
     *
     * @return the named class or {@code null} if the class is not
     * found in any of the dex files
     */
    public Class findClass(String name) {
        for (Element element : dexElements) {
            DexFile dex = element.dexFile;
            if (dex != null) {
                Class clazz = dex.loadClassBinaryName(name, definingContext);
                if (clazz != null) {
                    return clazz;
                }
            }
        }
        return null;
    }

好了钧椰,明天我們看看Robile中的Plugin為什么重寫了loadClass()方法粹断。

-NOV23

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嫡霞,隨后出現(xiàn)的幾起案子姿染,更是在濱河造成了極大的恐慌,老刑警劉巖秒际,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狡汉,居然都是意外死亡娄徊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門盾戴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寄锐,“玉大人,你說我怎么就攤上這事尖啡¢掀停” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵衅斩,是天一觀的道長盆顾。 經(jīng)常有香客問我,道長畏梆,這世上最難降的妖魔是什么您宪? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任奈懒,我火速辦了婚禮,結(jié)果婚禮上宪巨,老公的妹妹穿的比我還像新娘磷杏。我一直安慰自己,他們只是感情好捏卓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布极祸。 她就那樣靜靜地躺著,像睡著了一般怠晴。 火紅的嫁衣襯著肌膚如雪遥金。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天龄寞,我揣著相機(jī)與錄音汰规,去河邊找鬼。 笑死物邑,一個(gè)胖子當(dāng)著我的面吹牛溜哮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播色解,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼茂嗓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了科阎?” 一聲冷哼從身側(cè)響起述吸,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锣笨,沒想到半個(gè)月后蝌矛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡错英,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年入撒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭岩。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茅逮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出判哥,到底是詐尸還是另有隱情献雅,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布塌计,位于F島的核電站挺身,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锌仅。R本人自食惡果不足惜瞒渠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一良蒸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伍玖,春花似錦嫩痰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椰棘,卻和暖如春纺棺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邪狞。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工祷蝌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帆卓。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓巨朦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剑令。 傳聞我的和親對象是個(gè)殘疾皇子糊啡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評論 25 707
  • 今天老師沒有將什么新的內(nèi)容,但是把昨天的內(nèi)容復(fù)習(xí)了一遍吁津。我把昨天不會(huì)的請教了老師棚蓄,老師給我們詳細(xì)的講解,可...
    宋肖鵬閱讀 88評論 0 0
  • 為什么要做競品分析碍脏? 我們經(jīng)常能聽到設(shè)計(jì)師與產(chǎn)品經(jīng)理爭論梭依,“這個(gè)功能為什么這么設(shè)計(jì)···”,“這個(gè)功能為什么不這么...
    鈷藍(lán)閱讀 4,598評論 0 12
  • 超級行動(dòng)課第一次作業(yè) 想了很久才想到這一些技能典尾,全都是在學(xué)習(xí)中睛挚,還沒有達(dá)到可以使用的地步。
    腹黑的小屁孩閱讀 173評論 0 0